使用strongswan创建ipsec/IKEv2 VPN

1,安装必须的库
Ubuntu:

apt-get update
apt-get install libpam0g-dev libssl-dev make gcc

CentOS:

yum update
yum install pam-devel openssl-devel make gcc

2,下载strongswan并解压(*代表当前Strongswan版本号)

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

3,编译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
ps:\为换行符。输入时不要打进去

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

4,编译并安装:

1 make; make install

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

 

配置证书

1,生成CA证书的私钥

ipsec pki --gen --outform pem > ca.pem

2,使用私钥,签名CA证书

ipsec pki –self –in ca.pem –dn “C=com, O=myvpn, CN=VPN CA” –ca –outform pem >ca.cert.pem
提示:多个vps使用同个CA根证书:
如果需要多个vps使用同一个CA根证书,则以上两步只执行一次,之后所有vps都使用上面生成的这两个ca.pem和ca.cert.pem文件进行后续的操作.
然后把多台vps解析到同一个域名的不同二级域名下.
这样客户端连接各个服务器时,只需要客户端安装一次根证书ca.cert.pem即可.

3,生成服务器证书所需的私钥:

ipsec pki --gen --outform pem > server.pem

4,用CA证书签发服务器证书

请先确认你的服务器的IP地址或域名,以后客户端连接时只能使用证书中的地址连接(多服务器使用相同根证书CA的,请先做好服务器的域名解析),
然后将下面命令中的x.x.x.x替换为自己服务器的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,生成客户端证书所需的私钥:

1 ipsec pki --gen --outform pem > client.pem

6,用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

7,生成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,安装证书:

1 cp -r ca.cert.pem /usr/local/etc/ipsec.d/cacerts/
2 cp -r server.cert.pem /usr/local/etc/ipsec.d/certs/
3 cp -r server.pem /usr/local/etc/ipsec.d/private/
4 cp -r client.cert.pem /usr/local/etc/ipsec.d/certs/
5 cp -r client.pem /usr/local/etc/ipsec.d/private/
将上面得到的ca证书(ca.cert.pem)、客户证书(client.pem, client.cert.pem)、p12证书(client.cert.p12)打包发给客户端用户安装、建立VPN链接。

 

配置Strongswan

1,编辑/usr/local/etc/ipsec.conf文件:

1 vim /usr/local/etc/ipsec.conf

修改为以下内容:

 config setup
uniqueids=neverconn 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=addconn 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=addconn 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=addconn 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

2,使用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

3,使用vim编辑/usr/local/etc/ipsec.secrets文件:

 : RSA server.pem
: PSK “myPSKkey”
 : XAUTH “myXAUTHPass”
用户名 %any : EAP “密码”

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

提示:wp8.1客户端连接的用户名问题
由于wp8.1连接IKEv2的vpn时,默认会加上与手机名称相同的域,于是连接时会显示用户名或密码错误.这里有两种解决方法:
方法1:将上面/usr/local/etc/ipsec.secrets文件的最后一行改为%any %any : EAP “[密码]” ,这样就可以使用任意用户名登录,带上域也不会出错.
方法2:用FreeRADIUS过滤掉登录名的域,参考连接:让FreeRADIUS去掉登陆用户名中的Windows登录域

 

配置防火墙

1,编辑/etc/sysctl.conf,将net.ipv4.ip_forward=1一行前面的#号去掉,保存后执行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

3,开机自动载入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

 

客户端设置

Windows XP/Vista

注意 XP/Vista 本身不支持纯 IPsec 连接。如果使用 L2TP/IPsec 模式,使用证书会 fallback 到 iOS_cert 这个连接类型,使用预共享密码会 fallback 到 android-xauth-psk 这个连接类型。

使用 Shrew Soft VPN Client

下载:https://www.shrew.net/download/vpn

安装后打开,选「Add」:

  • 「General」选项卡下,把「Host Name or IP address」添好
  • 「Authorization」选项卡下:
    • 「Authorization Method」选「Mutual PSK + XAuth」
    • 「Local Identity」的「Identification Type」选「IP Address」
    • 「Credentials」下面「Pre Shared Key」里输入 PSK 密码
  • 「Phrase 1」,「Exchange Type」选「Main」
  • 「Phrase 2」,「PFS Exchange」选「auto」

保存。连接时用户名密码是你的 XAUTH 用户名密码。

服务器端对应的配置是 android-xauth-psk 的连接类型。

Windows 7+

使用 Shrew Soft VPN Client 客户端:和上面 XP 的一样。

使用自带客户端(Agile):

导入证书:

  • 开始菜单搜索「cmd」,打开后输入 mmc(Microsoft 管理控制台)。
  • 「文件」-「添加/删除管理单元」,添加「证书」单元
  • 证书单元的弹出窗口中一定要选「计算机账户」,之后选「本地计算机」,确定。
  • 在左边的「控制台根节点」下选择「证书」-「个人」,然后选右边的「更多操作」-「所有任务」-「导入」打开证书导入窗口。
  • 选择刚才生成的 client.cert.p12 文件。下一步输入私钥密码。下一步「证书存储」选「个人」。
  • 导入成功后,把导入的 CA 证书剪切到「受信任的根证书颁发机构」的证书文件夹里面。
  • 打开剩下的那个私人证书,看一下有没有显示「您有一个与该证书对应的私钥」,以及「证书路径」下面是不是显示「该证书没有问题」。
  • 然后关闭 mmc,提示「将控制台设置存入控制台1吗」,选「否」即可。

