zoukankan      html  css  js  c++  java
  • 抓包分析LVS-NAT中出现的SYN_RECV

    CIP:192.168.10.193

    VIP:192.168.10.152:8000

    DIP:100.10.8.152:8000

    RIP:100.10.8.101:8000 和 100.10.8.102:8000

    从CIP到RIP的TCP连接,总是超时。

    在Director上看到,lvs已经把来着client的消息转发,但状态是SYN_RECV

    ===================

    # ipvsadm -lnc
    IPVS connection entries
    pro expire state source virtual destination
    TCP 00:58 SYN_RECV 192.168.10.193:45346 192.168.10.152:8000 100.10.8.102:8000

    ==================

    抓包分析一下:

    realserver抓包,看到realserver已经收到了director转发的syn,而且在第一时间返回了syn ack。这是没有问题的。

    client抓包,看到client收到了syn ack,但是地址却是RIP。按照LVS-NAT的原理,在经过director之后,应该把RIP转换为VIP才对。

    所以clinet虽然收到了syn ack,但无法和之前发送给VIP的syn配对起来,因此client一直处在等待VIP回复syn ack的状态。

    之后检查了网络,发现从RIP到CIP存在多条路由,syn ack没有经过director就路由到了CIP。

    解决方案:删除多条路由,将dip作为realserver的网关。

    完成上述操作之后,发现lvs状态仍然是SYN_RECV。抓包后的pcap文件中,没有syn ack。于是想到是不是在什么地方丢掉了。

    看到官方文档中有描述要设置re_ filter。

    查了一下这个参数的解释

    ======================================

    rp_filter参数有三个值,0、1、2,具体含义:

    • 0:不开启源地址校验。
    • 1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
    • 2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。

    =======================================

    default的值是1,这里改为2

    echo 2 > /proc/sys/net/ipv4/conf/ 网卡名/rp_filter

    echo 2 > /proc/sys/net/ipv4/conf/ 网卡名/rp_filter

    systemctl restart network.service

    再次尝试,succeed

  • 相关阅读:
    Webservice接口
    Loadrunner使用代理录制
    Python学习Collections 模块
    Python学习笔记(八)
    Linux系统部署禅道
    Python学习笔记(七)
    Python学习笔记(六)
    Python学习笔记(五)
    Python学习笔记(四)
    Python学习笔记(三)
  • 原文地址:https://www.cnblogs.com/shizouwei/p/9072186.html
Copyright © 2011-2022 走看看