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. 好文章啊,不过发现两个错误
    第一个是iptables的配置iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT 应该是iptables -A FORWARD -s 10.1.0.0/24 -j ACCEPT
    另一个是 leftid = @vpn.itnmg.net 不应该带@。 我是直接用的ip地址,根据这个http://blog.csdn.net/sonflower123/article/details/52846145,应该和签证书的时候的san一样
    lz不知道我能不能转载一下你的这个文章,我会注明原作的

    • 多谢提醒, 由于文章更新过多次, 有些地方疏忽了. leftid 的写法没有错, 带不带@都可以, 其实还省略了一段用户名, 如果指定用户名,比如 xxx@vpn.itnmg.net. 那么这段配置就是针对这个 id 的, 如果没指定, 对所有id都有效.
      可以转载, 好东西大家分享.

  2. 你好,我根据文章里面生成的ca.cert.pem证书,在Mac最新的Serra系统里面,双击之后输入密码在keychain里面看不到证书啊?

  3. 你好,我不是很懂网络方面的东西,详细的按照你的方案做完后,win7上连接vpn显示策略匹配错误。我的vps是阿里云的专有网络国外的。公网ip和网卡ip不一样,公网ip是映射的。能帮大致判断下是什么问题吗?

  4. 我们公司在网络出口放了一台centos6.5的软路由,想在上面设置ipsec IKEV2客户端后自动翻墙,现在centos6.5 连上了vpn的服务器,vpn网卡绑在出口网卡上,全部流量自动翻墙,但是国内的流量我们不想翻墙再回来访问。我们有国内的IP段,想设置白名单,请问楼主有什么方法吗?或者可以在strongswan启动时,自动创建一个虚拟网卡吗?

  5. 之前 google 搜索看过好几篇 strongswan 的文章,不过没看到这篇,还是 maskray 的博客链接过来的。现在搜索「it 农民工 strongswan」也没直接找到这篇的链接,似乎没索引?

  6. Nov 11 10:33:40 14[NET] received packet: from 117.136.0.160[29775] to 172.32.2.24[500] (604 bytes)
    Nov 11 10:33:40 14[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 11 10:33:40 14[IKE] 117.136.0.160 is initiating an IKE_SA
    Nov 11 10:33:40 14[IKE] local host is behind NAT, sending keep alives
    Nov 11 10:33:40 14[IKE] remote host is behind NAT
    Nov 11 10:33:40 14[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 11 10:33:40 14[NET] sending packet: from 172.32.2.24[500] to 117.136.0.160[29775] (448 bytes)
    Nov 11 10:33:40 11[NET] received packet: from 117.136.0.160[49581] to 172.32.2.24[4500] (496 bytes)
    Nov 11 10:33:40 11[ENC] parsed IKE_AUTH request 1 [ IDi N(INIT_CONTACT) N(MOBIKE_SUP) IDr CPRQ(ADDR DHCP DNS MASK ADDR6 DHCP6 DNS6) N(ESP_TFC_PAD_N) N(NON_FIRST_FRAG) SA TSi TSr ]
    Nov 11 10:33:40 11[CFG] looking for peer configs matching 172.32.2.24[@172.32.2.24]…117.136.0.160[10.131.36.84]
    Nov 11 10:33:40 11[CFG] no matching peer config found
    Nov 11 10:33:40 11[IKE] received ESP_TFC_PADDING_NOT_SUPPORTED, not using ESPv3 TFC padding
    Nov 11 10:33:40 11[IKE] peer supports MOBIKE
    Nov 11 10:33:40 11[ENC] generating IKE_AUTH response 1 [ N(AUTH_FAILED) ]
    Nov 11 10:33:40 11[NET] sending packet: from 172.32.2.24[4500] to 117.136.0.160[49581] (80 bytes)

    您好 这是我每连接一次vpn,服务器都会产出日志。日志里没有error,但是有提示错误。然后vpn连接不上。 望您赐教,不胜感激(我是公司出口IP做了500和1500的映射到这台机器)

  7. LZ遇到过L2TP不跑流量的情况么?我搭建的L2TP协议刚连接上都正常。几秒之后不再有流量产生,但是VPN连接并不断开呢

发表回复

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

验证码