zoukankan      html  css  js  c++  java
  • 记一次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命令有输出了。

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

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

  • 相关阅读:
    Hibernate入门
    oracle数据库应用(2)
    oracle数据库应用
    Oracle数据库基础
    InitBinder 在Controller方法执行之前进行捕获请求,进行类型的转换
    Spring面试题
    Object处理方法的返回值
    使用jQuery快速高效制作网页交互特效
    struts2
    表分区
  • 原文地址:https://www.cnblogs.com/lifewithlight/p/9205851.html
Copyright © 2011-2022 走看看