海外云主机搭建IKEV2 VPN之经验总结 + 搭建证书服务器
为什么要自己搭?
目前主流的科学上网方式就那么几种,以前的goagent(后来被封了), shadowsocks, VPN等。VPN的跨平台支持性较好,IOS WIN7 MAC下都有集成原生客户端。VPN分免费和收费的两种,免费的一般用的人都比较多,网速也不快,而且不稳定,略过不谈。收费的VPN的价格一般从几十元到数百元不等,如果前级有负载均衡还好,我之前买的VPN没有负载均衡,需要我自己手动切线路,很麻烦,高峰期经常无法连接。而自己买个云主机的价格也就在十美金以内,每个月送的流量基本用不完,主机独享,完爆收费VPN。(这么想想收费VPN真是暴利)
云主机怎么选?
国内的主机商靠谱的是阿里 腾讯 ucloud三家,海外节点的价格基本都很坑爹,基本都要百元以上。美国比较便宜(因为延时大),亚洲节点相对较贵,新加坡和日本稍好,香港因为延时最小,价格也是最贵的。国外的云主机商有linode, bandwagon, vultr这几家,价格都差不多,网络性能是要看机房的,老机房基本买不到,新机房一般速度会好些。价格上就便宜多了,配置最低的机型(1核1G 20G硬盘)通常5美金一个月,vultr甚至还有1核512M 20g硬盘的超低配机型,只要2.5美金一个月。最后我在几家国外厂商中选了vultr的新加坡机房和linode的新加坡机房,准备试用一个月,再作定夺。
PPTP/L2TP/IPSEC/IKEV2
PPTP因为安全性原因,已经被IOS10除去了。其他三个的跨平台支持能力都不错。
系统配置
Vultr和Linode我选的都是最低配机型,一个VPN消耗的资源很小,基本忽略不计。系统为CentOS 6.8,X64 X86都是可以的。CentOS7也是可以的,不过网上CentOS的资料不多,如果调试中碰到问题,会比较棘手。
搭建流程
一键配置脚本在这里:(原文请见 https://quericy.me/blog/699/)
wget --no-check-certificate https://raw.githubusercontent.com/quericy/one-key-ikev2-vpn/master/one-key-ikev2.sh
可能出现的问题及对应解决方案如下:
成功连接,但是无法上外网:
检查/etc/sysctl.conf中是否开启了ip_forward,方法:
cat /etc/sysctl.conf
检查其中是否有net.ipv4.ip_forward=0 或者 #net.ipv4.ip_forward=1字样。如果是前者,修改为1;如果是后者,去掉#即可。
修改之后,务必执行以下命令刷新:
sysctl -p
另外还有个比较少见的原因是外网网卡填错了,极少数机器有多个网卡,并且外网并不是ETH0,你需要在安装中提示选择网卡的时候输入正确的网卡号。
除此以外,Vultr主机还需要额外添加这样一条来开启转发:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
2.无法连接,客户端报错:
客户端连接时,输入ipsec status查看当前状态,
如果显示connection数量大于0,说明连接已经到了ipsec这里,检查证书是否有误,用户名密码是否正确。win7下要注意,在导入证书以后,VPN连接一定要重新建立一个新的,不要在原有的VPN上修改主机IP,可能会导致意外失败。
如果显示connection数量为0,请用以下代码关闭防火墙:
/etc/init.d/iptables stop
关闭以后如果可以连接了,说明就是防火墙干的好事。
这种情况在Vultr主机里会出现,解决方案是:把/etc/sysconfig/iptables里的以下代码删除或是注释掉:
-A INPUT -j REJECT --reject-with icmp-host-prohibited
然后再用以下代码重启iptables(总不能没有防火墙裸奔把):
service iptables restart
至此,IKEv2服务端搭建完毕。
由于现在网络上有大量的暴力破解SSH密码的人(可以输入cat /var/log/secure | grep password看看是不是触目惊心),出于安全性考虑,建议:关闭密码登录,只使用ssh密钥登录;root帐号加强密码;修改ssh端口。
附:键入以下脚本可在云主机HTTP端口上生成服务器,不同设备导入证书时只需直接用浏览器访问主机IP即可获取证书。
首先用ROOT帐号登录入云主机,切换到~目录下执行以下命令确认证书在~/my_key/ca.cert.pem位置
cat ~/my_key/ca.cert.pem
如未报错,则执行以下步骤
mkdir cert_server vim server.js
粘贴以下内容