好的,这是一个非常典型的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助手提供,问题来源于学员提问




