搭建基于 SSL 证书认证的 strongSwan IKEv2 Server

2017-02-27 17:11:52 +08:00
 TrustyWolf

本文由 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 证书的申请这里不再叙述。

strongSwan 安装

请先开启 EPEL 源(不再叙述)

# sudo yum -y install strongswan && sudo systemctl enable strongswan

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 端需要输入)
        leftid=@server.test.v2ex
        # 总是向 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, 增强安全性
        rightid=@ios.test.v2ex

接下来申请 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

Windows 和 iOS 客户端设置

首先我们需要将 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!

7539 次点击
所在节点    Linux
18 条回复
TrustyWolf
2017-02-27 17:28:05 +08:00
补充:
关于 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
Ephzent
2017-02-27 17:37:16 +08:00
先收藏感谢,再搭建测试 :)
whx20202
2017-02-27 17:39:26 +08:00
收藏了,回家之后搞一搞
skylancer
2017-02-27 18:09:01 +08:00
先 mark 明早再看看, thx
gefranks
2017-02-27 21:23:42 +08:00
收藏,过 2 天搭的时候看
Yien
2017-02-27 21:37:48 +08:00
收藏,感谢分享!
terrancesiu
2017-02-28 00:12:35 +08:00
收藏了,非常详细!在 rhel 下我用 libreswan 实现了,但是非常折腾!
Vicer
2017-02-28 00:20:09 +08:00
....,
怎么感觉比我搭的复杂多了,另外,你这个.conf 支持的链接太少了吧,大材小用啊
phx13ye
2017-02-28 10:14:37 +08:00
有没有不导证书有比较安全通用的方法,主要给苹果手机翻墙
raysonx
2017-02-28 10:32:46 +08:00
很多年前就搞过 strongSwan 了。不过近年来经常会遇到 UDP 间歇性完全丢包,重新拨号换 IP 可解,可见某科技早已经盯上了。
testcaoy7
2017-02-28 11:08:50 +08:00
strongswan 已经支持能抵御量子计算机攻击的密钥交换和证书系统( NTRU , NewHope , BLISS ),遗憾的是只能 Linux 下在 bash 里连接
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
TrustyWolf
2017-02-28 11:16:57 +08:00
@terrancesiu 因为 RHEL/CentOS 官方需要兼容美国安全标准,所以 Libreswan 得用 NSS 来存秘钥,没有 Strongswan 来得简单明了。
tony1016
2017-02-28 11:25:50 +08:00
docker docker ,这种复杂配置就应该 docker
recall704
2017-02-28 15:40:42 +08:00
docker docker ,这种复杂配置就应该 docker +1
terrancesiu
2017-02-28 21:13:13 +08:00
@phx13ye 证书应该是非常靠谱的办法!建议这样使用!
crazyfish88
2017-10-29 10:42:34 +08:00
收藏,各个步骤写的非常清楚明了
lol173
309 天前
请教一下你们的证书从哪里申请,如何申请。小弟通过腾讯云申请的 SSL 证书,只能单域名,申请的文件类型似乎跟这里的描述对应不上。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/343572

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX