同一子网服务器数据包丢失原因及跨子网转发回包异常问题排查
同一子网服务器数据包丢失原因及跨子网转发回包异常问题排查
咱们先把整个问题场景和已有的排查信息梳理清楚,方便定位核心问题:
环境信息
- Server A:192.168.100.10(承担转发角色,ens4接口属于192.168.100.0/24子网)
- Server B:192.168.100.61(发起请求的服务器)
- Server C:10.1.11.171(目标服务服务器)
问题场景
Server B 需要通过 Server A 转发访问 Server C 的 7777 端口,执行的访问命令是:telnet 10.1.11.171 7777
已有的抓包结果(Server A 上执行)
在 Server A 的 ens4 接口上执行抓包命令:tcpdump -i ens4 port 7777
得到的抓包输出如下:
16:15:44.567765 IP 192.168.100.61.60454 > 10.1.11.171.7777: Flags [S], seq 1044174687, win 64240, options [mss 1460,sackOK,TS val 625522895 ecr 0,nop,wscale 7], length 0 16:15:44.610705 IP 10.1.11.171.7777 > 192.168.100.61.60454: Flags [S.], seq 3053725531, ack 1044174688, win 62643, options [mss 1375,sackOK,TS val 645556679 ecr 625522895,nop,wscale 7], length 0
从抓包结果能明确看到:
- Server B 的SYN请求已经通过Server A转发到了Server C
- Server C 已经正常回复了SYN+ACK回包,而且这个回包已经到达了Server A的ens4接口
但关键问题是:这个SYN+ACK回包根本没有到达Server B(192.168.100.61)
Server A 的路由表(部分内容)
default via [PUBLICIP/REDACTED] dev ens3 proto dhcp src [PUBLICIP/REDACTED] metric 100 10.1.0.0/16 dev aws-ovh-1 scope link...
下一步排查方向
结合上面的信息,咱们可以从这几个关键点入手排查:
- 确认Server A的IP转发功能是否开启
执行命令sysctl net.ipv4.ip_forward,如果返回值不是net.ipv4.ip_forward = 1,说明IP转发没开,回包无法被Server A转发到Server B,可执行sysctl -w net.ipv4.ip_forward=1临时开启后再测试。 - 检查Server A的防火墙/安全组规则
排查iptables、nftables或者云平台的安全组规则,确认是否在FORWARD、OUTPUT链中DROP了发往192.168.100.61的7777端口回包。可以临时关闭防火墙(比如systemctl stop iptables)快速验证是否是规则拦截导致的问题。 - 验证Server B的本地配置
- 检查Server B的路由表,确认有没有针对10.1.11.0/24网段的异常路由
- 检查Server B的本地防火墙(比如ufw、iptables),是否拦截了来自10.1.11.171的入站流量
- 确认Server C的路由正确性
虽然抓包看到回包到了Server A,但还是要确认Server C的路由表中,是否有针对192.168.100.0/24网段的路由,且下一跳指向Server A。如果Server C的回包走了默认路由,可能会出现不对称路由的问题。 - 排查ARP缓存问题
在Server A上执行arp -n | grep 192.168.100.61,检查是否有Server B的ARP条目。如果没有,说明Server A无法通过二层转发找到Server B,可执行arping -I ens4 192.168.100.61手动触发ARP请求,更新缓存后再测试。
备注:内容来源于stack exchange,提问作者sbrattla
相关产品推荐
相关产品推荐

