Love My Love

在Ubuntu和CentOS里用IPSec/IKEV2搭建VPN服务器

2015.12.19

参考文档:https://quericy.me/blog/512 一键脚本:http://quericy.me/blog/699 目前用的一键脚本:https://blog.ls20.com/ipsec-l2tp-vpn-auto-setup-for-ubuntu-12-04-on-amazon-ec2/ 一键脚本说明:https://github.com/hwdsl2/setup-ipsec-vpn

因为我的 vps 是 CentOS 系统,所以 Ubuntu 没测试,本日志主要记录我在 CentOS 上的各种操作。

编辑安装 Strongswan

安装必备库

  • Ubuntu:
apt-get update
apt-get install libpam0g-dev libssl-dev make gcc
  • CentOS:
yum update
yum install pam-devel openssl-devel make gcc

下载和解压 Strongswan

wget http://download.strongswan.org/strongswan.tar.gz
tar xzf strongswan.tar.gz
cd strongswan-*

编译Strongswan

Xen、KVM使用以下参数

./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-tools --enable-openssl --disable-gmp

OpenVZ需额外增加一个 enable-kernel-libipsec

./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-tools --enable-openssl --disable-gmp --enable-kernel-libipsec

编译安装

make; make install

编译完成后如果没有报错,且使用ipsec version指令能出现版本信息,则表示安装成功.

配置证书

  1. 生成CA证书的私钥:
ipsec pki --gen --outform pem > ca.pem
  1. 使用私钥,签名CA证书:
ipsec pki --self --in ca.pem --dn "C=com, O=myvpn, CN=VPN CA" --ca --outform pem >ca.cert.pem
  1. 生成服务器证书所需的私钥:
ipsec pki --gen --outform pem > server.pem
  1. 用CA证书签发服务器证书:

请先确认你的服务器的IP地址或域名,以后客户端连接时只能使用证书中的地址连接(多服务器使用相同根证书CA的,请先做好服务器的域名解析), 然后将下面命令中的123.123.123.123替换为自己服务器的IP地址或域名,一共需要替换两处:

ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem \
--cakey ca.pem --dn "C=com, O=myvpn, CN=123.123.123.123" \
--san="123.123.123.123" --flag serverAuth --flag ikeIntermediate \
--outform pem > server.cert.pem

注意以上命令中的”C=”和”O=”的值要与第2步CA中的C,O的值保持一致. 5. 生成客户端证书所需的私钥:

ipsec pki --gen --outform pem > client.pem
  1. 用CA签名客户端证书(C,O的值要与上面第2步CA的值一致,CN的值随意):
ipsec pki --pub --in client.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=com, O=myvpn, CN=VPN Client" --outform pem > client.cert.pem
  1. 生成pkcs12证书:
openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "client" -certfile ca.cert.pem -caname "VPN CA"  -out client.cert.p12

注意以上命令中的”-caname”后面的引号里的值必须要与第2步CA中的”CN=”的值保持一致. 8. 安装证书:

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

配置 Strongswan

  • 编辑/usr/local/etc/ipsec.conf文件:
vim /usr/local/etc/ipsec.conf

修改为以下内容:

config setup
    uniqueids=never 

conn iOS_cert
    keyexchange=ikev1
    # strongswan version >= 5.0.2, compatible with iOS 6.0,6.0.1
    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 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
  • 使用vim编辑/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
  • 使用vim编辑/usr/local/etc/ipsec.secrets文件:
: RSA server.pem
: PSK "myPSKkey"
: XAUTH "myXAUTHPass"
[用户名] %any : EAP "[密码]"

将上面的myPSKkey单词更改为你需要的PSK认证方式的密钥; 将上面的myXAUTHPass单词更改为你需要的XAUTH认证方式的密码,该认证方式的用户名是随意的; 将上面的[用户名]改为自己想要的登录名,[密码]改为自己想要的密码([]符号去掉),可以添加多行,得到多个用户,这即是使用IKEv2的用户名+密码认证方式的登录凭据.

配置防火墙

  1. 编辑/etc/sysctl.conf,将net.ipv4.ip_forward=1一行前面的#号去掉(否则Ikev2 vpn连接上后将无法访问外网),保存后执行sysctl -p(如果执行后有报错的,重新打开sysctl.conf将报错的部分#注释掉保存,直到执行sysctl -p不再报错为止)。此外,如果需要对TCP连接及速度进行进一步优化,可以参见原作者的另一篇文章《各平台vps快速搭建shadowsocks及优化总结》中的TCP部分(注意不要把现有vpn配置的ip_forward给覆盖了).
  2. 配置iptables:
  • OpenVZ执行:
  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 venet0 -p esp -j ACCEPT
  iptables -A INPUT -i venet0 -p udp --dport 500 -j ACCEPT
  iptables -A INPUT -i venet0 -p tcp --dport 500 -j ACCEPT
  iptables -A INPUT -i venet0 -p udp --dport 4500 -j ACCEPT
  iptables -A INPUT -i venet0 -p udp --dport 1701 -j ACCEPT
  iptables -A INPUT -i venet0 -p tcp --dport 1723 -j ACCEPT
  iptables -A FORWARD -j REJECT
  iptables -t nat -A POSTROUTING -s 10.31.0.0/24 -o venet0 -j MASQUERADE
  iptables -t nat -A POSTROUTING -s 10.31.1.0/24 -o venet0 -j MASQUERADE
  iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o venet0 -j MASQUERADE
  • Xen、KVM则执行:
  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 eth0 -p esp -j ACCEPT
  iptables -A INPUT -i eth0 -p udp --dport 500 -j ACCEPT
  iptables -A INPUT -i eth0 -p tcp --dport 500 -j ACCEPT
  iptables -A INPUT -i eth0 -p udp --dport 4500 -j ACCEPT
  iptables -A INPUT -i eth0 -p udp --dport 1701 -j ACCEPT
  iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT
  iptables -A FORWARD -j REJECT
  iptables -t nat -A POSTROUTING -s 10.31.0.0/24 -o eth0 -j MASQUERADE
  iptables -t nat -A POSTROUTING -s 10.31.1.0/24 -o eth0 -j MASQUERADE
  iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o eth0 -j MASQUERADE
  1. 开机自动载入iptables: - Ubuntu: iptables-save > /etc/iptables.rules cat > /etc/network/if-up.d/iptables<<EOF #!/bin/sh iptables-restore < /etc/iptables.rules EOF chmod +x /etc/network/if-up.d/iptables - CentOS: service iptables save

至此,IPSec/IKEv2 VPN便搭建好了!现在启用服务就可以使用了:ipsec start

哎。。。服务启动成功了的,但是连接不上它啊。。。 回头再整。

发表评论