StrongSwan IPsec隧道显示建立但无法通信,提示“Network is unreachable”源路由安装失败
看起来你遇到的核心问题是Ubuntu 22.04的网络栈没有正确识别私有IP的本地可达性,导致StrongSwan尝试为隧道安装源路由时失败——虽然隧道能建立,但没有实际的路由规则让流量走隧道,自然无法通信。结合你换Rocky Linux就正常的情况,确实是Ubuntu的Netplan配置方式踩了坑,下面给你针对性的解决方案:
一、先搞懂错误根源
日志里的unable to install source route for [私有IP],本质是系统认为这个私有IP所在的网络“不可达”。这是因为你之前用Netplan给接口加了带标签的子地址(比如enp0s31f6:ipsec),Ubuntu的networkd对这种标签地址的路由处理不够友好,没有自动生成对应的本地路由条目,导致StrongSwan无法确认这个IP是本地接口上的有效地址。
二、分步修复方案
1. 修正Netplan的私有IP配置(关键一步)
不要再用标签子接口的方式配置私有IP,直接把私有IP和公网IP放到同一个物理主接口上,让系统自动生成正确的本地路由。
以Server B为例,修改/etc/netplan/01-netcfg.yaml(主配置文件):
network: version: 2 renderer: networkd ethernets: enp41s0: # 替换成你的实际物理接口名称 addresses: - 138.201.x.x/32 # 保留原公网IP - 192.168.220.1/24 # 直接把私有IP添加到主接口 routes: - on-link: true to: 0.0.0.0/0 via: 138.201.x.y # 原公网网关 nameservers: addresses: - w.x.y.z - ipv6.x.y.z::add:2 - w.x.y.z2 - ipv6.x.y.z::add:1
Server A同理,把172.16.50.1/24直接添加到主物理接口的addresses列表里。
应用配置并验证:
sudo netplan generate && sudo netplan apply # 检查本地路由,必须能看到私有IP的本地条目 ip route show table local # 应该输出类似:192.168.220.1 dev enp41s0 proto kernel scope host src 192.168.220.1
2. 调整StrongSwan配置,避免冗余设置
之前的leftsourceip配置有两个问题:一是没必要强制指定(StrongSwan会自动选接口上的私有IP),二是Server B的配置里多了/24后缀(这个参数应该是单个IP,不是子网)。
修改Server A的/etc/ipsec.conf:
conn thevpn type=tunnel auto=start keyexchange=ikev2 authby=secret left=167.235.x.x # 公网IP leftsubnet=172.16.50.0/24 right=138.201.x.x rightsubnet=192.168.220.0/24 # 移除leftsourceip=172.16.50.1,让StrongSwan自动选择源IP ike=3des-md5-modp2048! esp=3des-md5-modp2048! aggressive=no keyingtries=%forever ikelifetime=28800s lifetime=3600s dpddelay=15s dpdtimeout=20s dpdaction=restart
Server B的配置同理,移除leftsourceip=192.168.220.1/24这一行。
3. 确保系统IP转发和路由参数正确
执行以下命令开启IP转发并禁用重定向(IPsec必备):
sudo sysctl -w net.ipv4.ip_forward=1 sudo sysctl -w net.ipv4.conf.all.accept_redirects=0 sudo sysctl -w net.ipv4.conf.all.send_redirects=0
把这些参数写入/etc/sysctl.d/99-ipsec.conf永久生效:
net.ipv4.ip_forward=1 net.ipv4.conf.all.accept_redirects=0 net.ipv4.conf.all.send_redirects=0
4. 重启服务并验证
sudo systemctl restart strongswan-starter # 查看隧道状态 ipsec status # 检查StrongSwan专用路由表(默认是220),应该有隧道路由条目 ip route show table 220
如果路由表220里出现了类似192.168.220.0/24 via 138.201.x.x dev enp41s0 proto static src 172.16.50.1的条目,再去ping对方的私有IP,应该就能正常通信了。
额外排查要点
- 检查防火墙:确保允许UDP 500、4500端口,以及ESP协议的流量,同时放行两个私有子网之间的通信。
- 不要混用多个Netplan配置文件:把所有网络配置集中到主文件里,避免冲突。
备注:内容来源于stack exchange,提问作者jollyroger

