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

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

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

  • 相关阅读:
    C++ XML解析之TinyXML篇[转]
    TinyXML:一个优秀的C++ XML解析器[转]
    nginx 出现413 Request Entity Too Large问题的解决方法
    redis配置认证密码
    《Discuz安装时候出现乱码 -- 问题解决方法》
    MySQL创建用户与授权
    CentOS 7 安装mysql
    setfacl命令 来自: http://man.linuxde.net/setfacl
    install pip3 for python 3.x
    自己制作ssl证书:自己签发免费ssl证书,为nginx生成自签名ssl证书
  • 原文地址:https://www.cnblogs.com/lifewithlight/p/9205851.html
Copyright © 2011-2022 走看看