一、确定虚拟云服务虚拟技术类型
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 https://download.strongswan.org/strongswan-5.6.3.tar.gz tar xzf strongswan-5.6.3.tar.gz cd strongswan-5.6.3
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证书的私钥
ipsec pki --gen --outform pem > ca.pem
2,使用私钥,签名CA证书
ipsec pki --self --in ca.pem --dn "C=CN, O=VPN, CN=VPN CA" --ca --outform pem >ca.cert.pem
–self 表示自签证书 –in 是输入的私钥 –dn 是判别名 C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名 O 组织名称 CN 友好显示的通用名 –ca 表示生成 CA 根证书 –lifetime 为有效期, 单位是天
提示:多个vps使用同个CA根证书:
如果需要多个vps使用同一个CA根证书,则以上两步只执行一次,之后所有vps都使用上面生成的这两个ca.pem和ca.cert.pem文件进行后续的操作.
然后把多台vps解析到同一个域名的不同二级域名下.
这样客户端连接各个服务器时,只需要客户端安装一次根证书ca.cert.pem即可.
注意:可以通过申请域名SSL证书替代自签证书实现客户端免导入证书,主要用到的证书文件有3个:
cp chain.pem /root/ca.cert.pem # 包括根证书的链证书 cp cert.pem /root/server.cert.pem # 服务器证书 cp privkey.pem /root/server.pem # 服务器私钥
/usr/local/etc/ipsec.conf修改leftid,leftid需要和证书的域名保持一致,域名可以不指向本机IP,就是说一个有效证书可以用在多个VPN的服务器上;
3,生成服务器证书所需的私钥
ipsec pki --gen --outform pem > server.pem
4,用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=CN, O=VPN, 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的值保持一致.
–issue, –cacert 和 –cakey 就是表明要用刚才自签的 CA 证书来签这个服务器证书。 –dn, –san,–flag 是一些客户端方面的特殊要求: iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址; Windows 7 不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),–flag serverAuth; 非 iOS 的 Mac OS X 要求了“IP 安全网络密钥互换居间(IP Security IKE Intermediate)”这种增强型密钥用法(EKU),–flag ikdeIntermediate; Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,–san。
5,生成客户端证书所需的私钥:
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=CN, O=VPN, 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,安装证书:
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 #是否缓存证书吊销列表 #cachecrls = yes #是否严格执行证书吊销规则 # strictcrlpolicy=yes #如果同一个用户在不同的设备上重复登录,yes 断开旧连接,创建新连接;no 保持旧连接,并发送通知; never 同 no, 但不发送通知. uniqueids=no #配置根证书, 如果不使用证书吊销列表, 可以不用这段. 命名为 %default 所有配置节都会继承它 #ca %default #证书吊销列表url,可以是 LDAP, http, 或文件路径 #crluri = #定义连接项, 命名为 %default 所有连接都会继承它 conn %default #是否启用压缩, yes 表示如果支持压缩会启用. compress = yes #当意外断开后尝试的操作, hold, 保持并重连直到超时. dpdaction = hold #意外断开后尝试重连时长 dpddelay = 30s #意外断开后超时时长, 只对 IKEv1 起作用 dpdtimeout = 60s #闲置时长,超过后断开连接. inactivity = 300s #数据传输协议加密算法列表 esp = aes256-sha256,aes256-sha1,3des-sha1! #密钥交换协议加密算法列表 ike = aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024! #默认的密钥交换算法, ike 为自动, 优先使用 IKEv2 keyexchange = ike #服务端公网ip, 可以是魔术字 %any,表示从本地ip地址表中取. left = %any #客户端ip, 同上 right = %any #指定服务端与客户端的dns, 多个用","分隔 leftdns = 8.8.8.8,8.8.4.4 rightdns = 8.8.8.8,8.8.4.4 #服务端用于ike认证时使用的端口, 默认为500,如果使用了nat 转发, 则使用4500 #leftikeport = #服务器端虚拟ip地址 #leftsourceip = %config #客户端虚拟ip段 rightsourceip = 10.0.0.0/24 #服务器端子网, 魔术字 0.0.0.0/0. 如果为客户端分配虚拟 IP 地址的话,那表示之后要做 iptables 转发,那么服务器端就必须是用魔术字 leftsubnet = 0.0.0.0/0 #rightsubnet = [[]][,...] conn IKEv2-BASE #服务器端根证书DN名称 leftca = "C=CN, O=VPN, CN=StrongSwan CA" #服务器证书, 可以是 PEM 或 DER 格式 leftcert = server.cert.pem #不指定客户端证书路径 #rightcert = #指定服务器证书的公钥 leftsigkey = server.pub.pem #rightsigkey = | #是否发送服务器证书到客户端 leftsendcert = always #客户端不发送证书 rightsendcert = never #服务端认证方法,使用证书 leftauth = pubkey #客户端认证使用 EAP 扩展认证 , 貌似 eap-mschapv2 比较通用 rightauth = eap-mschapv2 #服务端id, 可以任意指定, 默认为服务器证书的 subject, 还可以是魔术字 %any,表示什么都行. leftid = vpn.itnmg.net #客户端id, 任意 rightid = %any #ios, mac os, win7+, linux conn IKEv2-EAP also=IKEv2-BASE #指定客户端eap id eap_identity = %any #不自动重置密钥 rekey = no #开启IKE 消息分片 fragmentation = yes #当服务启动时, 应该如何处理这个连接项. add 添加到连接表中. auto = add
修改为以下内容:
config setup uniqueids=no conn %default compress = yes esp = aes256-sha256,aes256-sha1,3des-sha1! ike = aes256-sha256-modp2048,aes256-sha1-modp2048,aes128-sha1-modp2048,3des-sha1-modp2048,aes256-sha256-modp1024,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024! keyexchange = ike keyingtries = 1 leftdns = 8.8.8.8,8.8.4.4 rightdns = 8.8.8.8,8.8.4.4 conn ikev2-eap leftca = "C=CN, O=VPN, CN=VPN CA" leftcert = server.cert.pem leftsendcert = always rightsendcert = never leftid = "服务器域名或IP" left = %any right = %any leftauth = pubkey rightauth = eap-mschapv2 leftfirewall = yes leftsubnet = 0.0.0.0/0 rightsourceip = 10.1.0.0/24 fragmentation = yes rekey = no eap_identity=%any auto = add conn xauth_psk keyexchange=ikev1 left=%defaultroute leftauth=psk leftsubnet=0.0.0.0/0 right=%any rightauth=psk rightauth2=xauth rightsourceip=10.1.0.0/24 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
一行前面的#号去掉(否则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.1.0.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.1.0.0/24 -o venet0 -j MASQUERADE
PS: 如果VPS有 static IP ,可将上述防火墙规则的最后1条NAT规则替换为以下1条来提升处理效率:
iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o venet0 -j SNAT --to-source ELASTIC_IP
注意将上述1条规则的ELASTIC_IP替换为vps的静态ip地址.
Xen、KVM则执行:
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -s 10.1.0.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.1.0.0/24 -o eth0 -j MASQUERADE
PS: 如果VPS有 static IP ,可将上述防火墙规则的最后1条NAT规则替换为以下1条来提升处理效率:
iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o eth0 -j SNAT --to-source ELASTIC_IP
注意将上述1条规则的ELASTIC_IP替换为vps的静态ip地址.
3,开机自动载入iptables:
Ubuntu:
iptables-save > /etc/iptables.rules
vim /etc/network/if-up.d/iptables
#!/bin/sh iptables-restore < /etc/iptables.rules
chmod +x /etc/network/if-up.d/iptables
CentOS:
service iptables save
至此,IPSec/IKEv2 VPN便搭建好了!现在启用服务就可以使用了:
启动测试:
ipsec start
开机启动
vim /etc/rc.local
添加:
/usr/local/sbin/ipsec start >/dev/null 2>&1
六、客户端配置
1、IOS:
先导入 CA 证书
将之前创建的 ca.cert.pem 用 ftp 导出 , 写邮件以附件的方式发到邮箱, 在 ios 浏览器登录邮箱, 下载附件, 安装 ca 证书.
1)使用 IKEv2 + EAP 认证
找到手机上 “设置->VPN->添加配置”, 选 IKEv2
描述: 随便填
服务器: 填url或ip
远程ID: ipsec.conf 中的 leftid
用户鉴定: 用户名
用户名: EAP 项用户名
密码: EAP 项密码
2)使用 IKEv2 + 客户端证书 认证
把之前的 .p12 证书(里面包含ca证书)发到邮箱在手机上打开. 导入到手机(此时需要之前设置的证书密码).
找到手机上 “设置->VPN->添加配置”, 选 IKEv2
描述: 随便填
服务器: 填url或ip
远程ID: ipsec.conf 中的 leftid
用户鉴定: 证书
证书: 选择安装完的客户端证书
3)使用 IKEv2 + 预设密钥 认证
找到手机上 “设置->VPN->添加配置”, 选 IKEv2
描述: 随便填
服务器: 填url或ip
远程ID: ipsec.conf 中的 leftid
用户鉴定: 无
使用证书: 关
密钥: PSK 项密钥
2、Windows 10:
导入证书:
将 CA 根证书 ca.cert.pem 重命名为 ca.cert.crt
双击 ca.cert.crt 开始安装证书
点击安装证书
“存储位置” 选择 “本地计算机”, 下一步
选择 “将所有的证书都放入下列存储区”, 点浏览, 选择 “受信任的根证书颁发机构”, 确定, 下一步, 完成.
建立连接:
“控制面板”-“网络和共享中心”-“设置新的连接或网络”-“连接到工作区”-“使用我的 Internet 连接”
Internet 地址写服务器 IP 或 URL。
描述随便写。
用户名密码写之前配置的 EAP 的那个。
确定
转到 控制面板网络和 Internet网络连接
在新建的 VPN 连接上右键属性然后切换到“安全”选项卡
VPN 类型选 IKEv2
数据加密选“需要加密”
身份认证这里需要说一下,如果想要使用 EAP 认证的话就选择“Microsoft:安全密码(EAP-MSCHAP v2)”; 想要使用私人证书认证的话就选择“使用计算机证书”。
再切换到 “网络” 选项卡, 双击 “Internet 协议版本 4” 以打开属性窗口, 这里说一下, 如果你使用的是老版本的 win10, 可能会打不开属性窗口, 这是已知的 bug, 升级最新版本即可解决.
点击 “高级” 按钮, 勾选 “在远程网络上使用默认网关”, 确定退出.
VPN 配置完成
3、Windows 7 导入证书略有不同
开始菜单搜索「cmd」,打开后输入 mmc(Microsoft 管理控制台)。
「文件」-「添加/删除管理单元」,添加「证书」单元
证书单元的弹出窗口中一定要选「计算机账户」,之后选「本地计算机」,确定。
在左边的「控制台根节点」下选择「证书」-「受信任的根证书颁发机构」-「证书」,右键 -「所有任务」-「导入」打开证书导入窗口。
选择 CA 证书 ca.cert.crt 导入即可
注意 千万不要双击 .p12 证书导入!因为那样会导入到当前用户而不是本机计算机中,ipsec 守护精灵是访问不了它的。