TTL(time to live)生存时间字段设置了 IP 数据报能够经过的最大的路由器 数,TTL 字段是由发送端初始设置的,每个处理该数据报的路由器都需要将其 TTL 值减 1,当路由器收到一个 TTL 值为 0 的数据报时,路由器会将其丢弃。
TTL 字段的目的是防止数据报在选路时无休止地在网络中流动。例如,当路 由器瘫痪或者两个路由器之间的连接丢失时,可能会造成路由环路,而路由器可 能根据其路由表将该数据报一直循环转发下去。这种情况下,就需要一种机制来 给这些循环传递的数据报上加上一个生存上限,TTL 字段正是实现这种机制的手段。
TTL 字段在 IP 头部的位置如下图所示:

图 1 TTL 字段在 IP 报头的位置
通过上图,我们可以发现,TTL 字段占了 8 个 bit,那么一般而言,最大的TTL 值就是 2^8=255 啦。
2 应用分析案例
介绍完 TTL 字段的作用,接下来我们来看一下在实际的网络分析过程中,TTL 字段能够给我们提供哪些有用的信息和帮助。
2.1 识别操作系统
操作系统和传输协议的不同,其 TTL 字段的值也不同,那么我们可以根据IP 数据报的 TTL 字段来大体识别相应的操作系统。下图为各种操作系统在传输TCP 和 UDP 时默认使用的 TTL 值:

图 2 不同操作系统默认情况下的 TTL 值
黑客会利用这个特性来简单判断目的主机的操作系统,而在我们网络维护和分析的 过程中,也可以通过异常数据包的 TTL 值来简单判断异常主机的操作系统,从而
缩小我们的故障定位范围,提高故障解决的效率。
http://www.bitscn.com/network/cisco/200904/160171.html
2.2 发现路由环路
我们前面在介绍 TTL 时,已经说明 TTL 主要是为了防止路由环路的情况出 现而设置的,当网络出现路由环路时,IP 数据报会在路由环路间不断的循环转 发最终使其 TTL 值递减为 0,我们可以利用路由环路的这个特性和 TTL 值来定位路由环路,如下图所示:

|
|
|
|
当我们在网络分析过程中发现 TTL=1 的 IP 数据包(多播报文除外)时,我 们就需要关注是否存在网络路由环路了,我们一般会结合 IP 数据报的标识字段, 来快速的定位出网络中存在路由环路。
2.3 检测是否经过了路由设备
当 IP 数据报经过路由设备时,该路由设备在转发时一般会将其 TTL 值减 1, 因此,我们可以根据路由设备后所抓取数据包的 TTL 值来判断该数据包是否已 经经过路由设备。这个在实际网络分析过程中似乎用处不大,但是在一些特殊的 网络管理情况下,我们需要知道某些数据包是否经过了路由设备,例如,在一个 对网络访问限制较为严格的网络环境中,我们不期望有人利用访问权限较大的合 法 IP 地址做 NAT 地址转换,间接的访问受限的网络资源,因为这样的事情一旦 发生,很可能会带来致命的网络安全问题,在这种情况下,我们就可以在网络中 部署网络分析系统,对网络中的数据包进行捕获,通过查看数据包的 TTL 值来判断网络中是否存在 NAT 设备,从而定位出利用路由设备进行越权访问的主机,这种方法也是电信所使用的 ADSL 多用户检测技术之一。
2.4 检测数据包的不对称路由
我们知道 IP 是不可靠的的协议,它不能保证数据包在传输的过程中会被丢 失、失序,而 IP 选路功能可以让同一连接的数据包通过不同的路径进行转发, 这种特性提高了 IP 数据包的转发效率,但有时也会带来不必要的麻烦,例如, 在使用基于状态检测的防火墙环境中,如果在 TCP 连接建立阶段的三次握手报 文经过不同的路径转发,那么,很可能导致 TCP 应用异常(由于防火墙没有收 到完整的 TCP 三次握手的数据包,因此无法正常建立 TCP 状态表),如下图所

