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

更新于 2016-07-16

最近感觉我国”建筑行业龙头企业”的施工水平又有提升, 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.》上有86条评论

  1. iOS连接IKEV2需要填本地ID,本地ID可以随便填。IKEV2可能会和443端口的AnyConnect或HTTPS服务产生冲突。

  2. 写得好详细啊,最近一直在折腾这个,一直没成功,
    楼主知不知道ipsec的日志在哪里?我server建好之后,win10客户端这边一连就报错,我想看下请求有没有到server,和返回的具体错误是什么,看不到日志根本没法查

      • 哇,非常谢谢楼主这么长时间的文章还这么快的回复
        话说strongswan的日志是输出在哪的?详细程度的参数又是哪个?我都搜了好久都没找到,我每次都是ipsec start –nofork在终端上一直打印日志看的,感觉很不方便;
        另外,我按照你的方法,已经搭建成功了,但是win10下只能连接1分钟,到了1分钟不管做什么都会自己断开,我尝试修改了很多keylife、time这些相关的参数,但是没有效果,楼主有什么建议没?
        还有就是ios和mac os端我也试了,这两个需要填remote id,我不知道具体是填哪个,我尝试填了server.cert.pem和ca.cert.pem里面CN的内容,但是还是不能连,vpn开关点一下就关了,server上收到一个192.168.1.10 is initiating an IKE_SA,然后就没动静了,还希望楼主能指导下

          • 嗯,left id我刚刚看到了,我一直以为我填的就是本机ip,结果是%any

            那楼主对win10下1分钟自动断开这个问题有什么建议没?可能是哪个参数或者原因导致的呢?

          • 哦,对了,还有strongswan的日志输出和debug等级是在哪儿修改的?
            刚刚发现win7不会自动断开=。=,公司3个win10都是1分钟准时断,想查原因

          • # increase default loglevel for all daemon subsystems
            default = 1
            这个是配置日志详细度, 具体的数值goole一下.
            win10的你看一下有没有按照我最后的配置方法做. 比如证书, dns配置.

          • 呃。。。。楼主我又来了,经过一天的折腾,现在就是除了win10各种系统都正常了,win10我按照你的方法改pem后缀导入证书,还是1分钟就挂了
            因为其他系统都没问题了,所以我就几乎没有从server端的参数去排查了,我感觉还是像win10又什么安全设置之类的导致了这个问题,我查win10的系统日志,里面提示断开连接 原因代码829,我去ms官网去查,微软的解释是vpn server的网络问题,但这个应该不可能,所以现在win10这个依然找不到什么方法可参考,还希望楼主能帮忙分析下

  3. Jan 5 13:08:36 05[NET] received packet: from 114.240.134.250[500] to 47.88.25.41[500] (604 bytes)
    Jan 5 13:08:36 05[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) ]
    Jan 5 13:08:36 05[IKE] 114.240.134.250 is initiating an IKE_SA
    Jan 5 13:08:36 05[IKE] remote host is behind NAT
    Jan 5 13:08:36 05[ENC] generating IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(MULT_AUTH) ]
    Jan 5 13:08:36 05[NET] sending packet: from 47.88.25.41[500] to 114.240.134.250[500] (448 bytes)
    Jan 5 13:08:36 12[NET] received packet: from 114.240.134.250[4500] to 47.88.25.41[4500] (512 bytes)
    Jan 5 13:08:36 12[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 ]
    Jan 5 13:08:36 12[CFG] looking for peer configs matching 47.88.25.41[vpn.mumov.com]…114.240.134.250[keensting]
    Jan 5 13:08:36 12[CFG] selected peer config ‘ikev2-eap’
    Jan 5 13:08:36 12[IKE] initiating EAP_IDENTITY method (id 0x00)
    Jan 5 13:08:36 12[IKE] received ESP_TFC_PADDING_NOT_SUPPORTED, not using ESPv3 TFC padding
    Jan 5 13:08:36 12[IKE] peer supports MOBIKE
    Jan 5 13:08:36 12[IKE] authentication of ‘vpn.mumov.com’ (myself) with RSA signature successful
    Jan 5 13:08:36 12[IKE] sending end entity cert “C=CN, O=Mumov, CN=vpn.mumov.com”
    Jan 5 13:08:36 12[ENC] generating IKE_AUTH response 1 [ IDr CERT AUTH EAP/REQ/ID ]
    Jan 5 13:08:36 12[ENC] splitting IKE message with length of 1216 bytes into 3 fragments
    Jan 5 13:08:36 12[ENC] generating IKE_AUTH response 1 [ EF(1/3) ]
    Jan 5 13:08:36 12[ENC] generating IKE_AUTH response 1 [ EF(2/3) ]
    Jan 5 13:08:36 12[ENC] generating IKE_AUTH response 1 [ EF(3/3) ]
    Jan 5 13:08:36 12[NET] sending packet: from 47.88.25.41[4500] to 114.240.134.250[4500] (532 bytes)
    Jan 5 13:08:36 12[NET] sending packet: from 47.88.25.41[4500] to 114.240.134.250[4500] (532 bytes)
    Jan 5 13:08:36 12[NET] sending packet: from 47.88.25.41[4500] to 114.240.134.250[4500] (292 bytes)

  4. Dec 27 13:38:28 05[CFG] received stroke: add connection ‘ikev2-eap’
    Dec 27 13:38:28 05[CFG] adding virtual IP address pool 10.1.0.0/16
    Dec 27 13:38:28 05[LIB] opening ‘/etc/strongswan/ipsec.d/certs/server.cert.pem’ failed: No such file or directory
    Dec 27 13:38:28 05[LIB] building CRED_CERTIFICATE – ANY failed, tried 1 builders
    Dec 27 13:38:28 05[CFG] loading certificate from ‘server.cert.pem’ failed
    Dec 27 13:38:28 05[CFG] CA certificate “C=CN, O=ITnmg, CN=ITnmg StrongSwan CA” not found, discarding CA constraint
    Dec 27 13:38:28 05[CFG] added configuration ‘ikev2-eap’
    Dec 27 13:40:18 14[NET] received packet: from 27.149.199.7[7130] to 47.90.77.159[500] (604 bytes)
    Dec 27 13:40:18 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) ]
    Dec 27 13:40:18 14[IKE] 27.149.199.7 is initiating an IKE_SA
    Dec 27 13:40:18 14[IKE] remote host is behind NAT
    Dec 27 13:40:18 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) ]
    Dec 27 13:40:18 14[NET] sending packet: from 47.90.77.159[500] to 27.149.199.7[7130] (448 bytes)
    Dec 27 13:40:18 09[NET] received packet: from 27.149.199.7[7131] to 47.90.77.159[4500] (496 bytes)
    Dec 27 13:40:18 09[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 ]
    Dec 27 13:40:18 09[CFG] looking for peer configs matching 47.90.77.159[vpn.itnmg.net]…27.149.199.7[10.17.128.255]
    Dec 27 13:40:18 09[CFG] selected peer config ‘ikev2-eap’
    Dec 27 13:40:18 09[IKE] initiating EAP_IDENTITY method (id 0x00)
    Dec 27 13:40:18 09[IKE] received ESP_TFC_PADDING_NOT_SUPPORTED, not using ESPv3 TFC padding
    Dec 27 13:40:18 09[IKE] peer supports MOBIKE
    Dec 27 13:40:18 09[IKE] no private key found for ‘vpn.itnmg.net’
    Dec 27 13:40:18 09[ENC] generating IKE_AUTH response 1 [ N(AUTH_FAILED) ]
    Dec 27 13:40:18 09[NET] sending packet: from 47.90.77.159[4500] to 27.149.199.7[7131] (80 bytes)
    您好….
    这个是 leftid 的问题吗
    no private key found for ‘vpn.itnmg.net’

  5. Dec 27 13:06:58 00[DMN] Starting IKE charon daemon (strongSwan 5.4.0, Linux 3.10.0-123.9.3.el7.x86_64, x86_64)
    Dec 27 13:06:58 00[LIB] openssl FIPS mode(2) – enabled
    Dec 27 13:06:58 00[CFG] loading ca certificates from ‘/etc/strongswan/ipsec.d/cacerts’
    Dec 27 13:06:58 00[CFG] loading aa certificates from ‘/etc/strongswan/ipsec.d/aacerts’
    Dec 27 13:06:58 00[CFG] loading ocsp signer certificates from ‘/etc/strongswan/ipsec.d/ocspcerts’
    Dec 27 13:06:58 00[CFG] loading attribute certificates from ‘/etc/strongswan/ipsec.d/acerts’
    Dec 27 13:06:58 00[CFG] loading crls from ‘/etc/strongswan/ipsec.d/crls’
    Dec 27 13:06:58 00[CFG] loading secrets from ‘/etc/strongswan/ipsec.secrets’
    Dec 27 13:06:58 00[LIB] opening ‘/etc/strongswan/ipsec.d/private/server.key.pem’ failed: No such file or directory
    Dec 27 13:06:58 00[LIB] building CRED_PRIVATE_KEY – RSA failed, tried 10 builders
    Dec 27 13:06:58 00[CFG] loading private key from ‘/etc/strongswan/ipsec.d/private/server.key.pem’ failed
    Dec 27 13:06:58 00[CFG] loaded IKE secret for %any
    Dec 27 13:06:58 00[CFG] loaded EAP secret for liyuyang
    Dec 27 13:06:58 00[CFG] loaded EAP secret for xujinghong
    Dec 27 13:06:58 00[CFG] loaded EAP secret for user1_xauth
    Dec 27 13:06:58 00[LIB] loaded plugins: charon aes des rc2 sha2 sha1 md4 md5 random nonce x509 revocation constraints acert pubkey pkcs1 pkcs8 pkcs12 pgp dnskey sshkey pem openssl gcrypt fips-prf gmp xcbc cmac hmac ctr ccm gcm curl attr kernel-netlink resolve socket-default farp stroke vici updown eap-identity eap-md5 eap-gtc eap-mschapv2 eap-tls eap-ttls eap-peap xauth-generic xauth-eap xauth-pam xauth-noauth dhcp
    Dec 27 13:06:58 00[JOB] spawning 16 worker threads

    您好请问这样的运行有错误是吧

    我的客户端连接不上

    • Dec 27 13:17:53 05[NET] received packet: from 124.72.170.209[500] to 47.90.77.159[500] (604 bytes)
      Dec 27 13:17:53 05[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(REDIR_SUP) N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) ]
      Dec 27 13:17:53 05[IKE] no IKE config found for 47.90.77.159…124.72.170.209, sending NO_PROPOSAL_CHOSEN
      Dec 27 13:17:53 05[ENC] generating IKE_SA_INIT response 0 [ N(NO_PROP) ]
      Dec 27 13:17:53 05[NET] sending packet: from 47.90.77.159[500] to 124.72.170.209[500] (36 bytes)

      然后登陆的时候这样……….大概是什么原因呢?

发表评论

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

验证码 *