tcpdump对出站连接是否100%可靠?如何确认SYN包是否真的发出?
排查TCP健康检查数据包丢失问题的方法
咱们一步步来拆解这个问题,帮你确认数据包到底是没离开服务器,还是卡在交换机环节:
1. 先确认服务器本地是否真的送出了数据包
- 核对路由是否正确:执行
ip route get <目标服务器IP>,看输出的dev是不是你观测的本地接口,src是不是服务器的正确IP。如果路由指向了其他接口,那数据包自然不会走你监控的那个网卡,防火墙也就抓不到。 - 查看网卡发送统计:用
ethtool -S <网卡名称>查看网卡的发送计数,比如tx_packets。触发一次健康检查前后对比这个数值,如果数字上涨了,说明网卡确实把数据包发出去了;如果没变化,那问题大概率在服务器内部(比如路由错误、iptables拦截、网卡驱动故障)。 - 做针对性抓包验证:用
tcpdump -i <网卡名称> host <目标IP> and tcp port <目标端口> -nn持续抓包,同时触发健康检查。如果能抓到SYN包,说明内核已经把数据包交付给网卡驱动了。
2. 验证服务器到交换机的链路是否正常
- 端口镜像抓包(最直接):如果有权限,让运维在交换机上把服务器连接的端口配置成SPAN镜像端口,把这个端口的所有流量镜像到一台测试机上。在测试机上用tcpdump抓包,看能不能收到那台服务器发的SYN包:
- 如果能抓到:说明数据包已经到交换机了,问题可能在交换机的转发规则、ACL,或者防火墙的配置;
- 如果抓不到:那就是服务器到交换机的链路有问题,比如网线损坏、端口协商失败(可以用
ethtool <网卡名称>查看Link detected状态,以及tx_errors/rx_errors是否持续增长)。
- 检查ARP映射:在服务器上执行
arp -a | grep <目标IP>,看有没有正确的MAC地址;同时登录交换机,查看对应端口的ARP表,确认服务器和目标服务器的ARP条目是否正常。如果ARP映射错误,数据包无法封装成正确的帧发送。
3. 检查交换机端的状态
- 查看端口统计:登录交换机,查看服务器连接端口的接收数据包计数(比如思科交换机用
show interfaces <端口号>,华为用display interface <端口号>)。如果服务器端的tx_packets涨了,但交换机端口的rx_packets没涨,说明链路丢包;如果交换机收到了数据包,再看有没有被ACL规则丢弃,或者有没有正确转发到防火墙。 - 核对交换机路由/转发规则:确认交换机上有没有针对目标IP和端口的过滤规则,或者VLAN配置错误,导致数据包被拦截。
4. 排除服务器内部的拦截规则
- 检查iptables OUTPUT链:执行
iptables -L OUTPUT -v -n,看有没有针对<目标IP>:<目标端口>的DROP/REJECT规则。注意:tcpdump是在网卡驱动层抓包,所以即使iptables拦截了,tcpdump依然能看到SYN包,但数据包不会被送出网卡。 - 检查内核反向路径过滤:执行
sysctl net.ipv4.conf.all.rp_filter,如果值为1(严格模式),可能会过滤掉不符合路由的数据包,导致发送失败。可以临时改成0测试:sysctl -w net.ipv4.conf.all.rp_filter=0。
5. 用追踪工具定位丢包点
- 用TCP traceroute:执行
traceroute -T -p <目标端口> <目标IP>,模拟健康检查的TCP连接,看数据包能走到哪一跳。如果在交换机节点就停了,说明交换机没转发;如果能到防火墙但没回应,那就是防火墙的问题。 - 分析重传情况:如果tcpdump抓到了多次SYN重传,说明服务器没收到SYN-ACK,大概率是数据包没到达目标,或者目标没回复。
内容的提问来源于stack exchange,提问作者khaled83




