本文针对CentOS 6搭建L2TP/IPsec VPN后出现的“没有密钥”故障进行排查,主要原因通常为预共享密钥(PSK)配置不匹配或服务未正确加载,解决方法包括检查并修正/etc/ipsec.secrets文件中的密钥,确保客户端与服务端一致;重启IPsec服务使配置生效;检查防火墙规则,放行UDP 500、4500及1701端口;最后通过查看日志确认连接成功。
在使用 CentOS 6 系统搭建 L2TP/IPsec VPN 的过程中,许多管理员在完成所有配置文件的修改和服务启动后,尝试连接客户端(如 Windows 或手机)时,经常会遇到令人头疼的错误提示:“没有密钥”或者错误代码 789,这通常意味着 IPsec 阶段的预共享密钥(PSK)验证失败了。
既然搭建步骤看似正确,为什么还会提示“没有密钥”呢?这通常不是因为你没有设置密钥,而是因为服务器端的配置文件存在细微的语法错误,或者服务未能正确加载密钥,本文将针对 CentOS 6 环境,详细排查并解决这一问题。
检查 /etc/ipsec.secrets 文件格式
这是最常见的问题所在,IPsec 的密钥存储在这个文件中,如果格式有误,IPsec 服务(通常是 Openswan 或 Strongswan)将无法读取密钥。

- 打开文件:
vi /etc/ipsec.secrets
- 检查格式:
正确的格式通常如下所示:
include /etc/ipsec.d/*.secrets %any %any : PSK "你的预共享密钥"
或者指定服务器 IP:
2.3.4 %any : PSK "你的预共享密钥"
注意点:
- 引号: 密钥必须用双引号包裹。
- 空格: 冒号两边必须有空格(
PSK)。 - 换行: 确保文件末尾有一个换行符。
- 权限: 该文件权限必须严格,否则服务可能会拒绝读取,运行命令
chmod 600 /etc/ipsec.secrets确保只有 root 可读写。
检查 /etc/ipsec.conf 配置一致性
密钥文件正确了,还需要主配置文件正确引用它。ipsec.conf 中的定义与 secrets 文件不匹配,验证也会失败。
- 打开文件:
vi /etc/ipsec.conf
- 检查
conn L2TP-PSK部分: 确保以下参数配置正确:conn L2TP-PSK authby=secret pfs=no auto=add keyingtries=3 rekey=no type=transport left=你的服务器公网IP leftprotoport=17/1701 right=%any rightprotoport=17/%any rightsubnet=vhost:%priv,%no关键点:
authby=secret:这告诉系统使用/etc/ipsec.secrets中的密钥进行验证。left和right:确保left是你的服务器 IP,right是%any(允许任何客户端 IP),这必须与ipsec.secrets中的对应关系一致。
重启 IPsec 服务并验证状态
修改完配置文件后,必须重启服务才能生效,在 CentOS 6 中,命令如下:
-
重启 IPsec:
service ipsec restart
注意:如果重启失败,请使用
ipsec verify命令检查具体报错。 -
检查 IPsec 状态: 运行以下命令查看 IPsec 是否正常启动以及连接状态:
ipsec verify
你应该看到多个
[OK]的检查项,如果看到Checking that pluto is running显示失败,说明服务没起起来,需要检查日志。 -
查看实时日志(关键步骤): 当你尝试在客户端连接 VPN 时,在服务器上实时监控日志,这是定位“没有密钥”错误的终极方法。
tail -f /var/log/secure
常见日志分析:
- 如果看到
packet from x.x.x.x: received Vendor ID payload [Dead Peer Detection]等握手信息,说明通道是通的。 - 如果看到
no RSA public key known for 'x.x.x.x'或authentication failed,说明密钥不匹配。 - 如果看到
cannot find config for x.x.x.x,说明ipsec.conf中的left或right配置与实际连接的 IP 不符。
- 如果看到
防火墙与 NAT 问题
有时候密钥是正确的,但由于防火墙拦截了必要的 IPsec 协议包,导致客户端误报为“没有密钥”。
CentOS 6 默认使用 iptables,请确保放行以下端口和协议:
- UDP 500 和 4500 端口:(用于 IKE 密钥交换和 NAT-T)
iptables -A INPUT -p udp --dport 500 -j ACCEPT iptables -A INPUT -p udp --dport 4500 -j ACCEPT
- UDP 1701 端口:(用于 L2TP)
iptables -A INPUT -p udp --dport 1701 -j ACCEPT
- ESP 协议:(IPsec 加密数据流,IP 协议号 50)
iptables -A INPUT -p 50 -j ACCEPT
- 保存规则:
service iptables save service iptables restart
当你在 CentOS 6 上搭建好 L2TP 后遇到“没有密钥”的提示,请按照以下顺序进行“排雷”:
- 确认
/etc/ipsec.secrets格式无误,权限为 600。 - 确认
/etc/ipsec.conf中authby=secret且 IP 定义与 secrets 文件对应。 - 重启服务
service ipsec restart。 - 查看日志
/var/log/secure寻找具体的authentication failed原因。 - 检查 iptables 是否放行了 UDP 500/4500 和协议 50。
通常情况下,问题都出在配置文件的格式细节上,仔细核对空格和引号,往往就能解决这个困扰已久的“没有密钥”问题。
