这是一个典型的LVS TUN模式网络问题,排查步骤如下:
1. 检查Real Server的IPIP隧道状态
# 检查tunl0接口状态
ip addr show tunl0
# 检查IPIP隧道配置
ip tunnel show
# 检查路由表
route -n
ip route show table all | grep tunl0
2. 验证数据包流向
在Real Server上抓包:
# 监听tunl0接口的流量
tcpdump -i tunl0 -nn host <VIP>
# 同时监听物理接口出去的包
tcpdump -i eth0 -nn host <Client_IP> and port <Port>
在Director上抓包:
tcpdump -i any -nn host <VIP> or host <Client_IP>
3. 检查Real Server的回包路由
# 查看回包路由策略
ip rule show
ip route show table local
# 特别检查local路由表是否有VIP
ip route show table local | grep <VIP>
# 应该有这样的条目:
# local <VIP> dev lo scope host
4. 验证ARP设置和防火墙
# 检查ARP抑制设置(TUN模式也需要)
cat /proc/sys/net/ipv4/conf/tunl0/arp_ignore
cat /proc/sys/net/ipv4/conf/tunl0/arp_announce
# TUN模式推荐设置:
echo 2 > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
# 检查防火墙规则
iptables -L -n -v
iptables -t nat -L -n -v
# 临时关闭防火墙测试
iptables -F && iptables -t nat -F
service iptables stop # CentOS6
systemctl stop firewalld # CentOS7
ufw disable # Ubuntu
##5.调试内核参数和连接跟踪
#启用连接跟踪调试
echo1>/proc/sys/net/ipv4/vs/debug_level
#查看连接跟踪表
cat/proc/net/ip_vs_conn
#检查conntrack表
conntrack-L|grep<VIP>
#如果conntrack有问题,尝试禁用
echo0>/proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal
modprobe-r nf_conntrack_ipv4 nf_conntrack
##6.完整的TUN模式诊断脚本
#!/bin/bash
VIP="your_virtual_ip" CLIENT_IP="client_ip"
echo"=== LVS TUN Mode Diagnosis ==="
echo"1.Tunnel Interface:" ip addr show tunl0 ip link show tunl0
echo-e"\n2.Routing Table:" route-n ip route show table local|grep$VIP
echo-e"\n3.ARP Settings:" echo"tunl0 arp_ignore: $(cat/proc/sys/net/ipv4/conf/tunl0/arp_ignore)" echo"tunl0 arp_announce: $(cat/proc/sys/net/ipv4/conf/tunl0/arp_announce)"
echo-e"\n4.Packet Filtering:" iptables-L-n-v|grep$VIP
echo-e"\n5.Connection Tracking:" cat/proc/net/ip_vs_conn|head-10 conntrack-L|grep$VIP|head-5
echo-e"\n6.Current Connections:" ipvsadm-Lnc|grep$VIP
##7.常见问题解决方案
###问题1:回包不走隧道
#确保VIP在lo接口上并设置正确路由
ip addr add$VIP/32 dev lo scope host
#添加策略路由让回包走隧道
ip rule add from$VIP/32 table100
ip route add default via<Director_Tunnel_IP>dev tunl0 table100
#或者简化方案:添加特定路由
ip route add<Client_subnet>via<Director_Tunnel_IP>dev tunl0 src$VIP
###问题2:防火墙拦截
#添加防火墙规则允许隧道流量
iptables-A INPUT-i tunl0-j ACCEPT
iptables-A OUTPUT-o tunl0-j ACCEPT
#允许相关网络流量
iptables-A INPUT-s<Director_IP>-j ACCEPT
iptables-A OUTPUT-d<Director_IP>-j ACCEPT
###问题3:内核参数问题
#调整内核参数
echo1>/proc/sys/net/ipv4/conf/tunl0/rp_filter echo1>/proc/sys/net/ipv4/tcp_timestamps echo1>/proc/sys/net/ipv4/tcp_tw_reuse
#重启keepalived服务 systemctl restart keepalived
##8.分步测试流程
1.首先在RS上测试本地服务
bash curl http://127.0.01:<port>
2.测试从RS直接访问VIP
bash curl http://<VIP>:<port>
3.在Director上监控连接
bash watch'ipvsadm-Ln--stats'
4.使用tcpdump验证数据流路径
按照这个流程逐步排查,通常能定位到TUN模式下回包问题的根本原因。
内容由零声教学AI助手提供,问题来源于学员提问




