本文由 Trusty Wolf 发表于 V2EX, 通过 CC BY-SA 3.0 协议授权, 转载请注明出处。
图片来源: https://hub.zhovner.com
IKEv2 作为最新的 IPsec 秘钥交换协议,大幅增强了对移动设备等经常变化的网络环境的支持(MOBIKE)。 其对于 NAT traversal 的功能支持也较 IKEv1 大幅改观。 但是由于相关软件的学习路线较为陡峭,且中文资料较少,对新手并不太友好。 小狼也是经过长时间的入门和摸索,逐步积累出了以下一些资料和配置文件。 重要的部分都加以中文注释,以降低大家理解的难度。
随着 SSL 证书的廉价化 /免费化,获得一个 SSL 证书也并不是什么复杂的事情。 但是 SSL 证书除了 HTTPS 之外其实还有一个非常实用的功能,进行 IKEv2 身份认证。 当然,由于 SSL 证书的 CA 都是公共的,虽然可以通过 ID 来限制客户端, 但客户端也有可能因为域名被盗等原因有被冒充的风险,所以如果是企业的生产环境, 还是使用自签名的 CA 和证书比较保险。
有人可能会说,用 EAP-MSCHAPv2 多方便,无需客户端证书,设置账号密码即可。 但请注意, MSCHAPv2 是一个非常老的协议,在现时基于 RSA 证书的认证无疑是更优选择。
关于域名的购入(可以使用免费的 eu.org 域名), DNS 的设置以及 SSL 证书的申请这里不再叙述。
请先开启 EPEL 源(不再叙述)
# sudo yum -y install strongswan && sudo systemctl enable strongswan
HQ 端
# sudo vi /etc/strongswan/ipsec.conf
在最后添加一行
include ikev2.conf
然后修改 ikev2.conf 配置文件
# sudo vi /etc/strongswan/ikev2.conf
# ikev2.conf
# 默认连接设置
conn %default
# General Connection Parameters
# IKEv2
keyexchange=ikev2
# 指定加密算法, ESP 包为了兼容 WIN7 添加了 SHA1 支持
# 请参考: http://wiki.strongswan.org/projects/strongswan/wiki/SecurityRecommendations
# 加密算法的选择会对传输性能产生较大影响
# 一般情况下建议注释掉以下两行,在 Branch 端路由器中调整相关设置
ike=aes128-sha256-modp2048,aes256-sha256-modp2048!
esp=aes128-sha256-modp2048,aes128-sha256,aes128-sha1!
# strongSwan 启动时该连接的行为(自动添加连接)
auto=add
# RFC2393 IP 有效载荷压缩协议(IPComp)
compress=yes
# 当意外断开后清除连接, 开启 Dead Peer Detection (DPD)
dpdaction=clear
# 调高 DPD 延时, 让 MOBIKE(IKEv2 Mobility and Multihoming) 起作用
#dpdtimeout=360s
# 关闭服务端的 re-key, 兼容 Windows
rekey=no
# 支持 IKEv2 数据包分片 RFC 7383
# 客户端可能会出现兼容性问题, 请务必测试一下
fragmentation=yes
# 服务器端接口为本机默认路由
left=%defaultroute
# HQ 端虚拟地址
leftsourceip=1.2.3.1
# HQ 端下发默认路由给 Branch 端
leftsubnet=0.0.0.0/0
# 服务器证书
leftcert=server.crt
# 服务器 ID(IOSBranch 端需要输入)
[email protected]
# 总是向 Branch 端发送证书(解决 IOSBranch 端兼容问题)
leftsendcert=always
# Branch 端不限制 IP 地址
right=%any
# Branch 端 CA 与 HQ 端一致
rightca=%same
# Branch 端 DNS
rightdns=8.8.8.8
# Windows IKEv2 Machine Certificate
conn IKEv2_WIN
# Branch 端虚拟地址
rightsourceip=1.2.3.2/28
# 指定 Branch 端证书的 ID(SAN 字段), 增强安全性, 适用于使用公共 CA 的场合
# 如果使用自签 CA 和证书, 则无需指定 ID, 注释掉即可
rightid="CN=win.test.v2ex"
# iOS IKEv2 EAP-TLS Certificate
conn IKEv2_iOS
#指定认证模式为 EAP-TLS
rightauth=eap-tls
eap_identity=%identity
# Branch 端虚拟地址
rightsourceip=1.2.3.16/28
# 指定 Branch 端 ID, 增强安全性
[email protected]
接下来申请 SSL 证书,示例里用到了三个,分别是: server.test.v2ex win.test.v2ex ios.test.v2ex 申请完毕之后会得到相应的证书.crt 文件和秘钥.key 文件, 然后为了补全证书链我们还需要 CA.crt 和 ROOT.crt 文件, 这些相信稍微配置过 HTTPS 服务器的各位都应该了解。 在 IKEv2 的服务端,我们只需要 server.test.v2ex 的证书,秘钥以及链证书。
# sudo cp server.crt /etc/strongswan/ipsec.d/certs/
# sudo cp ca.crt /etc/strongswan/ipsec.d/cacerts/
# sudo cp root.crt /etc/strongswan/ipsec.d/cacerts/
# sudo chmod 640 /etc/strongswan/ipsec.d/certs/server.crt
# sudo chmod 640 /etc/strongswan/ipsec.d/cacerts/*.crt
# sudo cp server.key /etc/strongswan/ipsec.d/private/
# sudo chmod 600 /etc/strongswan/ipsec.d/private/server.key
接下来编辑 ipsec.secrets 文件
# sudo vi /etc/strongswan/ipsec.secrets
增加一行
: RSA server.key
接下来进行 Firewalld 防火墙的设置 注意, Firewalld 在设置 MASQUERADE 之后会自动添加 net.ipv4.ip_forward=1, 所以无需修改 /etc/sysctl.conf 文件
# sudo firewall-cmd --permanent --add-service=ipsec
# sudo firewall-cmd --permanent --add-masquerade
# sudo firewall-cmd --reload
最后启动 strongSwan, HQ 端就设置完成了
# sudo systemctl start strongswan
首先我们需要将 win.test.v2ex 和 ios.test.v2ex 的 SSL 证书转换成可导入的 pkcs12 格式
为了安全起见, 最好设置一下导入导出的密码
# openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt
这样我们就得到了 client.pfx 文件,将其导入至相应客户端中即可。 详情请参考:
iOS 只需要通过邮件和浏览器下载 client.pfx 文件, 打开之后输入密码导入即可。
配置 IKEv2 时注意选择相应的证书配置文件,已经别忘记输入服务器和客户端 ID(即为相应域名)。
Enjoy!
1
TrustyWolf OP 补充:
关于 Windows 7 DH group 14 (MODP2048) 和 SHA256 支持 默认情况下, Windows 7 只支持 DH group 2 (MODP1024) 和 SHA1 进行 IKE 协商 为了提升安全性,我们可以通过修改注册表获得更强的 DH 和 SHA 算法的支持 详情: https://wiki.strongswan.org/projects/strongswan/wiki/Windows7#AES-256-CBC-and-MODP2048 |
2
Ephzent 2017-02-27 17:37:16 +08:00
先收藏感谢,再搭建测试 :)
|
3
whx20202 2017-02-27 17:39:26 +08:00
收藏了,回家之后搞一搞
|
4
skylancer 2017-02-27 18:09:01 +08:00 via Android
先 mark 明早再看看, thx
|
5
gefranks 2017-02-27 21:23:42 +08:00
收藏,过 2 天搭的时候看
|
6
Yien 2017-02-27 21:37:48 +08:00 via iPhone
收藏,感谢分享!
|
7
terrancesiu 2017-02-28 00:12:35 +08:00
收藏了,非常详细!在 rhel 下我用 libreswan 实现了,但是非常折腾!
|
8
Vicer 2017-02-28 00:20:09 +08:00 via Android
....,
怎么感觉比我搭的复杂多了,另外,你这个.conf 支持的链接太少了吧,大材小用啊 |
9
phx13ye 2017-02-28 10:14:37 +08:00
有没有不导证书有比较安全通用的方法,主要给苹果手机翻墙
|
10
raysonx 2017-02-28 10:32:46 +08:00
很多年前就搞过 strongSwan 了。不过近年来经常会遇到 UDP 间歇性完全丢包,重新拨号换 IP 可解,可见某科技早已经盯上了。
|
11
testcaoy7 2017-02-28 11:08:50 +08:00
strongswan 已经支持能抵御量子计算机攻击的密钥交换和证书系统( NTRU , NewHope , BLISS ),遗憾的是只能 Linux 下在 bash 里连接
|
12
testcaoy7 2017-02-28 11:11:31 +08:00
源里的 strongswan 版本比较旧,我发一个自用的从源码编译的步骤,开启了大多数加密功能,以及 AES-NI 和 Intel 处理器的真随机数生成器
apt-get install libssl-dev build-essential libgcrypt20-dev libsoup2.4-dev libgmp-dev libsystemd-dev iptables-dev libcurl4-openssl-dev binutils-dev ./configure --prefix=/usr --sysconfdir=/etc --enable-acert --enable-addrblock --enable-aesni --enable-af-alg --enable-ccm --enable-chapoly --enable-certexpire --enable-ctr --enable-dhcp --enable-eap-dynamic --enable-eap-identity --enable-eap-md5 --enable-eap-mschapv2 --enable-eap-peap --enable-eap-tls --enable-eap-ttls --enable-error-notify --enable-farp --enable-files --enable-forecast --enable-gcm --enable-gcrypt --enable-md4 --enable-openssl --enable-sha3 --enable-soup --enable-systemd --enable-whitelist --enable-xauth-eap --enable-xauth-noauth --enable-attr-sql --enable-bfd-backtraces --enable-bliss --enable-curl --enable-newhope --enable-ntru --enable-mgf1 --enable-cmd --enable-dhcp --enable-sha3 --enable-rdrand --enable-socket-dynamic 苹果系统或是 Kernel 不支持 IPSEC 的话,还要加上--enable-kernel-libipsec --enable-libipsec |
13
TrustyWolf OP @terrancesiu 因为 RHEL/CentOS 官方需要兼容美国安全标准,所以 Libreswan 得用 NSS 来存秘钥,没有 Strongswan 来得简单明了。
|
14
tony1016 2017-02-28 11:25:50 +08:00
docker docker ,这种复杂配置就应该 docker
|
15
recall704 2017-02-28 15:40:42 +08:00
docker docker ,这种复杂配置就应该 docker +1
|
16
terrancesiu 2017-02-28 21:13:13 +08:00
@phx13ye 证书应该是非常靠谱的办法!建议这样使用!
|
17
crazyfish88 2017-10-29 10:42:34 +08:00
收藏,各个步骤写的非常清楚明了
|
18
lol173 278 天前
请教一下你们的证书从哪里申请,如何申请。小弟通过腾讯云申请的 SSL 证书,只能单域名,申请的文件类型似乎跟这里的描述对应不上。
|