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 · 7499 次点击
    这是一个创建于 2833 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本文由 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
    补充:
    关于 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
        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  
       283 天前
    请教一下你们的证书从哪里申请,如何申请。小弟通过腾讯云申请的 SSL 证书,只能单域名,申请的文件类型似乎跟这里的描述对应不上。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2591 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:40 · PVG 13:40 · LAX 21:40 · JFK 00:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.