12
2019
04

在CentOS7-minimal的OpenVZ上安装Strongswan IKEv2 VPN

HQY

在OpenVZ的VPS上安装CentOS-7-minimal镜像,默认没有安装对于VPS来说消耗资源巨大的firewalld防火墙,安装的是我们熟悉的iptables,但没有激活任何规则。因此,网上流行的一键脚本(one-key-ikev2.sh)在OpenVZ+CentOS7minimal下无法正常工作(能连通VPN但是不能访问内外网资源)。
其实手动安装strongswan服务器并配置IKEv2 VPN也并不复杂,五步就能搞掂!

(一)下载Strongswan最新版

文件下载到root目录并解压:

cd ~
wget --no-check-certificate https://download.strongswan.org/strongswan-5.6.2.tar.gz
tar -xzvf strongswan-5.6.2.tar.gz

(二)配置并安装Strongswan

2.1 配置

基于OpenVZ的VPS主机需加入--enable-kernal-libipsec的配置项,进入~/strongswan-5.6.2目录,如下执行配置命令:

./configure --enable-eap-identity --enable-eap-md5 \
--enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap  \
--enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap  \
--enable-xauth-pam  --enable-dhcp  --enable-openssl  --enable-addrblock --enable-unity  \
--enable-certexpire --enable-radattr --enable-swanctl --enable-openssl --disable-gmp \
--enable-kernel-libipsec

(如果是KVM之类的主机则省略最后一个配置参数)

2.2 安装

编译安装:

make
make install

安装完毕。
这样编译安装默认的安装位置是/usr/local,因此程序会在/usr/local/sbin,而配置项则在/usr/local/etc之下。

(三)生成证书

3.1 生成证书

回到/root目录,创建keys子目录,把证书放在这里。

注: 下列命令中$VPS_Domain_IP须用VPS的域名或者IP地址替换,且这里填的是什么,在下一步的ipsec.conf文件配置时leftid参数要填相同的内容。

cd ~
mkdir keys
cd keys
ipsec pki --gen --outform pem > ca.pem
ipsec pki --self --in ca.pem --dn "C=com, O=MyVPS, CN=VPN CA" --ca --outform pem >ca.cert.pem
ipsec pki --gen --outform pem > server.pem
ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=com, O=MyVPS, CN=$VPS_Domain_IP" --san="$VPS_Domain_IP" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
ipsec pki --gen --outform pem > client.pem
ipsec pki --pub --in client.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=com, O=MyVPS, CN=VPN Client" --outform pem > client.cert.pem

3.2 放置证书

须把ca.cert.pemserver.cert.pemserver.pemclient.cert.pemclient.pem五个证书文件放置在正确的目录:

cp -f ca.cert.pem /usr/local/etc/ipsec.d/cacerts/
cp -f server.cert.pem /usr/local/etc/ipsec.d/certs/
cp -f client.cert.pem /usr/local/etc/ipsec.d/certs/
cp -f server.pem /usr/local/etc/ipsec.d/private/
cp -f client.pem  /usr/local/etc/ipsec.d/private/

(四)配置Strongswan服务器

4.1 修改ipsec.conf

修改/usr/local/etc/ipsec.conf文件(<u>注意leftid=$VPS_Domain_IP要根据3.1步骤里填写的内容修改</u>):

config setup
    uniqueids=no

conn iOS_cert
    keyexchange=ikev1
    fragmentation=yes
    left=%defaultroute
    leftauth=pubkey
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=pubkey
    rightauth2=xauth
    rightsourceip=10.31.2.0/24
    rightcert=client.cert.pem    auto=add

conn android_xauth_psk
    keyexchange=ikev1
    left=%defaultroute
    leftauth=psk
    leftsubnet=0.0.0.0/0
    right=%any
    rightauth=psk
    rightauth2=xauth
    rightsourceip=10.31.2.0/24
    auto=add

conn networkmanager-strongswan
    keyexchange=ikev2
    left=%defaultroute
    leftauth=pubkey
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=pubkey
    rightsourceip=10.31.2.0/24
    rightcert=client.cert.pem    auto=add

