CentOS 7 配置 IPSec-IKEv2 VPN, 适用于 ios, mac os, windows, linux.

CentOS 8 请移步《CentOS 8 使用 Strongswan 搭梯(IPsec IKEv2 VPN)》

更新于 2018-08-29

新写了一篇简单一点的文章,移步《CentOS 7 使用 Strongswan 配置 IKEv2 VPN》查看。

 

最近感觉我国”建筑行业龙头企业”的施工水平又有提升, ipsec + l2tp 方式也难逃厄运. so, 放弃, 改用 IKEv2.
google 到一款名为 strongSwan 的开源服务端. 官网为 https://www.strongswan.org.

本文只介绍 IKEv2 方式的 VPN 配置, 如果需要 PPTP 方式, 请参考 <<CentOS VPS 建立 PPTP VPN 服务>>

这里使用的 VPS 服务器配置:

  • CentOS 7 / 512M / 20G ssd , $5/月. 详情请看 这里
  • 禁用 firewallD, 启用 iptables.
  • strongSwan 版本 5.2
  • xl2tpd 版本 1.3.6

安装 strongSwan

strongSwan 的发行版已包含在 EPEL 源中, 如果没有添加 EPEL 源, 请看 <<CentOS 7 配置 LNMP + FTP 环境>> 添加 EPEL 源.

添加完 EPEL 源后输入如下命令

当前为 5.4.0 版本, 官网上最新为 5.5.0, 但是需要编译安装.

生成证书

生成 CA 根证书

1. 生成一个私钥:

2. 基于这个私钥自己签一个 CA 根证书:

–self 表示自签证书
–in 是输入的私钥
–dn 是判别名

  • C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名
  • O 组织名称
  • CN 友好显示的通用名

–ca 表示生成 CA 根证书
–lifetime 为有效期, 单位是天

生成服务器端证书

1. 同样先生成一个私钥

2. 用我们刚才自签的 CA 证书给自己发一个服务器证书:

–issue, –cacert 和 –cakey 就是表明要用刚才自签的 CA 证书来签这个服务器证书。
–dn, –san,–flag 是一些客户端方面的特殊要求:

  • iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址;
  • Windows 7 不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),–flag serverAuth;
  • 非 iOS 的 Mac OS X 要求了“IP 安全网络密钥互换居间(IP Security IKE Intermediate)”这种增强型密钥用法(EKU),–flag ikdeIntermediate;
  • Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,–san。

生成客户端证书(可选)

客户端证书是在启用客户端证书验证的时候, 用于验证客户端用户身份的. 每个用户一个证书. 如果需要很高的安全性, 可以用客户端证书, 一般情况下, 不需要使用.

1. 依然是生成私钥:

2. 然后用刚才自签的 CA 证书来签客户端证书:

打包证书为 pkcs12

此时会提示输入两次密码, 这个密码是在导入证书到其他系统时需要验证的. 没有这个密码即使别人拿到了证书也没法使用.

安装证书

把 CA 证书(ca.cert.pem)、客户端证书(client.cert.pem)和 .p12 证书(client.cert.p12)用 FTP 复制出来给客户端用

配置 vpn

先修改主配置

官方文档

下面是一些常用的设置说明

我的设置项

 

修改 dns 配置

v5.1.2 之后, 所有插件配置都分散在 /etc/strongswan/strongswan.d/ 目录中.

修改如下

配置验证方式的用户名与密码

下面添加用户

开启内核转发

写入以下配置

保存退出, 执行下面命令.

 

配置防火墙

iptables 配置方法

将下面几条规则加入 iptables 规则中, 适当使用 -I 参数替换 -A 参数, 确保所有的项目位置都在拒绝项前面.

如果嫌上面的操作麻烦, 可以直接编辑 iptables 规则文件.

将下面的规则部分贴进去, 不要整个复制粘贴,  根据原有规则适当调整每条规则的位置, 确保规则在拒绝项前, 使之能生效.

保存退出, 重启 iptables 使之生效.

 

以下是 firewallD 的配置方法, 使用 iptables 的可以忽略.

firewalld 介绍请看 <<CentOS 7 firewalld 动态防火墙介绍>>

