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. 我搜索了3周,这是我找到过的最好的文章。但是在ios10.3.3上使用4G测试时,一直连不上。
    下面是日志:
    Nov 8 09:44:33 09[NET] received packet: from 1.68.41.22[34990] to 128.199.115.97[500] (604 bytes)
    Nov 8 09:44:33 09[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) ]
    Nov 8 09:44:33 09[IKE] 1.68.41.22 is initiating an IKE_SA
    Nov 8 09:44:33 09[IKE] remote host is behind NAT
    Nov 8 09:44:33 09[ENC] generating IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(MULT_AUTH) ]
    Nov 8 09:44:33 09[NET] sending packet: from 128.199.115.97[500] to 1.68.41.22[34990] (448 bytes)
    Nov 8 09:44:33 10[NET] received packet: from 1.68.41.22[34991] to 128.199.115.97[4500] (496 bytes)
    Nov 8 09:44:33 10[ENC] unknown attribute type (25)
    Nov 8 09:44:33 10[ENC] parsed IKE_AUTH request 1 [ IDi N(INIT_CONTACT) N(MOBIKE_SUP) IDr CPRQ(ADDR DHCP DNS MASK ADDR6 DHCP6 DNS6 (25)) N(ESP_TFC_PAD_N) N(NON_FIRST_FRAG) SA TSi TSr ]
    Nov 8 09:44:33 10[CFG] looking for peer configs matching 128.199.115.97[128.199.115.97]…1.68.41.22[10.167.205.208]
    Nov 8 09:44:33 10[CFG] selected peer config ‘ikev2-eap’
    Nov 8 09:44:33 10[IKE] initiating EAP_IDENTITY method (id 0x00)
    Nov 8 09:44:33 10[IKE] received ESP_TFC_PADDING_NOT_SUPPORTED, not using ESPv3 TFC padding
    Nov 8 09:44:33 10[IKE] peer supports MOBIKE
    Nov 8 09:44:33 10[IKE] authentication of ‘128.199.115.97’ (myself) with RSA signature successful
    Nov 8 09:44:33 10[IKE] sending end entity cert “C=CN, O=xzys, CN=128.199.115.97”
    Nov 8 09:44:33 10[ENC] generating IKE_AUTH response 1 [ IDr CERT AUTH EAP/REQ/ID ]
    Nov 8 09:44:33 10[ENC] splitting IKE message with length of 1456 bytes into 2 fragments
    Nov 8 09:44:33 10[ENC] generating IKE_AUTH response 1 [ EF(1/2) ]
    Nov 8 09:44:33 10[ENC] generating IKE_AUTH response 1 [ EF(2/2) ]
    Nov 8 09:44:33 10[NET] sending packet: from 128.199.115.97[4500] to 1.68.41.22[34991] (1236 bytes)
    Nov 8 09:44:33 10[NET] sending packet: from 128.199.115.97[4500] to 1.68.41.22[34991] (292 bytes)
    Nov 8 09:45:03 11[JOB] deleting half open IKE_SA with 1.68.41.22 after timeout

    • 你的这个日志看不出什么问题, 应该仔细看日志里[err]或者[wraing](具体是哪种标签忘了)部分的内容.

  2. 按照你的方法试了很多次,在win10无论用哪种验证都是提醒:无法连接到vpn连接。无法建立计算机和vpn服务器之间的网络连接,因为远程服务器未响应。这可能是因为未将计算机与远程服务器之间的某种网络设备(如防火墙、nat、路由器等)配置为允许vpn连接。

    • 首先确保你的vps可以访问国外网络, 再确定你的vps ip 没有被墙. 然后再查配置的问题.

      • 我可以付费你远程帮我搭建吗?跟着你的步骤做了几十次了,也不断的检查和百度,就是搭建不了,因为这个也不是我的专业,我不想浪费太多的时间在搭建上,我能确定vps是没问题的,我一直用这个vps搭l2tp。邮件联系可以吗?

        • 付费就不必了, 你可以加我qq, 这几天有时间的话帮你看下. 3375583

  3. 不知道是不是防火墙规则设置问题,也是DO的vps,CentOS6,能拨号,就是不能上网。

  4. 在验证的时候,无法通过,我是用EAP验证的,会弹出用户名密码登录,但是输入之后就登录失败

    • [root@izj6c8ba6c30va6rfy05vlz ~]# tail -f /var/log/messages
      Feb 18 11:58:26 izj6c8ba6c30va6rfy05vlz systemd: Started Update UTMP about Syste m Runlevel Changes.
      Feb 18 11:58:26 izj6c8ba6c30va6rfy05vlz systemd: Startup finished in 581ms (kern el) + 1.161s (initrd) + 11.303s (userspace) = 13.047s.
      Feb 18 11:58:27 izj6c8ba6c30va6rfy05vlz systemd: Created slice user-0.slice.
      Feb 18 11:58:27 izj6c8ba6c30va6rfy05vlz systemd: Starting user-0.slice.
      Feb 18 11:58:27 izj6c8ba6c30va6rfy05vlz systemd: Started Session 1 of user root.
      Feb 18 11:58:27 izj6c8ba6c30va6rfy05vlz systemd-logind: New session 1 of user ro ot.
      Feb 18 11:58:27 izj6c8ba6c30va6rfy05vlz systemd: Starting Session 1 of user root .
      Feb 18 11:59:54 izj6c8ba6c30va6rfy05vlz systemd: Started Session 2 of user root.
      Feb 18 11:59:54 izj6c8ba6c30va6rfy05vlz systemd-logind: New session 2 of user ro ot.
      Feb 18 11:59:54 izj6c8ba6c30va6rfy05vlz systemd: Starting Session 2 of user root

  5. win10没有问题。iphone7 ikev2不好用。ca,p12证书都导入成功,但是仍然连不上。配置文件完全参照你的帖子,相关域名及IP都已经改成自己的了。

  6. Cisco的QuickConnect VPN在国内会被和谐吗,由于AnyConnect只是Cisco中高端产品才支持,最近打算买台Cisco路由器

  7. 一个问题想请教下,请问我有个脚本需要在每次连接ikev2的时候去运行,我应该添加在哪个配置文件的什么地方?(脚本内容为获取当前连接人的ikev2分配的内网地址),万分感谢!

发表回复

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

验证码