专业新闻

搭建PPTP VPN服务。包括PPTP的安装、配置,以及相应的iptables规则。之所以选择PPTP VPN,是考虑到客户端连接起来会比较方便

我们几个人主要都是在Linux Desktop、Windows还有Android上使用VPN,这些终端原生都有连接PPTP的客户端。


PPTP的配置主要有下面五个步骤:


验证内核是否加载了MPPE模块
安装所需的软件包
配置PPP和PPTP的配置文件
打开内核的IP转发功能
启动pptpd守护进程
配置iptables防火墙放行和转发规则


1、验证内核是否加载了MPPE模块:
modprobe ppp-compress-18 && echo MPPE is ok


2、安装所需的软件包:
PPTP使用PPP协议对用户数据进行封装,然后将PPP数据帧封装在IP数据报里,经由IP网络传播。因此首先需要支持PPP协议,我们使用的完整版CentOS已经自带了ppp这个软件包,如果你安装的是Minial CentOS之类的精简系统,则可能需要下面命令安装ppp:


yum install ppp


–pptpd-
有了PPP协议支持,接下来安装pptpd。首先到这里找到最新版适合你的平台的pptpd。CentOS与RHEL通用,Fedora系统则可以使用后缀含fc字样的包,然后还需要根据内核选择32位或者64位的包。找到正确的软件包以后,复制其URL,然后用wget下载到root的家目录(或者用rpm -ivh URL直接安装也行)。 
 wget http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.3.4-1.rhel5.1.x86_64.rpm
 
 rpm -ivh pptpd-1.3.4-1.rhel5.1.x86_64.rpm
 
 –iptables–
同样,如果不是Minial的系统,应该不会没有安装iptables。这是Linux下最流行的防火墙,默认应该就能找到,如果没有,则:


yum install iptables
然后像是iptables这样的软件,对服务器非常重要。虽然还没有配置防火墙的规则,装完就打开吧(只要默认放行ssh的22端口就没问题),打开以后还需要设置一下,在主要的运行级别自动启动:


/etc/init.d/iptables start chkconfig --level 35 iptables on




3、配置PPP和PPTP的配置文件:


接下来需要对ppp和pptpd进行配置,编辑它们的几个配置文件。


这些配置文件中,#号开头的行均为注释,对配置不起作用。我们不必关心注释,所以下面我将使用类似