首先将公网网卡添加到当前区域中

编辑网卡配置

在最末尾加上区域配置

保存退出,重启服务

 

然后新建一个服务

填入以下内容

保存退出

添加服务到当前区域, 开启转发

 

除了用 firewall-cmd 命令外, 还可以换种方法添加上面的规则.

改成如下内容, 我这里只开放了 ssh 和 vpn 端口, 其他内容根据各自的情况修改.

 

配置完防火墙后重启 strongswan 服务

这里不使用 strongswan restart 命令的原因是, 使用这条命令后, 再用 systemctl status strongswan 命令得不到正确的运行状态.

至此, 服务端配置已完成.

 

为了学用 firewalld , 特意用了两天时间研究, 学会了才发现, firewalld 要比 iptables 占太多内存. 小内存的 vps 用 firewalld 有点奢侈. 还是换回 iptables 了.

客户端配置

 IOS:

先导入 CA 证书

将之前创建的 ca.cert.pem 用 ftp 导出 , 写邮件以附件的方式发到邮箱, 在 ios 浏览器登录邮箱, 下载附件, 安装 ca 证书.

1. 使用 IKEv2 + EAP 认证

找到手机上 “设置->VPN->添加配置”, 选 IKEv2

  • 描述: 随便填
  • 服务器: 填url或ip
  • 远程ID: ipsec.conf 中的 leftid
  • 用户鉴定: 用户名
  • 用户名: EAP 项用户名
  • 密码: EAP 项密码

2. 使用 IKEv2 + 客户端证书 认证

把之前的 .p12 证书(里面包含ca证书)发到邮箱在手机上打开.  导入到手机(此时需要之前设置的证书密码).

找到手机上 “设置->VPN->添加配置”, 选 IKEv2

  • 描述: 随便填
  • 服务器: 填url或ip
  • 远程ID: ipsec.conf 中的 leftid
  • 用户鉴定: 证书
  • 证书: 选择安装完的客户端证书

3. 使用 IKEv2 + 预设密钥 认证

找到手机上 “设置->VPN->添加配置”, 选 IKEv2

  • 描述: 随便填
  • 服务器: 填url或ip
  • 远程ID: ipsec.conf 中的 leftid
  • 用户鉴定: 无
  • 使用证书: 关
  • 密钥: PSK 项密钥

Windows 10

导入证书:

  • 将 CA 根证书 ca.cert.pem 重命名为 ca.cert.crt
  • 双击 ca.cert.crt 开始安装证书
  • 点击安装证书
  • “存储位置” 选择 “本地计算机”, 下一步
  • 选择 “将所有的证书都放入下列存储区”, 点浏览, 选择 “受信任的根证书颁发机构”, 确定, 下一步, 完成.

建立连接:

  • “控制面板”-“网络和共享中心”-“设置新的连接或网络”-“连接到工作区”-“使用我的 Internet 连接”
  • Internet 地址写服务器 IP 或 URL。
  • 描述随便写。
  • 用户名密码写之前配置的 EAP 的那个。
  • 确定
  • 转到 控制面板网络和 Internet网络连接
  • 在新建的 VPN 连接上右键属性然后切换到“安全”选项卡
  • VPN 类型选 IKEv2
  • 数据加密选“需要加密”
  • 身份认证这里需要说一下,如果想要使用 EAP 认证的话就选择“Microsoft:安全密码(EAP-MSCHAP v2)”; 想要使用私人证书认证的话就选择“使用计算机证书”。
  • 再切换到 “网络” 选项卡, 双击 “Internet 协议版本 4” 以打开属性窗口, 这里说一下, 如果你使用的是老版本的 win10, 可能会打不开属性窗口, 这是已知的 bug, 升级最新版本即可解决.
  • 点击 “高级” 按钮, 勾选 “在远程网络上使用默认网关”, 确定退出.

VPN 配置完成

Windows 7 导入证书略有不同

  • 开始菜单搜索「cmd」,打开后输入 mmc(Microsoft 管理控制台)。
  • 「文件」-「添加/删除管理单元」,添加「证书」单元
  • 证书单元的弹出窗口中一定要选「计算机账户」,之后选「本地计算机」,确定。
  • 在左边的「控制台根节点」下选择「证书」-「受信任的根证书颁发机构」-「证书」,右键 -「所有任务」-「导入」打开证书导入窗口。
  • 选择 CA 证书 ca.cert.crt 导入即可
