报文校验错是NAT转发中因校验和未同步更新、回程路径不对称或分片处理异常,导致接收端丢弃报文;需检查NAT设备是否透明改写、校验和重算是否生效、回程是否经同一NAT、分片模块是否加载及客户机rp_filter设置。

报文校验错不是 NAT 网关自身的协议错误,而是指在转发过程中因地址/端口映射不一致、连接状态不匹配或校验字段(如 TCP 校验和、IP 分片标识)被意外修改,导致报文在接收端被丢弃。这类问题表现为“能建连但传输中断”“HTTPS 握手失败”“大包丢弃率高”,却查不到明显 DROP 日志。排查需聚焦于 NAT 设备是否非透明改写、回程路径是否对称、以及中间设备是否干扰校验字段。
检查 NAT 是否触发了非预期的报文重写
NAT 设备(尤其是虚拟化环境中的 vmnetnatd 或 Linux netfilter)在做 DNAT/SNAT 时,必须同步更新 IP 头部校验和与 TCP/UDP 校验和。若使用硬件卸载(如网卡 LRO/GSO)、或启用了不兼容的 conntrack helper(如 ftp、sip),就可能跳过校验和重计算,导致回包被目标主机内核丢弃。
- 在宿主机抓包比对:用 tcpdump -i vmnet8 'port 80' -w nat-out.pcap(出向)和 tcpdump -i eth0 'host 203.0.113.10 and port 80' -w wan-in.pcap(入向),用 Wireshark 查看同一会话中 SYN 包的 TCP 校验和是否在 NAT 前后变化;若不变,说明校验和未重算
- 临时禁用网卡卸载:ethtool -K eth0 gso off tso off lro off,再测试是否恢复
- 确认未启用干扰性 conntrack helper:conntrack -L | grep -E "(ftp|tftp|sip)",如有则清空并加 modprobe -r nf_conntrack_ftp
验证回程路径与 DNAT 映射严格对称
报文校验错高频出现在“非对称路由”场景:请求走 NAT 设备 A 转发,响应却绕过 A 直接返回(例如虚拟机配置了双网关、或宿主机启用了策略路由)。此时响应包目的 IP 是虚拟机私有地址,但没经过 SNAT 逆转换,TCP 校验和仍按私网地址计算,与客户端原始 SYN-ACK 不匹配。
- 在客户机执行 tcpdump -i any 'tcp port 80 and (src host 192.168.122.1 or dst host 192.168.122.1)',观察响应包的源 IP 是不是 NAT 网关(如 192.168.122.2),而不是宿主机物理 IP
- 检查客户机路由表:ip route get 203.0.113.10,确保下一跳为 VMware NAT 网关(非默认网关误设为物理网关)
- 在宿主机执行 ip rule show 和 ip route show table local,排除存在 from 192.168.122.0/24 lookup main 类似策略导致回程绕过 nat 表
定位分片与校验字段冲突点
当报文被分片且 NAT 设备仅处理首片(如某些嵌入式 NAT 固件),或 Linux 内核 nf_defrag_ipv4 模块未加载,会导致后续分片的目的 IP 未被 DNAT,校验和计算依据错误地址,整包被丢弃。典型现象是小包正常、大文件上传卡在 1440 字节附近。
- 确认分片重组模块已加载:lsmod | grep defrag,缺失则运行 sudo modprobe nf_defrag_ipv4
- 强制禁止分片测试:ping -s 1472 -M do www.example.com(MTU=1500 场景),若成功而默认 ping 失败,说明分片处理异常
- 在 nat 表 PREROUTING 链添加日志规则:iptables -t nat -I PREROUTING -p tcp --dport 80 -m physdev --physdev-is-bridged -j LOG --log-prefix "FRAG-CHK: ",观察日志中是否出现大量 “frag” 标识
交叉验证客户机网络栈行为
部分客户机操作系统(如旧版 Windows 或精简 Linux 发行版)在收到目的 IP 已被 NAT 改写的报文时,若未开启 rp_filter 松散模式,会因“源地址不可达”直接丢弃,表现为看似校验错实为反向路径过滤。
- 在客户机检查:sysctl net.ipv4.conf.all.rp_filter 和 sysctl net.ipv4.conf.eth0.rp_filter,值为 2(松散)才允许非对称路由
- 临时关闭反向过滤:echo 0 | sudo tee /proc/sys/net/ipv4/conf/all/rp_filter
- Windows 客户机需确认注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnablePMTUDiscovery = 1,避免 MSS 协商失败引发分片异常










