我在工作中遇到过这样的情况:我们正在与外部网络进行通信,并且我们观察到由于 ttls 减少到零而导致部分数据包丢失。但是,某些流量确实到达,并且问题仅在某些连接上表现为故障。根本原因目前尚不清楚。有问题的操作系统是我们这边的linux,未知,但很可能是外部网络上的linux。我的一位同事建议我们重写所有进出此路由所用代理盒的数据包的 ttl。这对我来说似乎是一个坏主意,但我无法确定为什么。有人对重写 ttls 有见解吗?
答案1
免责声明
TTL 的作用是防止循环无限,并允许循环流量在某个时间被丢弃:当 TTL 达到 0 时。重写 TTL 可能会阻止此机制触发,并在注入足够的流量以添加节点时导致相关节点死亡。更多的循环。
通常,明智的方法是捕获网络中各个点的流量,以查看数据包及其 TTL 发生的情况,特别是检查同一数据包是否在同一点上多次出现,除非 TTL 值递减,强烈暗示一个循环。这在流量大的网络上可能看起来很困难,但捕获可能会受到限制,例如 TTL <= 5 的数据包。
iptables
无论如何,这里有足够的绳子来吊死自己。 Linux 有各种在不同网络层工作的工具来重写 TTL 值。其中有tc
,iptables
和nftables
。我将使用它,iptables
因为它提供了“增量”操作,因此不需要猜测什么是一个好的值。以下是该男子对绳索上吊的相关引用:
设置或增加 TTL 字段可能非常危险,因此应不惜一切代价避免这样做。
递增 1 将取消路由数据包时完成的自动递减 1(您可以在链接的联机帮助页中选择其他选项,例如递增更多或使用--ttl-set 100
):
iptables -t mangle -A FORWARD -j TTL --ttl-inc 1
如果规则中没有额外的匹配项,则每当数据包在任何方向上路由时都会应用该规则。