CentOS6搭建L2TP/IPsec VPN后提示没有密钥的故障排查与解决方法

XMSDN
本文针对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)将无法读取密钥。

CentOS6搭建L2TP/IPsec VPN后提示没有密钥的故障排查与解决方法

  1. 打开文件:
    vi /etc/ipsec.secrets
  2. 检查格式: 正确的格式通常如下所示:
    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 文件不匹配,验证也会失败。

  1. 打开文件:
    vi /etc/ipsec.conf
  2. 检查 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 中的密钥进行验证。
    • leftright:确保 left 是你的服务器 IP,right%any(允许任何客户端 IP),这必须与 ipsec.secrets 中的对应关系一致。

重启 IPsec 服务并验证状态

修改完配置文件后,必须重启服务才能生效,在 CentOS 6 中,命令如下:

  1. 重启 IPsec:

    service ipsec restart

    注意:如果重启失败,请使用 ipsec verify 命令检查具体报错。

  2. 检查 IPsec 状态: 运行以下命令查看 IPsec 是否正常启动以及连接状态:

    ipsec verify

    你应该看到多个 [OK] 的检查项,如果看到 Checking that pluto is running 显示失败,说明服务没起起来,需要检查日志。

  3. 查看实时日志(关键步骤): 当你尝试在客户端连接 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 中的 leftright 配置与实际连接的 IP 不符。

防火墙与 NAT 问题

有时候密钥是正确的,但由于防火墙拦截了必要的 IPsec 协议包,导致客户端误报为“没有密钥”。

CentOS 6 默认使用 iptables,请确保放行以下端口和协议:

  1. UDP 500 和 4500 端口:(用于 IKE 密钥交换和 NAT-T)
    iptables -A INPUT -p udp --dport 500 -j ACCEPT
    iptables -A INPUT -p udp --dport 4500 -j ACCEPT
  2. UDP 1701 端口:(用于 L2TP)
    iptables -A INPUT -p udp --dport 1701 -j ACCEPT
  3. ESP 协议:(IPsec 加密数据流,IP 协议号 50)
    iptables -A INPUT -p 50 -j ACCEPT
  4. 保存规则:
    service iptables save
    service iptables restart

当你在 CentOS 6 上搭建好 L2TP 后遇到“没有密钥”的提示,请按照以下顺序进行“排雷”:

  1. 确认 /etc/ipsec.secrets 格式无误,权限为 600。
  2. 确认 /etc/ipsec.confauthby=secret 且 IP 定义与 secrets 文件对应。
  3. 重启服务 service ipsec restart
  4. 查看日志 /var/log/secure 寻找具体的 authentication failed 原因。
  5. 检查 iptables 是否放行了 UDP 500/4500 和协议 50。

通常情况下,问题都出在配置文件的格式细节上,仔细核对空格和引号,往往就能解决这个困扰已久的“没有密钥”问题。

💡 温馨提示

📌 阅读须知 Rules & Notice

本站坚持免费分享,致力于为大家提供实用、优质的内容与资源。

🔗欢迎大家收藏与转发,转载请保留本站链接,请勿私自去除版权信息。

📚所有外部整理资源,仅作学习交流使用,请勿用于各类商业用途。

🤝网络相聚本是缘分,希望大家文明交流,理性浏览。

🛠️若发现内容有误或涉及侵权,我们将第一时间处理整改。

💖 感谢每一位朋友的陪伴与支持

✨ 用心分享,一路同行 ✨

目录[+]