iptables可通过ttl扩展模块识别拦截伪造包:丢弃ttl128的包,白名单仅允64/128,结合recent检测ttl跳变,nat环境下在postrouting链用mangle标记异常ttl并drop。

利用 iptables 匹配 TTL 值是识别和拦截伪造数据包的有效手段之一,因为真实主机发出的数据包 TTL 通常有合理范围(如 Linux 默认 64,Windows 默认 128),而扫描器、反射攻击工具或某些中间设备伪造的包常使用异常 TTL(如 1、3、65、129 等),或在多次跳转后 TTL 过低却仍抵达目标——这本身就很可疑。
TTL 异常值匹配拦截
真实业务流量极少出现 TTL ≤ 2 或 ≥ 129 的 IP 包。可直接用 ttl 扩展模块过滤这些明显异常值:
- 丢弃 TTL 小于 3 的入站包(防本地伪造或单跳扫描):
iptables -t filter -A INPUT -m ttl --ttl-lt 3 -j DROP - 拒绝 TTL 大于 128 的包(防 Windows 主机伪造为 Linux 或故意设高 TTL 绕过检测):
iptables -t filter -A INPUT -m ttl --ttl-gt 128 -j DROP - 只允许 TTL 为 64、128 的常见合法值(白名单思路):
iptables -t filter -A INPUT -m ttl ! --ttl-eq 64 -m ttl ! --ttl-eq 128 -j DROP
结合 recent 模块检测 TTL 跳变行为
攻击者有时会批量发送不同 TTL 的探测包(如 TTL=1→64),试图绘制网络拓扑。这类行为具有“短时间高频、TTL 递增”特征。可用 recent + ttl 联合识别:
- 记录 60 秒内 TTL 变化超过 3 次的源 IP:
iptables -t filter -A INPUT -m ttl --ttl-gt 1 -m ttl --ttl-lt 64 -m recent --name ttl_jumper --setiptables -t filter -A INPUT -m recent --name ttl_jumper --rcheck --seconds 60 --hitcount 4 -j DROP - 注意:需搭配
--rttl选项增强可靠性(recent 模块支持按 TTL 分桶记录,避免误判同一主机不同路径的正常 TTL 差异)。
针对 NAT/伪装环境的 TTL 校验补充
在 MASQUERADE 或 SNAT 场景下,出口设备会重写 TTL(通常设为 64),导致内网伪造包难以被下游识别。此时可在出方向链(POSTROUTING)中主动校验并标记可疑包:
- 对从内网接口(如 eth0)发出、且原始 TTL 非 64/128 的包打标记:
iptables -t mangle -A POSTROUTING -s 192.168.1.0/24 -o eth1 -m ttl ! --ttl-eq 64 -m ttl ! --ttl-eq 128 -j MARK --set-mark 1 - 随后在 FORWARD 或 INPUT 链中根据 mark 丢弃:
iptables -t filter -A INPUT -m mark --mark 1 -j DROP
与伪造 TCP 包工具联动做防御验证
你提到的自定义 TCP 包工具(支持伪造 TTL、校验和、序列号等)本身也是测试防御能力的好帮手。可反向利用它生成 TTL=1、TTL=255 等极端包,验证上述规则是否生效:
- 用工具发一个 TTL=1 的 SYN 包到本机端口,确认被
--ttl-lt 3规则拦截; - 构造 TTL=65 且含 TCP Timestamp 选项的包,观察是否被白名单规则放行——若未放行,说明需扩展允许值(如加
--ttl-eq 65); - 在 NAT 网关上运行该工具伪造内网源地址+异常 TTL,检验 mangle 表 MARK 规则是否触发。










