ip伪装失败主因是snat规则未匹配出口接口、地址不一致、连接跟踪干扰或内核参数异常;需检查iptables规则计数器、conntrack状态、/proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal值、出口网卡ip配置及tcpdump验证源地址是否替换。

IP伪装失败,通常表现为内网主机发出的流量源地址没被替换成NAT网关的出口IP,导致回程包无法匹配、连接超时或被外网设备丢弃。排查要聚焦在规则匹配、接口限定、状态跟踪和底层转发四个关键环节。
检查SNAT规则是否匹配且限定了出口接口
只写 -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.5 是常见错误。若未加 -o eth0,当流量从其他接口(如 eth1 或 lo)出向时也会触发该规则,可能造成地址冲突或策略误用。
- 运行 iptables -t nat -L POSTROUTING -v -n,确认规则计数器有增长,且目标接口(out)列显示为预期网卡
- 补全规则:例如 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.5
- 避免多条SNAT规则重叠,尤其注意 default route 对应的出口是否唯一
验证连接跟踪状态是否干扰伪装
已有连接会复用 conntrack 表项,即使修改了SNAT规则,旧连接仍按原地址转发,造成“改了不生效”的假象。
- 查目标端口连接:conntrack -L | grep "dport=8080"(替换为你实际端口)
- 临时清理相关连接:conntrack -D --dport 8080 --proto tcp
- 检查 /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal 是否为 1,避免因TCP窗口或ACK异常导致连接被提前销毁
确认出口网卡IP与SNAT地址一致
SNAT地址必须是出口网卡实际配置的IP之一,否则内核在路由后找不到对应源地址,直接丢包。
- 运行 ip addr show eth0,确认 203.0.113.5 确实在该接口上生效(不是 secondary 地址但未启用)
- 若使用别名 IP(如 eth0:0),需确保其处于 UP 状态,且路由表中该地址可达
- 云环境(如Azure NAT网关)需确认该公网IP已成功绑定到网关资源,且子网已关联
抓包确认地址是否真正被替换
理论规则≠实际生效。最直接的方式是在出口网卡抓包,看数据包离开时的源IP。
- 在出口网卡(如 eth0)执行:tcpdump -i eth0 -nn port 8080
- 发起一次内网访问,观察抓包中 SYN 包的 src ip 是否已是 SNAT 地址(如 203.0.113.5)
- 若仍是内网IP(如 192.168.1.100),说明规则未命中或被更早规则跳过










