VPN搭建小记

Oct 30, 2016


引言

VPN 的作用相信大家也很清楚了,我在网上买的几个VPN感觉都不太稳定,速度还慢,所以决定自己搭建一个VPN。网上一般推荐用 搬瓦工LinodeVPS 来搭建,但因为我自己还想在服务器上做一些VPN之外的事情,所以选择了阿里云的 ECS 来搭建。

服务器购买

demo

如图所示,选择阿里云香港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的原理,也算挺复杂的了,以后有需要可以去研究下。


上一篇博客:Redux开发初探
下一篇博客:React学习笔记