引言
VPN 的作用相信大家也很清楚了,我在网上买的几个VPN感觉都不太稳定,速度还慢,所以决定自己搭建一个VPN。网上一般推荐用 搬瓦工 和 Linode 的 VPS 来搭建,但因为我自己还想在服务器上做一些VPN之外的事情,所以选择了阿里云的 ECS 来搭建。
服务器购买
如图所示,选择阿里云香港ECS服务器,然后内存的话 1G 就足够了,操作系统是 CentOS 32位。然后如果是自己用的话,网络一定要选择按流量计费,根据我这几天用的情况,一天流量费几分钱,还是很便宜的,而且带宽可以选大些,速度快。
方案一:PPTP协议搭建
一开始自然是选择最简单的 PPTP 协议方式,这个协议没有 L2TP/IPsec 安全,但因为是自己用,倒是无所谓了。参考的教程是在VPS上搭建PPTP VPN极简攻略。主要步骤如下:
1.安装ppp,pptpd和iptables
yum install -y ppp iptables
yum install pptpd
搬瓦工VPN搭建上说要装 Perl 什么了,不过阿里云的机器上貌似不需要。
2.修改相关配置
/** 修改DNS /etc/ppp/options.pptpd */
ms-dns 8.8.8.8
md-dns 8.8.4.4
/** 修改服务器IP和分配给客户端的IP /etc/pptpd.conf **/
localip 192.168.0.1 //VPN服务器ip
remoteip 192.168.0.234-255 //客户端ip
/** 允许转发 /etc/sysctl.conf */
net.ipv4.ip_forward=1
修改后,sysctl -p
保存。
/** 配置账号 /etc/ppp/chap-secrets **/
myusername pptpd mypassword *
3.配置转发规则并启动
/home/huanghuan/service iptables start //启动iptables
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source outerIp
(你的服务器的公网地址)
然后启动VPN
/home/huanghuan/service pptpd restart
小结
然后你就可以通过 PPTP 来连接VPN并使用了,但是在这里我却发现个问题,升级后的IOS,OSX不支持PPTP了。。。,这就很尴尬了,虽然Android是可以用的,但做个半成品出来就没啥意思了。而且我还发现即使在没升级的OSX上用,速度还很慢,所以这个方案就废弃了。
方案二:L2TP/IPsec搭建
L2TP 据说吞吐量比 PPTP 大很多,我在网上直接找了一个一件配置脚本来用,参见L2TP/IPSec一键安装脚本。这个脚本装完之后其实还有不少问题,首先它的安装脚本是l2tp.sh
,然后安装后会生成一个l2tp.log
,在里面可能会报一些错,然后自己对着这些错去搜解决方法,倒是很快。解决了报错的问题,并重新执行l2tp.sh
后,我能够连接VPN,但却上不了了网。这个问题倒是很好解决,因为这种情况肯定是VPN服务器没有把客户端的请求转发出去,所以我重新配了下 IPtables。
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source outerIp
(你的服务器的公网地址)
之后就能在IOS和MAC上连接这个VPN了。
Android 6.0问题
以为已经搞定了,但之后又发现了一个问题,Android特么又连不上了。。。,又是一通搜,发现这居然是个Android的Bug。在Google的论坛上Issuce 196930: L2TP/IPsec VPN does not work in Android 6.0.1,我们的大Google都被用户骂成狗了。参考了一下论坛中用户的解决方法,在/etc/ipsec.conf
中添加这些配置:
ike=aes256-sha2_256
phase2alg=aes256-sha2_256
sha2-truncbug=yes
这个问题的原因是Android的L2TP/IPsec实现有问题,而且还是个存在了很久了的问题。
同一局域网问题
既然Android,IOS/OSX都可以了,那问题按理说应该到此结束了。但后来发现如果在同一个局域网里,同时用IPsec/L2TP的方式连VPN,有一个会被顶掉(我的情况都是OSX被顶掉)。这个问题应该是因为局域网里的机器出网IP是一样的,应该在局域网内做一些配置可能才行,不过我就没去研究这个了。如果觉得是个问题,可以OSX用IPsec/L2TP,然后Android用L2TP,这样是可以在同一局域网里同时用的。
总结
VPN的配置总的来说还是挺简单的,不过其中的原理还没有深入理解,我大概看了下PPTP和L2TP/IPsec的原理,也算挺复杂的了,以后有需要可以去研究下。