Strongswan连接成功但无法访问远程网络主机问题求助
我遇到了一个非常棘手的问题:Strongswan明明显示连接成功,但绝大多数时候都访问不了朋友那边的远程网络,只有极少数情况能正常工作。以下是我的具体环境、配置和操作步骤,希望能得到大家的帮助:
网络环境信息
- 本地Ubuntu主机:192.168.178.52
- 本地路由器(FritzBox):192.168.178.1
- 朋友侧路由器(Swisscom):192.168.1.1
- 目标远程主机:192.168.1.148
Ubuntu主机上的Strongswan配置
connections { friend { version = 2 remote_addrs = xxx.internet-box.ch vips = 0.0.0.0 local { auth=psk id=roman } remote { auth=psk id=roman } children { vpn { # local_ts = 102.168.178.0/24 remote_ts = 192.168.1.0/24 # remote_ts = dynamic dpd_action = restart start_action = trap } } } } secrets { ike-1 { id-1=roman secret=xxxxxxxxxxx } }
执行的操作命令
$ swanctl --load-all # 加载配置文件 # 后续命令未完整输入,主要通过swanctl工具管理VPN连接
针对这个问题的排查与解决建议
结合你的情况,我整理了几个优先级较高的排查方向,你可以逐一尝试:
修正并启用本地流量选择器(local_ts)
你配置里的local_ts被注释掉了,而且还写错了子网(102.168.178.0/24应该是192.168.178.0/24吧?)。Strongswan需要明确知道哪些本地流量需要走VPN隧道,缺失这个配置会导致本地主机的流量无法被正确导向VPN。建议取消注释并修正为你的本地子网:local_ts = 192.168.178.0/24之后执行
swanctl --reload-connections重新加载配置,再重启连接试试。确认远程端的路由与流量选择器配置
即使你的本地配置正确,朋友侧的Swisscom路由器也需要正确配置反向路由——也就是把192.168.178.0/24的流量路由到VPN隧道。可以让朋友检查他那边的Strongswan配置,确保存在对应的local_ts = 192.168.1.0/24和指向你本地子网的路由条目,否则远程主机的响应包无法回到你的主机。检查本地路由表与iptables规则
连接成功后,在本地主机执行ip route show,查看是否存在针对192.168.1.0/24的路由,且下一跳是Strongswan的虚拟接口(比如ipsec0)。如果没有这条路由,说明trap策略未生效,可以手动添加路由:sudo ip route add 192.168.1.0/24 via <你的VPN虚拟接口IP>同时执行
sudo iptables -L -n检查防火墙规则,确保INPUT和FORWARD链允许IPsec相关的ESP/AH流量通过。验证安全关联(SA)的建立状态
执行以下命令查看当前的SA和子连接状态:swanctl --list-sas swanctl --list-children确认IPsec SA是否正常建立,如果状态显示异常或没有对应的SA条目,可能需要调整IKE协商的参数(比如加密算法),或者重启Strongswan服务:
sudo systemctl restart strongswan-starter。测试单主机连通性缩小范围
暂时把remote_ts从192.168.1.0/24改成目标主机的单独地址192.168.1.148/32,排除子网路由的影响。如果能成功访问这个单主机,再逐步扩展到整个子网配置。
备注:内容来源于stack exchange,提问作者romixch




