记一次route配置不起作用的问题解决过程

最近做一个压力测试,用到一个工具需要把一台机器上的某个端口的tcp流量复制到另一台机器上,其中需要配置在机器A上对于所有C地址的请求路由到机器B上,然后在B上有相应的进程会处理此请求。

在A上执行以下命令:

route add -host C gw B

那么如果在A上执行 ping C的命令时,同时在B上执行tcpdump -nn icmp应该可以得到类似以下结果:

20:23:41.522489 IP A > C: ICMP echo request, id 16360, seq 407, length 64

但是实际操作时却不起作用,在B上执行的tcpdump命令没有任何输出,说明路由转发不成功。

排查此问题的思路:

A和B是否连通?

通过IP地址和子网掩码计算可以判断A和B在同一个局域网内,并且从A 和 B之间可以双向ping通。

那是否是A到B的路由错误导致?

通过对路由的调整可以看到,新加的路由是起作用的,猜测是路由过程中数据包被丢弃。

由于A和B是一个局域网内的机器,当数据包需要从A路由到B上时,直接可以从本地arp地址缓存中查找到B的MAC地址来通信。

通过在A上查看arp -n的结果,很奇怪的发现所有的IP对应的hwaddress都是同一个mac地址MAC_S,也就是说路由到B的数据包其实会先经过MAC_S所在的机器。

经过查询发现这个子网的交换机有ARP代答功能,对于所有的ARP请求都会返回相同的mac地址,也就是本交换机的mac地址MAC_S,这个交换机会筛选数据包,将目的IP为C的数据包丢弃掉从而不会路由到B。

根据这样的信息,在A上执行手动设置arp缓存来重新设置B的下一跳hwaddress为B的mac地址MAC_B:

arp -s B MAC_B

然后再去在A上执行ping和在B上执行tcpdump icmp命令后,可以看到B上的tcpdump命令有输出了。

至此问题解决了,但是这种设置只能临时解决问题,不能一直这样,否则会使网络的架构变得复杂,对一些异常网络问题的排查有影响。

考虑到只是做临时的测试,所以在测试完成后可以马上恢复。

原文地址:https://www.cnblogs.com/lifewithlight/p/9205851.html