StrongSwan 连接成功了但上不了网?一步步教你排查防火墙和内核转发问题
StrongSwan连接成功但无法上网?深度排查防火墙与内核转发问题
当你看到StrongSwan客户端显示"已连接"的绿色图标,却打不开任何网页时,那种挫败感我深有体会。这不是简单的配置错误,而是网络层多个系统协同工作时出现的典型故障。本文将带你像网络工程师一样,从协议栈底层逐层排查,找出那个阻止你上网的"元凶"。
1. 基础网络连通性检查
在深入复杂的防火墙规则之前,先确认基本通信是否正常。连接StrongSwan后,在客户端终端执行:
ping 10.11.1.1 # 假设这是服务器分配的虚拟IP traceroute 8.8.8.8如果第一个命令成功而第二个失败,说明IPsec隧道已建立但数据包未被正确转发。此时需要重点检查以下方面:
常见故障现象对照表
| 现象 | 可能原因 | 验证方法 |
|---|---|---|
| 能ping通虚拟IP但无法访问外网 | NAT未生效/转发被阻止 | 检查iptables -t nat -L |
| 连接后完全无网络访问 | 路由覆盖或DNS问题 | ip route show和nslookup |
| 间歇性连接中断 | MTU不匹配或DPD检测失败 | 抓包分析ESP分片 |
提示:始终在服务器端用
tcpdump -i eth0 -n udp port 500 or port 4500实时监控IKEv2协商过程
2. 防火墙规则深度解析
现代Linux系统可能同时存在iptables和nftables,StrongSwan需要以下关键规则放行:
# 查看生效中的规则(兼容新旧版本) iptables-legacy -L -n -v 2>/dev/null || iptables -L -n -v必须放行的关键流量:
IKEv2协商流量:
- UDP 500(ISAKMP)
- UDP 4500(NAT-T穿越)
ESP/AH协议流量:
- IP协议50(ESP)
- IP协议51(AH)
NAT转换规则:
iptables -t nat -A POSTROUTING -s 10.11.1.0/24 -o eth0 -j MASQUERADE
注意:如果使用firewalld,需额外配置:
firewall-cmd --add-service=ipsec --permanent firewall-cmd --add-masquerade --permanent firewall-cmd --reload3. 内核转发参数调优
即使net.ipv4.ip_forward=1已设置,这些参数同样关键:
# 实时修改内核参数(无需重启) sysctl -w net.ipv4.conf.all.accept_redirects=0 sysctl -w net.ipv4.conf.all.send_redirects=0 sysctl -w net.ipv4.ip_no_pmtu_disc=1 # 解决MTU问题 # 持久化配置 echo "net.ipv4.conf.all.rp_filter=2" >> /etc/sysctl.confIPv6用户特别注意:
sysctl -w net.ipv6.conf.all.forwarding=1 sysctl -w net.ipv6.conf.all.accept_ra=04. StrongSwan日志分析实战
日志是排查问题的金钥匙,增加charon模块的日志级别:
# 编辑/etc/strongswan.d/charon-logging.conf filelog { charon { path = /var/log/charon.log time_format = %b %e %T default = 2 ike = 2 net = 2 } }关键日志线索:
CHILD_SA established未出现 → 第二阶段协商失败no policy found→ 防火墙拦截ESP流量NAT-T detected但无后续 → 4500端口未开放
使用swanctl --log动态监控日志时,特别关注这些时间戳格式异常,它们往往暗示着时钟不同步问题——这是证书验证失败的常见原因。
5. 高级故障排查技巧
当常规方法无效时,这些高级工具能派上用场:
1. 协议分析组合拳:
# 同时抓取明文和加密流量 tcpdump -i eth0 -w /tmp/outer.pcap 'udp port 500 or port 4500' tcpdump -i ipsec0 -w /tmp/inner.pcap2. 路由表诊断:
ip route show table all # 显示所有路由表 ip rule list # 查看策略路由3. 性能调优参数:
# 防止大文件传输中断 sysctl -w net.ipv4.ipsec_esp_min=1024 sysctl -w net.ipv4.ipsec_esp_max=1500在云服务器环境中,还需要特别注意安全组的入站规则是否允许IP协议50/51。曾经有用户在AWS上耗费数小时,最终发现是安全组漏配了ESP协议。
