Vpn部署过程

1、验证内核是否加载了MPPE模块:

    内核的MPPE模块用于支持Microsoft Point-to-Point Encryption。Windows自带的×××客户端就是使用这种加密方式,主流的Linux Desktop也都有MPPE支持。其实到了我们这个内核版本,默认就已经加载了MPPE,    

modprobe ppp-compress-18 && echo MPPE is ok

2、安装所需的软件包:

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

yum install ppp

     有了PPP协议支持,接下来安装pptpd。首先到这里找到最新版适合你的平台的pptpd。CentOS与RHEL通用,Fedora系统则可以使用后缀含fc字样的包,然后还需要根据内核选择32位或者64位的包。找到正确的软件包以后,复制其URL,然后用wget下载到root的家目录(或者用rpm -ivh URL直接安装也行)。譬如我的32位内核CentOS 5,使用下面命令下载:

wget   && rpm -ivh pptpd-1.3.4-2.rhel5.i386.rpm

     设置iptables,pptpd开机自启动

chkconfig iptables on && chkconfig pptpd on

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

vi /etc/ppp/options.pptpd
name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 8.8.8.8
ms-dns 8.8.4.4
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd

    其中name后面的pptpd是服务名称。

 

   接下来的几行以refuse或者require开头的指令,是配置拒绝和接受的加密方式,这里接受的mschap-v2和mppe-128都是较新的比较安全的加密方式,其中mppe-128需要第一步中验证的内核模块支持。

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

  修改用户账户的文件:

vi /etc/ppp/chap-secrets

username2    pptpd    passwd2    *

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

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

 

    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转发功能:

 

要使×××服务器可以作为网络请求的中转代理,能够使客户端通过×××访问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使得×××客户端可以通过服务器访问互联网。总之我们的原则就是,只放行我们需要的服务,其他统统拒绝。

 

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

 

允许GRE(Generic Route Encapsulation)协议,PPTP使用GRE协议封装PPP数据包,然后封装成IP报文

放行1723端口的PPTP服务

放行状态为RELATED,ESTABLISHED的入站数据包(正常提供服务的机器上防火墙应该都已经配置了这一项)

放行×××虚拟网络设备所在的192.168.0.0/24网段与服务器网卡eth0之间的数据包转发

为从×××网段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请求

根据上述需求,加上服务器的基本要求,我写了下面的shell脚本。这个脚本默认DROP掉没有明确允许的规则,然后允许包括上面×××相关的规则和上述几项其他服务所需的规则。可以根据你的实际需求,修改这个脚本,然后执行这个脚本快速部署iptables规则。

#!/bin/bash
### Clear Old Rules
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
### * filter
# Default DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# INPUT Chain
iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# OUTPUT Chain
iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
# FORWARD Chain
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
### * nat
# POSTROUTING Chain
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的指点,知道×××与这个网站放在一起,可能不安全。他们建议我为VPS增加一个IP,可以让×××服务和Web走不同的IP,这样就不会因为Web网站发表的内容轻易暴露×××服务器的IP了。之前我只是在测试机上测试过,今天终于新购得一个IP地址,得以把这一部分补全。

 

单网卡配置多个IP地址

 

CentOS下单网卡配置多个IP很容易。例如,假设现在网卡eth0已经有一个IP地址是123.123.123.123/24,想要增加一个IP是123.123.123.124/24,可以在/etc/sysconfig/network-scripts/目录下增加一个新的虚拟网卡配置文件ifcfg-eth0:0。想省事的话可以直接把ifcfg-eth0复制成ifcfg-eth0:0。然后编辑其内容,例如:

 

DEVICE=eth0:0

BOOTPROTO=static

ONBOOT=yes

IPADDR=123.123.123.124

NETMASK=255.255.255.0

虚拟网卡eth0:0配置的信息看起来有些少,其实它会共享实际设备eth0的配置信息,因此如上简单的配置就够了。另外如果在这张网卡上还需要添加更多的IP地址,照此例增加eth0:1、eth0:2等等虚拟设备既可。

 

多IP的iptables配置

 

然后关于iptables配置,思路就是在INPUT链上使用-d区别目的IP,只在Web等服务使用的IP上放行22和80等几个端口,×××服务的IP上只放行1723端口。

 

如果喜欢的话也可以为新增加的IP绑定一个不同的域名,只要防火墙配置好了,然后×××使用的IP域名都不公开,理论上是挺难找到×××服务地址的,这也是自建×××的一个好处。这里再提供一个iptables规则的配置脚本,与上面的脚本类似,只是做了少量的修改,适用于多IP的情况:

 

#!/bin/bash
 
# Clear Old Rules
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
 
### * filter
 
# Default DROP and ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
 
# INPUT Chain
iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A INPUT -p tcp -m tcp -d 123.123.123.123 --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -d 123.123.123.123 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -d 123.123.123.123 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -d 123.123.123.123 --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -d 123.123.123.124 --dport 1723 -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 
# OUTPUT Chain
iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
 
# FORWARD Chain
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
 
### * nat
 
# POSTROUTING Chain
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

这样配置完成后,对公开的Web域名进行端口扫描,就只能扫描到80等端口,而×××服务使用的域名IP不公开,就保证了安全性。我手欠扫描了一下我们的服务器,结果就成了这样:

 

[root@sheldon ~]# nmap -sS gnailuy.com

 

Starting Nmap 5.21 ( http://nmap.org ) at 2011-07-20 20:46 CST

Nmap scan report for gnailuy.com (One of our IP address)

Host is up (0.31s latency).

Not shown: 996 filtered ports

PORT    STATE SERVICE

21/tcp  open  ftp

22/tcp  open  ssh

80/tcp  open  http

443/tcp open  https

 

Nmap done: 1 IP address (1 host up) scanned in 17.44 seconds

[root@sheldon ~]# nmap -sS vpnservers.domain.name

 

Starting Nmap 5.21 ( http://nmap.org ) at 2011-07-20 20:53 CST

Nmap scan report for vpnservers.domain.name (Our another IP address)

Host is up (0.32s latency).

Not shown: 999 filtered ports

PORT     STATE SERVICE

1723/tcp open  pptp

 

Nmap done: 1 IP address (1 host up) scanned in 24.52 seconds

 

附:

#!/bin/bash
### Clear Old Rules
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
### * filter
# Default DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# INPUT Chain
iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# OUTPUT Chain
iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
# FORWARD Chain
iptables -A FORWARD -s 192.168.6.0/24 -o eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.6.0/24 -i eth0 -j ACCEPT
### * nat
# POSTROUTING Chain
iptables -t nat -A POSTROUTING -s 192.168.6.0/24 -o eth0 -j MASQUERADE
 
 
 
name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 8.8.8.8
ms-dns 8.8.4.4
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd
 
 
option /etc/ppp/options.pptpd
#logwtmp
localip 59.108.33.30
remoteip 192.168.10.6-233