搭建基于 SSL 证书认证的 strongSwan IKEv2 Server - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
TrustyWolf
V2EX    Linux

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

  •  
  •   TrustyWolf
    trustywolf 2017-02-27 17:11:52 +08:00 8105 次点击
    这是一个创建于 3158 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本文由 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 证书的认证无疑是更优选择。

    • 示例环境使用了 RHEL/CentOS 7 with EPEL repository, 其他发行版配置大同小异。
    • 示例的场景是大家最常用的:接入网关 Site/Point to the Internet
    • 示例使用了一个域名: test.v2ex
    • 示例兼容: Windows 7+ iOS9+ 以及 OSX, Android 需要使用 strongSwan 客户端

    关于域名的购入(可以使用免费的 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 端需要输入) [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 

    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!

    第 1 条附言    2017-02-27 17:46:38 +08:00
    示例中的配置文件强制使用了 modp2048, 可能会造成未修改过注册表的 Win7 不兼容,解决方法是先注释掉那两行或者按照 1 楼的提示修改注册表,谢谢!
    18 条回复    2024-02-21 14:43:23 +08:00
    TrustyWolf
        1
    TrustyWolf  
    OP
       2017-02-27 17:28:05 +08:00
    补充:
    关于 Winows 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
        2
    Ephzent  
       2017-02-27 17:37:16 +08:00
    先收藏感谢,再搭建测试 :)
    whx20202
        3
    whx20202  
       2017-02-27 17:39:26 +08:00
    收藏了,回家之后搞一搞
    skylancer
        4
    skylancer  
       2017-02-27 18:09:01 +08:00 via Android
    先 mark 明早再看看, thx
    gefranks
        5
    gefranks  
       2017-02-27 21:23:42 +08:00
    收藏,过 2 天搭的时候看
    Yien
        6
    Yien  
       2017-02-27 21:37:48 +08:00 via iPhone
    收藏,感谢分享!
    terrancesiu
        7
    terrancesiu  
       2017-02-28 00:12:35 +08:00
    收藏了,非常详细!在 rhel 下我用 libreswan 实现了,但是非常折腾!
    Vicer
        8
    Vicer  
       2017-02-28 00:20:09 +08:00 via Android
    ....,
    怎么感觉比我搭的复杂多了,另外,你这个.conf 支持的链接太少了吧,大材小用啊
    phx13ye
        9
    phx13ye  
       2017-02-28 10:14:37 +08:00
    有没有不导证书有比较安全通用的方法,主要给苹果手机翻墙
    raysonx
        10
    raysonx  
       2017-02-28 10:32:46 +08:00
    很多年前就搞过 strongSwan 了。不过近年来经常会遇到 UDP 间歇性完全丢包,重新拨号换 IP 可解,可见某科技早已经盯上了。
    testcaoy7
        11
    testcaoy7  
       2017-02-28 11:08:50 +08:00
    strongswan 已经支持能抵御量子计算机攻击的密钥交换和证书系统( NTRU , NewHope , BLISS ),遗憾的是只能 Linux 下在 bash 里连接
    testcaoy7
        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
    TrustyWolf
        13
    TrustyWolf  
    OP
       2017-02-28 11:16:57 +08:00
    @terrancesiu 因为 RHEL/CentOS 官方需要兼容美国安全标准,所以 Libreswan 得用 NSS 来存秘钥,没有 Strongswan 来得简单明了。
    tony1016
        14
    tony1016  
       2017-02-28 11:25:50 +08:00
    docker docker ,这种复杂配置就应该 docker
    recall704
        15
    recall704  
       2017-02-28 15:40:42 +08:00
    docker docker ,这种复杂配置就应该 docker +1
    terrancesiu
        16
    terrancesiu  
       2017-02-28 21:13:13 +08:00
    @phx13ye 证书应该是非常靠谱的办法!建议这样使用!
    crazyfish88
        17
    crazyfish88  
       2017-10-29 10:42:34 +08:00
    收藏,各个步骤写的非常清楚明了
    lol173
        18
    lol173  
       2024-02-21 14:43:23 +08:00
    请教一下你们的证书从哪里申请,如何申请。小弟通过腾讯云申请的 SSL 证书,只能单域名,申请的文件类型似乎跟这里的描述对应不上。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3318 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 11:03 PVG 19:03 LAX 04:03 JFK 07:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86