Ubuntu 24.04下编译安装的Strongswan 5.9.14 VPN服务器无法响应客户端连接请求求助
我来帮你一步步排查这个问题,咱们从最基础的点开始确认,逐步缩小范围:
先确认Strongswan服务是否真的正常运行
别光看服务显示“已启动”,得确认核心进程在正常干活。你可以执行:systemctl status strongswan
看看charon进程有没有正常运行,有没有红色的错误提示。也可以用swanctl --stats查看IPsec统计数据,如果连基础的统计信息都出不来,说明服务可能没完成初始化。
如果服务启动失败,直接看启动日志找线索:journalctl -u strongswan --no-pager -b,说不定是编译时漏装了某个依赖,导致组件加载失败。检查编译参数是否遗漏了关键功能
你给出的编译命令后面截断了(--enable-eap-m...),要确保你启用了客户端需要的认证模块——比如如果客户端用EAP-TLS或者EAP-MSCHAPv2,对应的模块必须开启。另外,Ubuntu 24.04用的是6.x内核,--enable-kernel-netlink这个参数必须正常生效,不然Strongswan没法和内核交互处理IPsec流量。
你可以用strongswan --version查看编译好的模块列表,确认ikev2、charon、socket-default这些核心模块都在输出里。强制开启详细日志,抓关键线索
默认日志级别太低可能啥都看不到,咱们手动调高日志等级:
编辑/etc/strongswan.d/charon/logging.conf,找到filelog部分,把default_level改成4或者5(数字越大日志越详细),然后重启服务:systemctl restart strongswan。
之后打开一个终端实时跟踪日志:journalctl -u strongswan -f,同时让客户端发起连接,看看有没有任何日志输出——哪怕是错误信息,都能帮我们判断是服务器没收到包,还是收到了但处理出错。用tcpdump确认网络层面是否收到请求
有时候防火墙看起来开了,但实际可能有其他规则拦截,或者路由问题导致包没到服务器。咱们直接抓包验证:
执行tcpdump -i any port 500 or port 4500,然后让客户端发起连接,看终端里有没有显示来自客户端IP的包。- 如果抓不到包:那问题不在Strongswan本身,得检查网络路由、端口转发(如果服务器在NAT后面)、或者云服务商的安全组(如果是云服务器)。
- 如果能抓到包但Strongswan没日志:那就是服务没处理这些包,大概率是编译时的模块缺失,或者配置文件有问题。
用极简配置测试排除复杂配置干扰
先别用复杂的证书或EAP配置,写个极简的预共享密钥(PSK)配置试试,排除配置错误的可能:
编辑/etc/swanctl/swanctl.conf,替换成下面的内容(记得替换占位符):connections { test-vpn { version = 2 local_addrs = 你的服务器公网IP remote_addrs = %any proposals = aes256-sha256-modp2048 dpd_delay = 30 dpd_timeout = 120 dpd_action = restart local { auth = psk id = 你的服务器域名或IP } remote { auth = psk id = %any } children { test-child { local_ts = 0.0.0.0/0 remote_ts = 0.0.0.0/0 esp_proposals = aes256-sha256 start_action = accept } } } } secrets { ike-psk { id-1 = 你的服务器域名或IP id-2 = %any secret = "你的预共享密钥字符串" } }配置好后加载配置:
swanctl --load-all,然后用swanctl --list-conns确认配置已经加载成功,再让客户端用对应的PSK配置连接试试。检查内核转发参数是否正确配置
Strongswan需要内核开启IP转发才能正常工作,Ubuntu 24.04默认可能没开。编辑/etc/sysctl.conf,添加或修改以下参数:net.ipv4.ip_forward = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter = 0 # 如果需要支持IPv6,再加下面这行 net.ipv6.conf.all.forwarding = 1执行
sysctl -p让参数生效,这一步很容易被忽略,但却是IPsec正常工作的基础。
按照上面的步骤一步步排查,应该能找到问题所在。如果某个步骤有异常,随时把输出信息贴出来,咱们再针对性分析。
备注:内容来源于stack exchange,提问作者Thystra




