本文以阿里云香港节点的ECS为远程服务器,类型为ecs.t5-lc2m1.nano(CPU使用率不能超过10%,做PPTPD服务器足够了,几乎看不到CPU使用),系统采用Centos6.9,专有网络,按使用量付费,大概一年150块钱,网络带宽不要钱,可以设置大一点,但是香港流量1元/GB。 之所有使用centos6.9系统而不是centos7.5系统,是因为本人对centos7.5系统自带的firewalld防火墙不是很会用,有时间可以出个centos7版本的教程,其实都一样,只是命令格式不同,步骤和原理完全相同。

1.登录服务器 使用控制台中对应ECS节点的公网地址登录服务器,登录的ssh验证方式请使用在购买ECS时指定的账号密码或者密钥对。 2.更新系统,并安装基本软件包 [root@hk ~]# yum update -y [root@hk ~]# reboot 更新完成记得重启系统,以让最新的各个组件生效。(其实只要kernel没有升级可以不用重启,看你心情了)

3.安装pptpd服务 [root@hk ~]# yum install pptpd

4、检查selinux状态 [root@hk ~]# getenforce Disabled [root@hk ~]# cat /etc/sysconfig/selinux #This file controls the state of SELinux on the system. #SELINUX= can take one of these three values: #enforcing - SELinux security policy is enforced. #permissive - SELinux prints warnings instead of enforcing. #disabled - SELinux is fully disabled. SELINUX=disabled #SELINUXTYPE= type of policy in use. Possible values are: #targeted - Only targeted network daemons are protected. #strict - Full SELinux protection. SELINUXTYPE=targeted

SELINUX关着就对了,看到这玩意就头大。

5、配置pptpd服务 备份系统自带配置文件 [root@hk ~]# mv /etc/ppp/options.pptpd /etc/ppp/options.pptpd.bak

新建options.pptpd文件并写入如下对应内容: [root@hk ~]# vim /etc/ppp/options name pptpd refuse-pap refuse-chap refuse-mschap require-mschap-v2 require-mppe-128 proxyarp lock nobsdcomp novj novjccomp nologfd mtu 1460 ms-dns 100.100.2.136 ms-dns 100.100.2.138

编辑账号密码文件,并添加一个账号, [root@hk ~]# vim /etc/ppp/chap-secrets #Secrets for authentication using CHAP #client server secret IP addresses zhouxin pptpd testing123 *

其中zhouxin为账户名,server字段为pptpd服务类型,固定参数无需修改,secret字段为密码testing123, IP addresses为允许客户端使用该账号从哪些地址登录,可以指定一个IP地址,也可以使用*号,代表允许客户端从所有地址登录。

别忘了开启pptpd服务 [root@hk ~]# service pptpd start
Starting pptpd: [ OK ]

至此pptpd服务已经配置完成,接下来需要配置iptables允许转发和阿里云的安全组。 6、配置iptables服务 在配置iptables之前还需要对linux内核做个特别的设置,开启内核数据包转发功能。 编辑配置文件/etc/sysctl.conf 找到net.ipv4.ip_forward参数,值由0修改为1,如果配置文件里找不到,就在文件末尾手动添加该参数。 #Controls IP packet forwarding net.ipv4.ip_forward = 1 1表示允许内核转发,0为禁止内核转发 配置完毕后使用如下名利刷新系统参数,以使之生效。 [root@hk ~]# sysctl -p net.ipv4.ip_forward = 1 ....省略其他....... 看到上面的信息代表内和参数修改生效了。

OK,接下来才是iptables [root@hk ~]# service iptables status iptables: Firewall is not running. 发现阿里云的ECS默认是不开启iptables防火墙的,因为ECS的安全组在充当外部防火墙的功能,但是功能和iptables还是有差距的。 接下来需要开启iptables服务,并清空netfliter和nat表 [root@hk ~]# service iptables start [root@hk ~]# iptables -F [root@hk ~]# iptables -t nat -F

