ref:
https://blog.csdn.net/lai444132348/article/details/75578548
https://mpco.gitlab.io/2015/09/02/Centos%E6%90%AD%E5%BB%BAIPSEC%20IKEV2%20VPN%E6%9C%8D%E5%8A%A1%E5%99%A8/
https://hjc.im/shi-yong-strongswanda-jian-ipsecikev2-vpn/
一、确定虚拟云服务虚拟技术类型
1、通过系统目录判断 执行命令:ls -al /proc 一般Openvz的话,则会有vz目录,Xen的话则会有xen目录。
2、通过网卡信息判断 执行命令:ifconfig 一般Openvz的话,则会有venet0或venet0:x网卡标识,Xen的话一般则是eth0。
3、通过VPS控制面板判断 流行的VPS面板包括SolusVM、vePortal等,会显示具体的虚拟技术。
4、通过virt-what命令判断 CentOS或RedHat系统的话,执行命令:yum install -y virt-what ubuntu(debian系):sudo apt-get install virt-what
virt-what是一个判断当前环境所使用的虚拟技术的脚本,常见的虚拟技术基本上都能正常识别出来。
安装好virt-what后,执行命令:sudo virt-what 根据返回的信息,即可判断出当前VPS所使用的虚拟技术。
二、编译安装Strongswan
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
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,编译并安装:
make ; make install
编译完成后如果没有报错,且使用ipsec version指令能出现版本信息,则表示安装成功.
三、配置证书
1,生成CA证书的私钥
- - - - > .
2,使用私钥,签名CA证书
- - - - . - - , , - - - - >. .
提示:多个vps使用同个CA根证书:
如果需要多个vps使用同一个CA根证书,则以上两步只执行一次,之后所有vps都使用上面生成的这两个ca.pem和ca.cert.pem文件进行后续的操作.
然后把多台vps解析到同一个域名的不同二级域名下.
这样客户端连接各个服务器时,只需要客户端安装一次根证书ca.cert.pem即可.
3,生成服务器证书所需的私钥
- - - - > .
4,用CA证书签发服务器证书
请先确认你的服务器的IP地址或域名,以后客户端连接时只能使用证书中的地址连接(多服务器使用相同根证书CA的,请先做好服务器的域名解析),
然后将下面命令中的123.123.123.123替换为自己服务器的IP地址或域名,一共需要替换两处:
- - - - . - - - - . .
- - . - - , , . . .
- - . . . - - - -
- - > . .
注意以上命令中的”C=”和”O=”的值要与第2步CA中的C,O的值保持一致.
5,生成客户端证书所需的私钥:
- - - - > .
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 .p 12
注意以上命令中的”-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
1,编辑/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! # windows7的ikev2指定了DH group必须是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 # 分配给客户端ip的子网范围
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.ipv 4.ip _forward=1
执行
sysctl -p
如果出现错误信息:
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
net.netfilter.nf_conntrack_max = 64000
error: permission denied on key 'net.nf_conntrack_max'
则执行:
rm -f /sbin/modprobe
ln -s /bin/true /sbin/modprobe
rm -f /sbin/sysctl
ln -s /bin/true /sbin/sysctl
modprobe bridge
sysctl -p
2、配置iptables
一行前面的#号去掉(否则Ikev2 vpn连接上后将无法访问外网),保存后执行sysctl -p(如果执行后有报错的,重新打开sysctl.conf将报错的部分#注释掉保存,直到执行sysctl -p不再报错为止)。
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
PS: 如果VPS有 static IP ,可将上述防火墙规则的最后3条NAT规则替换为以下3条来提升处理效率:
iptables -t nat -A POSTROUTING -s 10.31 .0 .0 /24 -o venet0 -j SNAT -- to -source ELASTIC_IP
iptables -t nat -A POSTROUTING -s 10.31 .1 .0 /24 -o venet0 -j SNAT -- to -source ELASTIC_IP
iptables -t nat -A POSTROUTING -s 10.31 .2 .0 /24 -o venet0 -j SNAT -- to -source ELASTIC_IP
注意将上述3条规则的ELASTIC_IP替换为vps的静态ip地址.
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
PS: 如果VPS有 static IP ,可将上述防火墙规则的最后3条NAT规则替换为以下3条来提升处理效率:
iptables -t nat -A POSTROUTING -s 10.31 .0 .0 /24 -o eth0 -j SNAT -- to -source ELASTIC_IP
iptables -t nat -A POSTROUTING -s 10.31 .1 .0 /24 -o eth0 -j SNAT -- to -source ELASTIC_IP
iptables -t nat -A POSTROUTING -s 10.31 .2 .0 /24 -o eth0 -j SNAT -- to -source ELASTIC_IP
注意将上述3条规则的ELASTIC_IP替换为vps的静态ip地址.
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
启动及自启动
设置自启动
vim /etc/rc.d/rc.local
添加:
/usr/sbin/ipsec start
启动VPN
/usr/sbin/ipsec start
六、配置Win7客户端连接IPsec IKEV2 VPN
使用win7自带客户端(Agile):
1,导入证书
选择刚才生成的 clientCert.p12 文件。下一步输入私钥密码。
下一步“证书存储”选“个人”;
导入成功后,把导入的 CA 证书剪切到“受信任的根证书颁发机构”的证书文件夹里面;
打开剩下的那个私人证书,看一下有没有显示“您有一个与该证书对应的私钥”,以及“证书路径”下面是不是显示“该证书没有问题”;
然后关闭 mmc,提示“将控制台设置存入控制台1吗”,选“否”即可;
至此,证书导入完成。
2,建立连接:
“控制面板”-“网络和共享中心”-“设置新的连接或网络”-“连接到工作区”-“使用我的Internet 连接”;
Internet 地址写服务器地址或域名;
目标名称随便写;
用户名密码写之前配置的 EAP 的那个; ([用户名] %any : EAP “[密码]”)
确定;
点击右下角网络图标,在新建的 VPN 连接上右键属性然后切换到“安全”选项卡;
VPN 类型选 IKEv2;
数据加密是“需要加密”;
身份认证这里需要说一下,如果想要使用 EAP-MSCHAPV2 的话就选择“使用可扩展的身份认证协议”-“Microsoft 安全密码(EAP-MSCHAP v2)”,想要使用私人证书认证的话就选择“使用计算机证书”。
七、其他系统客户端连接IPsec IKEV2 VPN
连接的服务器地址和证书保持一致,即取决于签发证书ca.cert.pem时使用的是ip还是域名;
Android/iOS/OSX 可使用ikeV1,认证方式为用户名+密码+预共享密钥(PSK);
iOS/OSX/Windows7+/WindowsPhone8.1+/Linux 均可使用IkeV2,认证方式为用户名+密码。使用SSL证书则无需导入证书;使用自签名证书则需要先导入证书才能连接,可将ca.cert.pem更改后缀名作为邮件附件发送给客户端,手机端也可通过浏览器导入,其中:
iOS/OSX 的远程ID和服务器地址保持一致,用户鉴定选择”用户名”.如果通过浏览器导入,将证书放在可访问的远程外链上,并在系统浏览器(Safari)中访问外链地址;
Windows PC 系统导入证书需要导入到“本地计算机”的”受信任的根证书颁发机构”,以”当前用户”的导入方式是无效的.推荐运行mmc添加本地计算机的证书管理单元来操作;
WindowsPhone8.1 登录时的用户名需要带上域信息,即wp”关于”页面的设备名称\用户名,也可以使用%any %any : EAP “密码”进行任意用户名登录,但指定了就不能添加其他用户名了.
WindowsPhone10 的vpn还存在bug(截至10586.164),ikeV2方式可连接但系统流量不会走vpn,只能等微软解决. (截至14393.5 ,此bug已经得到修复,现在WP10已经可以正常使用IkeV2.)
Windows10 也存在此bug,部分Win10系统连接后ip不变,没有自动添加路由表,使用以下方法可解决
—– 手动关闭vpn的split tunneling功能(在远程网络上使用默认网关);
—–也可使用powershell修改,进入CMD窗口,运行如下命令:
powershell #进入ps控制台
get -vpnconnection #检查vpn连接的设置(包括vpn连接的名称)
set -vpnconnection "vpn连接名称" -splittunneling $false #关闭split tunneling
get -vpnconnection #检查修改结果
exit #退出ps控制台