图 4 不对称路由示意图
在这种情况下,我们一般可以通过在服务器端与客户端分别 traceroute 对端 地址来判断数据包来回路径的是否一致,我们也可以通过在客户端与服务器端同 时抓包,分析数据包的 TTL 值来确定客户端与服务器端在转发数据包时经过的 路由跳数是否一致,从而判断数据包来回的路由路径是否一致。
2.5 发现 TCP 会话劫持
黑客会利用 TCP 会话劫持来实现对数据包的监听,运营商经常使用 TCP 会 话劫持技术来推送广告,或由于一些特殊的原因而干扰客户端的正常应用。关于 TCP 会话劫持的原理知识在此不做详细的介绍,大家可以使用关键字"TCP 会 话劫持"google 一下,有很多相应的技术资料描述这种攻击的实现原理和方式, 推 荐 源 码 网 的 《 会 话 劫 持 原 理 与 实 例 》 一 文 , 具 体 链 接 如 下 :
http://www.yuanma.org/data/2008/0806/article_3130.htm
关于如何利用 TTL 字段来发现 TCP 会话劫持,网上同样具有很多简单易懂 的应用的实例,推荐网络分析专家论坛中 ilrainyday 兄的《关于目前 ISP 常用的 两种 TCP 劫持的实例分析》一文,具体链接如下:
http://www.netexpert.cn/viewthread.php?tid=14503
2.6 发现局域网内中间人攻击
局域网内的中间人攻击一般首先采用 arp 欺骗的手段,让局域网内被攻击主 机的流量全部经过实施攻击的主机,再由实施攻击的主机将相关数据包转发到网 关设备上(需攻击主机开启路由转发策略),从而使被攻击主机的数据流都经过 实施攻击的主机,这样,实施攻击的主机就可以抓取相应的数据包,收集相应的 敏感信息了(用户名和密码)。一般的中间人攻击(特别是有意的攻击)其在流 量不大的情况下,很难被用户发现,因为,对用户的网络访问影响很小,用户基 本上感觉不到"中间人"的存在。
实施这种攻击的工具比较多,(最著名、使用最简单的 windows 下实施局域 网中间人攻击的工具就是 cain 了,当然,我们也可以直接使用 sniffer 类工具构 造欺骗包实施欺骗),有时候在不具备抓包环境的交换网络中,我们也可以通过 中间人攻击的方式抓取全网的数据包。具体局域网中间人攻击的示意图如下所 示:

图 5 局域网中间人攻击示意图
我们来简单看一下局域网中间人攻击的行为特征:
首先需要进行 arp 欺骗(具有 arp 欺骗的一切特征);
其次需要经过攻击主机转发数据包;
攻击主机在转发数据包后需要发送 icmp 重定向数据包给被攻击主机。 我们通过上面三个网络行为特征,可以很容易的定位一个局域网中间人攻击
行为,但是,我们如果只看到 arp 欺骗行为的话,并没有办法定位到底是不是一个局域网中间人攻击行为,而 icmp
重定向包在实施有意的中间人攻击时,"黑客" 一般会使用本机防火墙过滤 icmp 重定向包,在网络中就不会看到 icmp 重定向包
了,在这种情况下,我们可以通过数据包的 TTL 值来判断是否发生中间人攻击。 最简单的方法就是使用 ping 命令 ping 网关地址,根据
ping 返回的 TTL 值来判断是否是当前的正确的网关。
2.7 发现 IDS 等旁路部署的安全设备的阻断行为
现在在网络中存在大量的安全设备,有些安全设备是旁路部署的,例如 IDS、 网络行为管理系统等,这些安全设备通过交换机的端口镜像(或其他方式)收集 网络中的数据包,再通过对数据包的重组和分析,完成对网络主机相关网络行为 的检测和审计,同时,可以根据管理员设置的安全策略,管理控制网络相关主机 的网络访问行为。一般针对基于 TCP 的应用,其主要通过向客户端和服务器端 发送 TCP RESET 包来阻断非授权 TCP 应用,针对基于 UDP 应用则发送 ICMP 端口不可达报文来阻断非授权的 UDP 应用。
在这种情况下,我们可以通过抓取数据包,查看相应数据包的 TTL 值来确 认这种情况的存在,其分析的原理跟分析 TCP 会话劫持的原理是一样的,在此 就不作重复说明了。
3 补充说明与总结
3.1 补充说明
1、有些 NAT 设备在转发数据包时,不会将 TTL 值减 1,这个跟具体设备的实现 有关。
2、TTL 值是可以人工修改的。在 windows 环境下可以通过修改注册表来实现对 系统 TTL 值的设置,具体方法如下:
在windows注册表中,按照下面的路径找到defaultTTL,双击其修改即可。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

windows系统修改TLL值图标
3、很多组播应用为将多播数据限制在一个局域网内会将其 TTL 值设为 1;还有 些特殊的局域网应用考虑到信息的安全性,不希望将其跨路由传输到局域网以外 的网络,其可能会将其 TTL 设置为 1;
4、路由设备在收到 TTL 为 0 或 1 的数据包时,路由是不会转发这个数据包的, 主机如果收到 TTL 为 0 或 1 的数据包则提交给上层应用程序处理。
3.2 总结
TTL 字段在实际的分析过程中有着非常多的应用,我上面已经列举了很多, 但其实我们大家只要深入理解了 TTL 字段的本质作用,就可以在更多的实际分 析过程中灵活地运用其来定位故障或发现异常,例如我以前写的《关于数据包中 出现超长帧的分析文档》一文中,也有用到 TTL 字段来辅助分析和定位。
4 参考资料
1、《TCP/IP 详解卷 I》
2、《使用 TTL 分析网络故障》-CSNA 的菜青虫
3、《关于目前 ISP 常用的两种 TCP 劫持的实例分析》-netexpert 的 ilrainyday
4、《会话劫持原理与实例》-源码网