注意 千万不要双击 .p12 证书导入!因为那样会导入到当前用户而不是本机计算机中,ipsec 守护精灵是访问不了它的。

CentOS 7 配置 IPSec-IKEv2 VPN, 适用于 ios, mac os, windows, linux.》上有129个想法

    • 大概率是证书问题,确保证书是有效的,证书在系统中是可信的,证书的使用者域名是对的。

  1. 博主 你好,
    按照上面的步骤设置后,我在Macos上测试VPN连接不上,是有可能哪里不对吗?
    防火墙关闭了
    认证方式采用最简单的PSK认证
    另外,哪里可以看到日志呢?文中提到的设置日志的地方在新的配置文件中run不起来。

  2. 最近买了个CN2的VPS,一步步架设完成后单次连接的charon.log如下,用网上的一键脚本,message文件里的内容也是这样的
    用的是win10, 事件查看器显示错误ID是809。我原来的VPS的Ikev2还能连接,不知道能否帮帮我

    Jun 15 05:27:58 15[NET] received packet: from 【本机IP】[500] to 服务器IP[500] (624 bytes)
    Jun 15 05:27:58 15[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(FRAG_SUP) N(NATD_S_IP) N(NATD_D_IP) V V V V ]
    Jun 15 05:27:58 15[IKE] received MS NT5 ISAKMPOAKLEY v9 vendor ID
    Jun 15 05:27:58 15[IKE] received MS-Negotiation Discovery Capable vendor ID
    Jun 15 05:27:58 15[IKE] received Vid-Initial-Contact vendor ID
    Jun 15 05:27:58 15[ENC] received unknown vendor ID: 01:52:8b:bb:c0:06:96:12:18:49:ab:9a:1c:5b:2a:51:00:00:00:02
    Jun 15 05:27:58 15[IKE] 【本机IP】 is initiating an IKE_SA
    Jun 15 05:27:58 15[IKE] remote host is behind NAT
    Jun 15 05:27:58 15[ENC] generating IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(MULT_AUTH) ]
    Jun 15 05:27:58 15[NET] sending packet: from 【服务器IP】[500] to 【本机IP】[500] (320 bytes)
    Jun 15 05:27:59 09[NET] received packet: from 【本机IP】[500] to 【服务器IP】[500] (624 bytes)
    Jun 15 05:27:59 09[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(FRAG_SUP) N(NATD_S_IP) N(NATD_D_IP) V V V V ]
    Jun 15 05:27:59 09[IKE] received retransmit of request with ID 0, retransmitting response
    Jun 15 05:27:59 09[NET] sending packet: from 【服务器IP】[500] to 【本机IP】[500] (320 bytes)
    Jun 15 05:28:00 03[NET] received packet: from 【本机IP】[500] to 【服务器IP】[500] (624 bytes)
    Jun 15 05:28:00 03[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(FRAG_SUP) N(NATD_S_IP) N(NATD_D_IP) V V V V ]
    Jun 15 05:28:00 03[IKE] received retransmit of request with ID 0, retransmitting response
    Jun 15 05:28:00 03[NET] sending packet: from 【服务器IP】[500] to 【本机IP】[500] (320 bytes)

  3. 你好,用你这个搭建了一个ipsec的服务器,可以连接上,但是无法访问外网,怎么回事,没有任何网络通讯

    • 查日志找原因, 检查ios上证书是否已安装. 检查证书域名, 服务端配置是否正确.

  4. 你好,配置完成后WIN10连接提示“策略匹配错误”
    整个配置过程按照你的流程来走,除了没有生成安装客户端证书,打包pkcs12、用户名密码自行设置以外,中间在防火墙配置时,添加strongswan服务出错,提示“Error: INVALID_SERVICE: ‘strongswan’ not among existing services”,strongswan服务启动和状态正常,但是可能和这个错误关系不大
    请问是哪里出现问题,是不是必须要打包pkcs12?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

验证码