跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

怎么在Linux利用Iptables-T-Mangle修改数据包的TTL值隐藏内网拓扑结构

Windows下可用netsh interface ipv4 set global defaultcurhoplimit=值命令无需重启即时修改TTL,默认128,推荐设为64,执行后立即生效并可通过netsh interface ipv4 show global验证。 直接改 TTL 是隐藏内网拓扑最常用也最有效的方式之一,但必须用对表、链和条件。核心不是“能不能改”,而是“在哪改、怎么改才真正起作用”。 必须用 mangle 表,其他表无效 filter 表只能决定放行或丢弃,nat 表只改源/目的地址和端口,它们都 不能触碰 IP 包头里的 TTL 字段 。只有 mangle 表支持 TTL 扩展模块(
TTL
target),且该模块在 filter 或 nat 表中加载会报错:
iptables: No chain/target/match by that name
。所以命令里 -t mangle 不能省 ,漏写就等于没配。 选对链:PREROUTING 还是 OUTPUT? 取决于本机在网络中的角色: 如果你的 Linux 主机是 网关或路由器 (流量经它转发),应在 PREROUTING 链 上操作。这样进入的数据包在路由决策前 TTL 就被增加,外部 traceroute 看到的跳数变少,中间设备被“抹平”。 如果你的主机是 对外提供服务的服务器 (比如 Web 服务器),响应包从本机发出,必须在 OUTPUT 链 上增加 TTL,否则回程路径仍暴露原始跳数。 不要在 INPUT 或 FORWARD 链改 TTL :INPUT 时包已抵达本机,修改不影响 traceroute;FORWARD 中修改太晚,TTL 可能在路由检查阶段就被判为 0 而丢弃。 匹配条件要宽松,别用 --ttl-eq 不同系统初始 TTL 不同:Linux 通常是 64,Windows 是 128,BSD 可达 255。若写
--ttl-eq 64
,来自 Windows 的请求就完全匹配不上。推荐用:
--ttl-gt 1
:覆盖绝大多数正常流量(TTL 至少为 2 才可能到达你) 避免精确匹配,增强鲁棒性 典型命令示例(增加 4 跳): CentOS Linux 7.9.2009 CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。 下载
iptables -t mangle -A PREROUTING -m ttl --ttl-gt 1 -j TTL --ttl-inc 4
iptables -t mangle -A OUTPUT -m ttl --ttl-gt 1 -j TTL --ttl-inc 4
验证和持久化不能少 光看
iptables -t mangle -vnL
计数器递增不等于生效。要实测: 从外网执行
traceroute -n 目标IP
,观察跳数是否明显减少或出现“跳空” 在本机抓包:
tcpdump -i any 'icmp[icmptype] == icmp-echoreply' -nn -c 2
,检查 echo reply 的 TTL 是否已增加 规则重启后失效,需保存:Debian/Ubuntu 用
iptables-save > /etc/iptables/rules.v4
;CentOS 7 用
service iptables save
或
netfilter-persistent save

相关文章