至此,证书导入完成。

注意 千万不要双击 .p12 证书导入!因为那样会导入到当前用户而不是本机计算机中,ipsec 守护精灵是访问不了它的。

建立连接:

  • 「控制面板」-「网络和共享中心」-「设置新的连接或网络」-「连接到工作区」-「使用我的 Internet 连接」
  • Internet 地址写服务器地址,注意事项同 openSUSE 的,都是 IP 或都是 URL。
  • 描述随便写。
  • 用户名密码写之前配置的 EAP 的那个。
  • 确定
  • 点击右下角网络图标,在新建的 VPN 连接上右键属性然后切换到「安全」选项卡。
  • VPN 类型选 IKEv2
  • 数据加密是「需要加密」
  • 身份认证这里需要说一下,如果想要使用 EAP-MSCHAPV2 的话就选择「使用可扩展的身份认证协议」-「Microsoft 安全密码」,想要使用私人证书认证的话就选择「使用计算机证书」。

strongswan官网客户端连接指导:

 

Windows 7, 8, 8.1

导入证书 https://wiki.strongswan.org/projects/strongswan/wiki/Win7Certs

设置 https://wiki.strongswan.org/projects/strongswan/wiki/Win7Config

连接 https://wiki.strongswan.org/projects/strongswan/wiki/Win7Connect

Windows Vista

https://wiki.strongswan.org/projects/strongswan/wiki/WindowsVista

OS X and iOS

https://wiki.strongswan.org/projects/strongswan/wiki/IOS_%28Apple%29#iOS-client-configuration

Android

原生的(IKE)和strongSwan客户端(IKEv2)都可以。strongSwan客户端更快更稳定。

优化TCP:

编辑/etc/sysctl.conf

fs.file-max = 51200
#提高整个系统的文件限制
net.ipv4.tcp_syncookies = 1
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 0
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
#为了对NAT设备更友好,建议设置为0。
net.ipv4.tcp_fin_timeout = 30
#修改系統默认的 TIMEOUT 时间。
net.ipv4.tcp_keepalive_time = 1200
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 10000 65000 #表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!)
net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000
#表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。
#额外的,对于内核版本新于**3.7.1**的,我们可以开启tcp_fastopen:
net.ipv4.tcp_fastopen = 3# increase TCP max buffer size settable using setsockopt()
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
# increase Linux autotuning TCP buffer limit
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
# increase the length of the processor input queue
net.core.netdev_max_backlog = 250000
# recommended for hosts with jumbo frames enabled
net.ipv4.tcp_mtu_probing=1

服务器重启后默认ipsec不会自启动,请自行添加,或使用命令手动开启:

连上服务器后无法链接外网:

vim /etc/sysctl.conf

修改net.ipv4.ip_forward=1后保存并关闭文件 然后使用以下指令刷新

sysctl -p

如果是双网卡需要添加路由转发:

iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -j SNAT –to-source x.x.x.x(你的公网地址)

贴出我的Iptables内容:

*filter
:INPUT ACCEPT [3:109]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [97:30513]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp –dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp –dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp –dport 3306 -j DROP
-A INPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT
-A INPUT -i eth0 -p esp -j ACCEPT
-A INPUT -i eth0 -p udp -m udp –dport 500 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp –dport 500 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp –dport 4500 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp –dport 1701 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp –dport 1723 -j ACCEPT
-A FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.31.0.0/24 -j ACCEPT
-A FORWARD -s 10.31.1.0/24 -j ACCEPT
-A FORWARD -s 10.31.2.0/24 -j ACCEPT
-A FORWARD -j REJECT –reject-with icmp-port-unreachable
COMMIT
# Completed on Fri Jan 8 02:36:48 2016
# Generated by iptables-save v1.4.7 on Fri Jan 8 02:36:48 2016
*nat
:PREROUTING ACCEPT [24:1386]
:POSTROUTING ACCEPT [1:76]
:OUTPUT ACCEPT [1:76]
-A POSTROUTING -s 10.31.0.0/24 -j SNAT –to-source x.x.x.x
-A POSTROUTING -s 10.31.1.0/24 -j SNAT –to-source x.x.x.x
-A POSTROUTING -s 10.31.2.0/24 -j SNAT –to-source x.x.x.x
-A POSTROUTING -s 10.31.0.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 10.31.1.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 10.31.2.0/24 -o eth0 -j MASQUERADE
COMMIT

最后将ca.cert.pem下载下来改为.cer扩展名导入计算机根证书即可

如遇报错信息,请重新打开/etc/syctl并将报错的那些代码用#号注释,保存后再刷新sysctl直至不会报错为止。

更新脚本

wget https://raw.githubusercontent.com/quericy/one-key-ikev2-vpn/master/one-key-ikev2.sh

chmod +x one-key-ikev2.sh

bash one-key-ikev2.sh

此文章部分内容参考:http://quericy.me/blog/512、https://quericy.me/blog/699

分享到:

评论已关闭。