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命令有输出了。

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

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

  • 相关阅读:
    Rufus 真神器也
    i2c-tools命令使用 示例
    常用行棋手法
    Windows系统如何更改任务栏缩略图的大小
    微擎 钻石投票
    发卡系统
    支付宝当面付
    django 多个admin 展示不同model 定制
    Django Admin:如何清除“最近的动作”面板
    tomcat正常运行一段时间后,突然访问不了项目了, 其它根页面报404错误
  • 原文地址:https://www.cnblogs.com/lifewithlight/p/9205851.html
Copyright © 2011-2022 走看看