在这里需要使用ifconfig命令查看一下网卡的接口名称 [root@hk ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:16:3E:02:EF:0D
inet addr:172.31.159.46 Bcast:172.31.159.255 Mask:255.255.240.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:34258 errors:0 dropped:0 overruns:0 frame:0 TX packets:14558 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:26007734 (24.8 MiB) TX bytes:1164403 (1.1 MiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) 发现本机的网卡接口名为eth0。

写入iptables规则: [root@hk ~]# iptables -I INPUT -p tcp --dport 1723 -j ACCEPT [root@hk ~]# iptables -I INPUT -p gre -j ACCEPT [root@hk ~]# iptables -I FORWARD  -j ACCEPT [root@hk ~]# iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE 这4句话的含义分别是: 允许tcp 1723端口,这个是pptpd服务的端口。 允许GRE协议,pptp服务在建立×××隧道时会用到GRE协议。 允许转发外部数据包。 对所有经由eth0接口转发出去的数据包进行源地址NAT(SNAT),NAT方式为MASQUERADE伪装,就是把所有经由eth0出去的数据包源IP地址都修改为eth0接口上所配置的IP地址,也就是172.31.159.46。可能有人要问这个eth0接口的地址也是私有地址,无法再公网上路由,怎么办,勿操心,因为在数据包到达阿里云的专有网络网观后还需要再做一次NAT,来转换为真正的公网IP地址。

至此,已iptables已经配置完毕,记得使用如下命令保存,否则重启后上述配置将失效。 [root@hk ~]# service iptables save 所有的配置信息将会被保存到文件/etc/sysconfig/iptables中。

还没完,前面说了还要配置阿里云的安全组, 在阿里云控制台,找到该ECS服务器,点击最后面的"更多",再点击弹出列表上的"安全组配置"选项。 来到一个新的配置页面,点击"安全组列表"后面的"配置规则"连接。添加如下规则: 允许tcp1723端口,允许GRE协议,允许tcp22端口(这个是自带规则,切记不要删除,否则你就无法ssh访问你的ECS了)。

好了,所有pptpd服务的相关设置均已就绪。

接下来在你的客户端电脑上配置一个×××连接,使用该ECS的公网地址作为×××的服务器地址,账号密码位前面设置的zhouxin,testing123。 控制面板->网络与共享中心->设置新的连接或网络->连接到工作区->否,创建新连接(如果有的话)->使用我的Internet连接(×××)->Internet地址就是ECS的公网地址,目标名称可以随便去比如hkvpn->点击创建按钮完成配置。 还没完, 再次进入网络共享中心->更改适配器设置->找到刚刚新建的连接比如:hkvpn那个网络接口->鼠标右键,选择属性->选择"安全"选项卡 安全选项如下: ×××类型:点对点隧道协议(pptp) 数据加密:可选加密(没有加密也可以连接) 身份验证:允许使用这些协议->只勾选 Microsoft CHAP Version 2(MS-CHAP v2) 点击确定按钮保存配置

双击此网络接口,在弹出的页面填入账号密码,点击连接按钮,等待与服务器协商建立×××连接。如果一切正常,过片刻此网络接口状态会由已断开->正在连接(正在连接到"ECS IP",正在验证你的登录信息,正在完成连接)->已连接。

激动人心的时刻来临了,赶快打开浏览器,输入网址www.baidu.com,搜索关键字ip来查看自己的网络出口地址是不是变成了ECS的公网IP。 额........,郁闷中,百度打不开,换个www.qq.com再试试,发现没问题,挺顺溜,再换个地址ip.qq.com看看,发现自己的互联网出口地址确实变成了ECS的公网IP。但是百度为什么打不开呢,郁闷中。 曾经在很长的一段时间里我本人竟然认为国内打不开google,理所当然的境外的运营商都去屏蔽了百度。呵呵,有点傻是不是。指导有一天觉得这种情况太无法忍受了,才决定找点资料看看究竟是怎么回事。

在回到ECS服务器上看看网络信息 [root@hk ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:16:3E:02:EF:0D
inet addr:172.31.159.46 Bcast:172.31.159.255 Mask:255.255.240.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:42366 errors:0 dropped:0 overruns:0 frame:0 TX packets:22787 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:27355920 (26.0 MiB) TX bytes:2506666 (2.3 MiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

ppp0 Link encap:Point-to-Point Protocol
inet addr:10.10.10.1 P-t-P:10.10.10.3 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1396 Metric:1 RX packets:28 errors:0 dropped:0 overruns:0 frame:0 TX packets:17 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3 RX bytes:1675 (1.6 KiB) TX bytes:1120 (1.0 KiB) 发现比之前多了一个ppp0接口,地址就是我们前面pptpd服务里所配置的localip地址,仔细看ppp0里面的一个关键参数MTU:1396,看到了没有,再看看eth0的mtu:1500,问题就出在这里。 由于ppp封装,gre封装,和tcp-mss等诸多因素混杂,导致无法正常由https协议访问百度。 解决办法1:tcp-mss自适应。 [root@hk ~]# iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu 或 [root@hk ~]# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1356 解决办法2:降低eth0的MTU到1496以下即可。 [root@hk ~]# ifconfig eth0 mtu 1496 解决办法3:提升ppp接口的mtu到1400以上 [root@hk ~]# vim /etc/ppp/ip-up ............省略N行.......... ifconfig $1 mtu 1460 exit 0

注意一定要添加在exit 0这行前面。前两种方法是当即生效的。对pptpd服务没影响。

如果是更改配置文件方式记得重启pptpd服务。 [root@hk ~]# service pptpd restart
Shutting down pptpd: [ OK ] Starting pptpd: [ OK ] Warning: a pptpd restart does not terminate existing connections, so new connections may be assigned the same IP address and cause unexpected results. Use restart-kill to destroy existing connections during a restart.

好了,现在baidu是可以打开了,但是依然发现个问题,就是被墙掉的那些网站还是无法打开, 来,再做个测试 在命令提示符里输入nslookup命令, C:\Users\xin>nslookup 默认服务器: public1.114dns.com Address: 114.114.114.114 可以看到一个默认服务器是114.114.114.114,经检查发现这是本地网卡上配置的首选DNS服务器,貌似pptpd里配置的ms-dns参数没生效。系统依然使用本地网卡的DNS服务器去做解析。 难不成每次使用此vpn连接都要手动的更改本地网卡的DNS设置,断开连接,在手动改回来?是的曾经的我是这么做的,但是做了一段时间就受够了。决定找个懒人的方法,别说,还真找到了。 在ECS配置如下iptables规则: [root@hk ~]# iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to 100.100.2.138:53 这条规则的意思是:对所有发往udp53端口的数据做目的地址转换DNAT,目的地址强制更改为100.100.2.138,这下好了,无论客户端那边配置什么DNS,当DNS数据包到达ECS是都被篡改成使用100.100.2.138这个DNS服务器。哪怕客户端配置的压根就不是DNS服务器的IP地址,也一样会被篡改掉。

赶快在试试,打开浏览器,先念三遍咒语:玛尼玛尼哄,玛尼玛尼哄,玛尼玛尼哄!即可穿墙而过。

这样认为大功告成了是吗,真的是吗?当然不是,iptables还没保存呢 [root@hk ~]# service iptables save

然后

然后就是过了两天你会收到阿里云这么个邮件,怎么办,随它去,然后等请喝茶。