![篡改 IP 的 TTL 为何很危险?](https://linux22.com/image/612074/%E7%AF%A1%E6%94%B9%20IP%20%E7%9A%84%20TTL%20%E4%B8%BA%E4%BD%95%E5%BE%88%E5%8D%B1%E9%99%A9%EF%BC%9F.png)
我一直在阅读 iptables 手册页(睡前轻松读物),我遇到了“TTL”目标,但它警告:
设置或增加 TTL 字段可能非常危险
和
永远不要设置或增加离开本地网络的数据包的值!
我知道减少或降低 TTL 可能会导致数据包在到达目的地之前被丢弃,但增加 TTL 会产生什么影响呢?
答案1
当数据包经过路由器时,TTL 会减少。这确保如果数据包在原地打转,它最终会死亡。
IP v4 数据包的 TTL 字段是一个 8 位字段(十进制为 255)。因此,一开始就将其设置为高值并不是什么大问题,因为在格式正确的数据包中它实际上不可能那么大(尽管有些东西可能会接受格式错误的 IP 数据包)。
然而,如果有什么东西增加了它,并且增加的步骤是循环的一部分,数据包可能会不断循环,永远不会达到零。随着时间的推移(可能非常短,也可能逐渐泄漏),数据包可能会在包含该循环的系统中累积,导致系统过载。
答案2
数据包上的 TTL 基本上可以保证路由的合理性。如果数据包的 TTL 非常大,并且由于某种原因被困在循环路由中,则可能会导致大量流量(称为“数据包风暴”)并干扰正常操作。太低的 TTL 会导致连接丢失,因为您会在数据包到达目的地之前丢失它。
答案3
答案似乎忽略了一点,但这纯粹是学术性的(因为互联网上似乎需要多少跳):如果数据包由于 TTL 过期而通常无法到达目的地,则增加它将允许数据包到达目的地,但不会影响返回的数据包,并且它们会在到达您的网络之前过期。
更新:根据维基百科上的此页面:
理论上,在 IPv4 下,生存时间以秒为单位,尽管传递数据报的每个主机都必须将 TTL 至少减少一个单位。实际上,TTL 字段在每一跳上都减少一。为了反映这种做法,该字段在 IPv6 中被重命名为跳数限制。
更新 2:有人更新了我的帖子并引用了维基百科,我认为最好引用 RFC 本身 -http://www.ietf.org/rfc/rfc791.txt- 只需在其中搜索 TTL,它就能很好地解释它:
此字段表示允许数据报在互联网系统中停留的最长时间……处理数据报的每个模块都必须将 TTL 至少减少 1,即使它在不到 1 秒的时间内处理数据报
答案4
每个处理数据包的路由器都会减少 TTL 值,直到数据包到达目的地,或者 TTL 达到零并死亡。
正如其他人所说,如果存在负循环,增加 TTL 可能会导致数据包永不消亡。通常,如果 TTL 值不够大,则尝试更大 TTL 的逻辑可能应该由端到端客户端处理。
如果您确定路由器不在循环中(树状拓扑),那么理论上您可以安全地增加 TTL 值。话虽如此,允许比标准更多的跳数可能会使外部网络更容易出现拥塞。如果内部和外部网络之间有一长串路由器,只要没有循环,更大的 TTL 值可能会有所帮助。话虽如此,有人很容易在网络中添加一条边并创建一个循环,因此从数据包最初发出的位置开始使用更大的 TTL 值要安全得多。