grep ^[^#] /etc/ppp/options.pptpd
这样的命令,过滤出配置文件中有效的行显示在本文正文中。你在编辑的时候,只需要添加或修改这些有效的行,把不需要的行前面加上#号注释掉即可 


–ppp–
配置ppp需要编辑它的两个配置文件,一个是option(选项)文件,一个是用户账户文件。首先编辑option文件:


vi /etc/ppp/options.pptpd


ms-dns 8.8.8.8
ms-dns 8.8.4.4
两个比较重要的行就是ms-dns了,它们指定VPN使用的DNS服务器。毕竟VPS位于国外,所以推荐使用上面通用的Google Public DNS,当然也可以修改为你的VPS所在ISP提供的DNS。


接下来修改另一个,存储着用户账户的文件:


vi /etc/ppp/chap-secrets
这个文件非常简单,其中用明文存储VPN客户的用户名、服务名称、密码和IP地址范围,每行一个账户:
# Secrets for authentication using CHAP
# client server secret IP addresses
mileweb pptpd "mw123456" *


其中第一第三列分别是用户名和密码;第二列应该和上面的文件/etc/ppp/options.pptpd中name后指定的服务名称一致;最后一列限制客户端IP地址,星号表示没有限制。


–pptpd–
下面编辑pptpd的配置文件:


vi /etc/pptpd.conf
这个文件中有效的行也很少:


option /etc/ppp/options.pptpd
logwtmp
localip 192.168.0.1
remoteip 192.168.0.207-217


VPN可以这样理解,Linux客户端使用一个虚拟网络设备ppp0(Windows客户端也可以理解成VPN虚拟网卡),连接到服务器的虚拟网络设备ppp0上,这样客户端就加入了服务器端ppp0所在的网络。localip就是可以分配给服务器端ppp0的IP地址,remoteip则是将要分配给客户端ppp0(或者虚拟网卡)的。


这两项都可以是多个IP,一般localip设置一个IP就行了,remoteip则视客户端数目,分配一段IP。其中remoteip的IP段需要和localip的IP段一致。


localip和remoteip所处的IP段可以随意些指定,但其范围内不要包含实际网卡eth0的IP地址。一般情况下,使用上面配置文件中的配置就好使了,你需要做的只是把192.168.0.207-217这个IP区间修改成你喜欢的192.168.0.a-b,其中1<a<b<255。




4、打开内核的IP转发功能:


要使VPN服务器可以作为网络请求的中转代理,能够使客户端通过VPN访问Internet,还需要开启内核的IP转发功能。可以编辑配置文件:
 sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0


要使VPN服务器可以作为网络请求的中转代理,能够使客户端通过VPN访问Internet,还需要开启内核的IP转发功能。可以编辑配置文件:


vi /etc/sysctl.conf
找到其中的行:


net.ipv4.ip_forward = 0
修改为:


net.ipv4.ip_forward = 1
然后执行下面命令使上述修改生效:


sysctl -p


5、启动pptpd守护进程:


上面配置完成后,就可以启动pptpd进程并设置自动启动了,和上面iptables的例子类似:


/etc/init.d/pptpd start chkconfig --level 35 pptpd on


6、配置iptables防火墙放行和转发规则:


最后,还需要配置防火墙。这里配置防火墙有三个目的:一是设置默认丢弃规则,保护服务器的安全;
二是放行我们允许的数据包,提供服务;
三是通过配置nat表的POSTROUTING链,增加NAT使得VPN客户端可以通过服务器访问互联网。总之我们的原则就是,只放行我们需要的服务,其他统统拒绝。


首先介绍跟PPTP VPN相关的几项:


允许GRE(Generic Route Encapsulation)协议,PPTP使用GRE协议封装PPP数据包,然后封装成IP报文
放行1723端口的PPTP服务
放行状态为RELATED,ESTABLISHED的入站数据包(正常提供服务的机器上防火墙应该都已经配置了这一项)
放行VPN虚拟网络设备所在的192.168.0.0/24网段与服务器网卡eth0之间的数据包转发
为从VPN网段192.168.0.0/24转往网卡eth0的出站数据包做NAT


iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/24 -o eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -i eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
上述的IP段192.168.0.1/24可能需要修改成/etc/pptp.conf中你配置的localip和remoteip所在地IP段。


在我们这台服务器上,还需要一些其他的服务:


22端口的SSH(非常重要!如果不小心连这个都忘了,基本就只能给VPS服务商发Ticket了)
21端口的FTP控制
80端口的Web服务
允许响应各种icmp请求

[html] view plain copy
  1. #!/bin/bash  
  2. ### Clear Old Rules  
  3. iptables -F  
  4. iptables -X  
  5. iptables -Z  
  6. iptables -t nat -F  
  7. iptables -t nat -X  
  8. iptables -t nat -Z  
  9. ### * filter  
  10. # Default DROP  
  11. iptables -P INPUT DROP  
  12. iptables -P FORWARD DROP  
  13. iptables -P OUTPUT DROP  
  14. # INPUT Chain  
  15. iptables -A INPUT -p gre -j ACCEPT  
  16. iptables -A INPUT -i lo -p all -j ACCEPT  
  17. iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT  
  18. iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT  
  19. iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT  
  20. iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT  
  21. iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT  
  22. iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  
  23. # OUTPUT Chain  
  24. iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT  
  25. # FORWARD Chain  
  26. iptables -A FORWARD -s 192.168.0.0/24 -o eth0 -j ACCEPT  
  27. iptables -A FORWARD -d 192.168.0.0/24 -i eth0 -j ACCEPT  
  28. ### * nat  
  29. # POSTROUTING Chain  
  30. iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE  





需要注意的是,这个脚本开头首先清除掉了所有iptables规则,然后才部署新的规则,如果你需要保留你机器上现有的规则,请千万不要执行前面的清除语句,或者做好旧规则的备份再做实验:


iptables-save > iptables.backup
如果想恢复使用上面命令做好的备份,可以:


iptables-resotre iptables.backup
最后,如果确定所有的iptables规则已经合乎你的心意,就可以执行下面命令,将iptables规则保存下来。


/etc/init.d/iptables save


安全建议
在Twitter上得到了@alexwwang @helijohnny的指点,知道VPN与这个网站放在一起,可能不安全。他们建议我为VPS增加一个IP,可以让VPN服务和Web走不同的IP,这样就不会因为Web网站发表的内容轻易暴露VPN服务器的IP了。之前我只是在测试机上测试过,今天终于新购得一个IP地址,得以把这一部分补全。