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

  • 相关阅读:
    hdu 5387 Clock (模拟)
    CodeForces 300B Coach (并查集)
    hdu 3342 Legal or Not(拓扑排序)
    hdu 3853 LOOPS(概率DP)
    hdu 3076 ssworld VS DDD(概率dp)
    csu 1120 病毒(LICS 最长公共上升子序列)
    csu 1110 RMQ with Shifts (线段树单点更新)
    poj 1458 Common Subsequence(最大公共子序列)
    poj 2456 Aggressive cows (二分)
    HDU 1869 六度分离(floyd)
  • 原文地址:https://www.cnblogs.com/shizouwei/p/9072186.html
Copyright © 2011-2022 走看看