ZBLOG

使用LVS的DR模式,异常RS服务器能收到PC发来的SYN包,但是PC上没有收到RS服务器的SYN包,如何排查

好的,这是一个非常典型的LVS DR模式故障排查场景。RS收到了SYN,但客户端收不到SYN-ACK,问题核心在于 回包路径不正确

我们来系统地排查这个问题。整个排查思路可以遵循下图所示的路径,它清晰地展示了DR模式下数据包的正常流转和关键的检查点:

flowchart TD
    A[问题: RS收SYN但Client收不到SYN-ACK] --> B[Root Cause: 回包未经由VIP发出]

    B --> C{开始系统性排查}
    
    C --> D[检查1: RS的lo:0 VIP配置]
    D --> E{配置正确?}
    E -- 否 --> F[修复: 在lo:0上配置VIP<br>并设置arp_ignore/arp_announce]
    
    E -- 是 --> G[检查2: 本地路由表]
    G --> H{路由指向正确?}
    H -- 否<br>默认路由经eth0 --> I[修复: 确保默认路由不经VIP网卡<br>或添加策略路由]
    
    H -- 是 --> J[检查3: ARP过滤参数]
    J --> K{arp_ignore=1<br>arp_announce=2?}
    K -- 否 --> L[修复: 更新sysctl.conf并重载]
    
    K -- 是 --> M[检查4: 防火墙规则]
    M --> N{80端口开放?}
    N -- 否 --> O[修复: 添加iptables规则<br>开放端口]
    
    N -- 是 --> P[所有检查通过]
    P --> Q[✅ RS回包恢复正常]

下面,我们根据上图流程,对每个步骤进行详细说明。


1. 检查RS上的VIP配置(对应流程图检查点1)

这是最常见的问题点。在DR模式中,VIP必须配置在RS的环回接口(lo) 上,而不是物理接口。

正确配置示例:

# 在RS上执行
ip addr show lo

# 应该能看到类似下面的配置:
# inet 192.168.1.100/32 scope global lo:0

如果缺少配置,需要添加:

# 临时添加(重启失效)
ip addr add 192.168.1.100/32 dev lo label lo:0

# 永久添加(写入/etc/rc.local或网络配置文件)
echo "ip addr add 192.168.1.100/32 dev lo label lo:0" >> /etc/rc.local

2. 检查ARP相关内核参数(对应流程图检查点3)

这是第二个常见问题点。必须防止RS响应来自客户端的ARP请求,否则客户端可能直接和RS通信,绕过LVS。

检查当前设置:

sysctl -a | grep arp | grep eth0 # 将eth0替换为你的物理网卡名

关键参数必须是:

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1  
net.ipv4.conf.lo.arp_announce = 2

临时修改:

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo (继续执行其他设置...)

永久修改(推荐):

# 编辑/etc/sysctl.conf,添加:
echo '
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2' >> /etc/sysctl.conf

sysctl -p # 重新加载配置

**3. 🔥 关键步骤:在RS上抓包确认**

这是最直接的诊断方法。

在异常RS上同时抓两个接口的包:

# Terminal 1 - 在物理接口抓包(例如eth0)
tcpdump -i eth0 host <Client_IP> -n

# Terminal-2 -  在环回接口抓包(lo)
tcpdump -i lo host <Client IP> -n

# Terminal-3 -  还可以指定端口精确抓取 
tcpdump -i any port <服务端口,如80> -n 

然后重现问题,观察:

  • eth0上是否有来自Client的SYN?
  • lo上是否有对应的SYN?(证明LVS转发成功)
  • eth0上是否发出了SYN-ACK?(目标地址应该是Client IP)

**4. 🌟 新关键排查点: RS的路由表**

如果抓包发现RS根本没有从任何接口发出SYN-ACK,那么问题很可能出在路由上!

检查路由:

ip route get <Client_IP>

或者更简单的方式重现问题:

ping -I <VIP> <Client IP> 
#使用VIP作为源IP去ping客户端,看是否能通?
traceroute --source <VIP> <Client IP>

如果发现回包没有使用VIP作为源地址,或者走了错误的路由,可能需要:

(A) 确保默认网关不经过VIP所在网段 如果你的VIP是和物理接口同一网段的,要确保默认路由指向正确的网关,而不是指向了LVS。

(B) 或者添加强制的策略路由(推荐)

#查看当前路由表  
ip rule list  
ip route show table local

#添加策略路由(示例)
echo '100 LVS-VIP' >> /etc/iproute2/rt_tables  
ip route add default via <物理网关> dev eth0 table LVS-VID  
ip rule add from <VIP>/32 table LVS-VIP priority  500  

5 . 防火墙检查

虽然相对少见,但也需要确认一下:

(A) 状态防火墙是否放行了ESTABLISHED流量? 某些严格配置可能只允许NEW连接而忘记放行ESTABLISHED。

(B) 直接临时清空规则测试:

iptables -F INPUT   
iptables -F OUTPUT  
service iptables stop  
# systemctl stop firewalld (for CentOS7+)  

##然后测试是否恢复正常。
##如果恢复,则说明是防火墙规则问题。
##记得测试后重新打开!
firewall-cmd --add-rich-rule='rule family="ipv4" source address="<CLIENT_IP>" accept' --permanent && firewall-cmd --reload 

请按照以上步骤进行排查,尤其重点关注第3步(抓包)和第4步(路由),大概率能定位到问题所在。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=8498

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?