conn ios_ikev2
    keyexchange=ikev2
    ike=aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048!
    esp=aes256-sha256,3des-sha1,aes256-sha1!
    rekey=no
    left=%defaultroute
    leftid=$VPS_Domain_IP
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=eap-mschapv2
    rightsourceip=10.31.2.0/24
    rightsendcert=never
    eap_identity=%any
    dpdaction=clear
    fragmentation=yes    auto=add

conn windows7
    keyexchange=ikev2
    ike=aes256-sha1-modp1024!
    rekey=no
    left=%defaultroute
    leftauth=pubkey
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=eap-mschapv2
    rightsourceip=10.31.2.0/24
    rightsendcert=never
    eap_identity=%any    auto=add

4.2 配置strongswan.conf

修改/usr/local/etc/strongswan.conf如下:

charon {
        load_modular = yes
        duplicheck.enable = no
        compress = yes
        plugins {                include strongswan.d/charon/*.conf
        }
        dns1 = 8.8.8.8
        dns2 = 8.8.4.4
        nbns1 = 8.8.8.8
        nbns2 = 8.8.4.4}include strongswan.d/*.conf

4.3 修改登录用户名密码文件ipsec.secrets

修改/usr/local/etc/ipsec.secrets文件:

: RSA server.pem
: PSK "myPSKkey": XAUTH "myXAUTHPass"myUserName %any : EAP "myUserPass"

其中,myPSKkey是PSK方式的预共享密码,myUserName是VPN的登录用户名,myUserPass是登录密码,都可以按需修改。

4.5 重启strongswan服务器

ipsec restart

此时Strongswan服务器已经安装配置完毕,客户端下载/root/keys/ca.cert.pem证书并安装信任后,即可连接VPN。

注意: 由于未配置防火墙的端口转发规则,虽然能连上VPN,但仍不能正常访问内外网。

4.6 建立strongswan系统服务

/etc/systemd/system目录下建立strongswan.service文件:

[Unit]
Description=StrongSwan VPN Server
After=network.target
Wants=network.target

[Service]
Type=forking 
ExecStart=/usr/local/sbin/ipsec start 
ExecStop=/usr/local/sbin/ipsec stop
ExecReload=/usr/local/sbin/ipsec restart#KillMode=process Restart=always

[Install]
WantedBy=multi-user.target

使之随系统启动:

systemctl enable strongswan.service
systemctl start strongswan

(五)配置转发规则

5.1 系统IPv4转发

建立/etc/sysctl.d/10-ipsec.conf文件:

net.ipv4.ip_forward=1

使配置生效:

sysctl --system

5.2 配置iptables规则

  1. CentOS-7-minimal安装了iptables(小内存VPS不建议使用firewalld防火墙),因此使用iptables添加转发规则:
    注:<u>$interface是VPS的网卡接口名(OpenVZ的CentOS一般是venet0,KVM的则一般是eth0用ip addr查询)</u>

    iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -s 10.31.0.0/24  -j ACCEPT
    iptables -A FORWARD -s 10.31.1.0/24  -j ACCEPT
    iptables -A FORWARD -s 10.31.2.0/24  -j ACCEPT
    iptables -A INPUT -i $interface -p esp -j ACCEPT
    iptables -A INPUT -i $interface -p udp --dport 500 -j ACCEPT
    iptables -A INPUT -i $interface -p tcp --dport 500 -j ACCEPT
    iptables -A INPUT -i $interface -p udp --dport 4500 -j ACCEPT
    iptables -A INPUT -i $interface -p udp --dport 1701 -j ACCEPT
    iptables -A INPUT -i $interface -p tcp --dport 1723 -j ACCEPT

  2. <u>如果有固定IP</u>,则添加SNAT规则:

    iptables -t nat -A POSTROUTING -s 10.31.0.0/24 -o $interface -j SNAT --to-source $static_ip
    iptables -t nat -A POSTROUTING -s 10.31.1.0/24 -o $interface -j SNAT --to-source $static_ip
    iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o $interface -j SNAT --to-source $static_ip

    <u>若没有固定IP</u>,则添加以下规则:

    iptables -t nat -A POSTROUTING -s 10.31.0.0/24 -o $interface -j MASQUERADE
    iptables -t nat -A POSTROUTING -s 10.31.1.0/24 -o $interface -j MASQUERADE
    iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o $interface -j MASQUERADE

5.3 开机恢复iptables规则

OpenVZ的iptables
  1. 先导出iptables的规则到/etc/iptables.rules文件:

    iptables-save > /etc/iptables.rules

  2. 添加恢复iptables规则的命令至系统启动脚本/etc/rc.local,并激活:

    echo "iptables-restore < /etc/iptables.rules" >> /etc/rc.local
    chmod +x /etc/rc.d/rc.local

KVM的iptables
  1. 很简单:

    service iptables save

至此,strongswan VPN安装配置完毕。

(六)客户端设置

6.1 Windows 10的VPN连接设置

由于Windows 10的Agile VPN客户端默认只支持AES-128-CBC, AES-192-CBC, AES-256-CBC, 3DES, SHA-1,SHA-256, SHA-384 and MODP-1024加密协议,而strongSwan 5.6.0版本以后已经不接受MODP-1024协议(需要MODP-2048或以上的加密协议)了,因此即使在服务器的ipsec.conf文件中配置MODP-1024的DH组服务器也不会生效,这会由于没有支持的协议导致匹配不到合适的SA策略而造成连接失败。解决办法是要么将服务器退回5.5.3或更低的版本,要么调整Windows的设置让客户端支持MODP-2048的协议。
Windows 10是支持MODP-2048协议的,但是微软很奇葩地默认禁用了AES-256-CBS和MODP-2048,打开这两个协议需要在注册表中建立以下的DWORD键(用注册表编辑器regedit.exe,你懂的):
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters\NegotiateDH2048_AES256    
键值0、1、2分别代表:

键值含义
0 (默认)禁用AES-256-CBC和MODP-2048
1启用AES-256-CBC和MODP-2048
2强制使用AES-256-CBC和MODP-2048

折腾完注册表之后,Windows就可以正常和服务器建立IKEv2/IPSec的VPN连接了。

后记

strongSwan在5.2.0版本开始,引入了charon-systemd模式,目的是使用swanctl后台取代ipsecstarterstroke后台。charon-systemd模式使用strongswan-swanctl.service服务来管理strongSwan服务器。在编译时加入--enable-systemd --enable-swanctl参数开启charon-systemd模式:

./configure --enable-eap-identity --enable-eap-md5 --enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap --enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap --enable-xauth-pam  --enable-dhcp  --enable-openssl  --enable-addrblock --enable-unity --enable-certexpire --enable-radattr --enable-swanctl --enable-openssl --disable-gmp --enable-kernel-libipsec --enable-xauth-noauth --enable-systemd --enable-swanctl

** 注:**
编译charon-systemd模式需要用到systemd-daemon的库文件,因此需要安装systemd-devel包(执行yum install systemd-devel)。
--enable-xauth-noauth     开启xauth-noauth模式,它是个假的XAUTH认证,任何用户名和密码都能登陆。给没有XAUTH的设备用。
--enable-kernel-libipsec   使用strongSwan自带的用户IPSec空间需要使用内核libipsec库,因此编译时需加上。

systemd-daemon的模式使用swanctl.conf来配置服务器,跟ipsec.conf不一样,鄙人还没有空研究,反正ipsec starter还没有淘汰,暂时先凑合用吧。等有需求(比如说需要用strongMan图形化管理strongswan服务器的时候)或者迫不得已时(因为strongswan官方已经说starter方式已经停止开发了)再说吧。又或者哪天闲得蛋疼再去看看文档试一下。(^_?)?☆



作者:Wilson_Li
链接:https://www.jianshu.com/p/079abb4d9617
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


HQY
« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。