隧道技术的基本过程是在源局域网与公网的接口处将数据(可以是ISO 七层模型中的数据链路层或网络层数据)作为负载封装在一种可以在公网上传输的数据格式中,在目的局域网与公网的接口处将数据解封装,取出负载。被封装的数据包在互联网上传递时所经过的逻辑路径被称为“隧道”。

目前×××隧道协议有4种:点到点隧道协议PPTP、第二层隧道协议L2TP、网络层隧道协议IPSec以及SOCKS v5.

    原理:PPTP使用一个TCP连接对隧道进行维护,使用通用路由封装(GRE)技术把数据封装成PPP数据帧通过隧道传送。可以对封装PPP帧中的负载数据进行加密或压缩。

检查

由于部分VPS可能无法安装,请先检查服务器环境。

第一步:检查内核MPPE补丁是否安装

modprobe ppp-compress-18 && echo ok        #执行结果显示为ok则表示通过。

第二步:检查系统是否开启TUN/TAP支持

cat /dev/net/tun    #结果为cat: /dev/net/tun: File descriptor in bad state

第三步:检查PPP是否支持MPPE.

strings '/usr/sbin/pppd' |grep -i mppe | wc --lines    #结果为0则表示不支持,输出大于30的数字则表示支持MPPE(Microsoft Point to Point Encryption,微软点对点加密)

准备:

关闭防火墙

service iptables stop

下载我们所需的有关PPTP的软件。

wget http:///downloads/dkms-2.0.17.5-1.noarch.rpm
wget http://wty.name/linux/sources/kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
wget http://poptop.sourceforge.net/yum/stable/rhel6/i386/ppp-2.4.5-33.0.rhel6.i686.rpm
wget http://poptop.sourceforge.net/yum/stable/rhel6/i386/pptpd-1.4.0-1.el6.i686.rpm

安装:

为方便解决软件的依赖性,我们可以使用yum来安装本地的软件包。注意:我是在安装Kernel时一直安装不成功,重启服务器后正常安装。

yum install dkms-2.0.17.5-1.noarch.rpm     #自动解决了依赖性
yum install ppp-2.4.5-33.0.rhel6.i686.rpm
yum install kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
yum install pptpd-1.4.0-1.el6.i686.rpm

配置:

1.配置/etc/ppp/options.pptpd

cp /etc/ppp/options.pptpd /root/backup/options.pptpd.bak        #备份原始的配置文件。
vim /etc/ppp/options.pptpd                                      #编辑配置文件
#加入以前两行后保存退出
ms-dns 8.8.8.8
ms-dns 8.8.4.4

2.配置/etc/ppp/chap-secrets

cp /etc/ppp/chap-secrets /root/backup/chap-secrets.bak        #备份原始配置文件。
vim /etc/ppp/chap-secrets                                     #编辑配置文件
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
  vpnuser1      pptpd   vpnuser1                *                #添加×××用户,名为vpnuser1,密码为vpnuser1,允许所有主机连接。

3.配置/etc/pptpd.conf

cp /etc/pptpd.conf /root/backup/pptpd.conf.bak
vim /etc/pptpd.conf
#添加如下两行
localip 192.168.0.1
remoteip 192.168.0.11-130                              //表示vpn客户端获得ip的范围

4.配置/etc/sysctl.conf

vim /etc/sysctl.conf
#修改以为部分
net.ipv4.ip_forward=1                        #开启转发功能
#net.ipv4.tcp_syncookies=1                      #将该项注释掉
sysctl -p        #让sysctl.conf的配置即时生效。

启动服务:

service pptpd start            #启动服务,当使用restart时已建立的连接不会断开。

这是我们就可以连接×××了,但这时连接上是上不了网的,我们需要在iptables中开启nat功能。

service iptables start
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE

或使用

service iptables start
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j SNAT  --to-source 你自己的公网IP

这时我们可以测试我们的×××了,确认没有问题后我们可以再优化一下我们的iptables,提高服务器的安全性。

#iptables script
#Author:Winter
#Date:2014-06-21
#Version:1.0
#++++++++++++++++++++++++++++++++++++
 
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
export PATH
#加载相关模块:
modprobe ip_tables
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc 
 
# 清空所有规则:
iptables -F
iptables -X
iptables -Z
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
  
# 设置默认规则:                                                
iptables -P INPUT DROP                                        #默认拒绝所有进入的请求
iptables -P OUTPUT DROP                                   #默认拒绝所有出去的请求
iptables -P FORWARD DROP                            #默认拒绝所有转发的请求
iptables -t nat -P PREROUTING ACCEPT               
iptables -t nat -P POSTROUTING ACCEPT               
iptables -t nat -P OUTPUT ACCEPT                #默认允许所有nat的请求
  
# 允许所有进出回环口的请求
iptables -A INPUT -i lo -j ACCEPT
# 允许特定端口(对应服务)的请求
iptables -A INPUT -p tcp --dport 22 -j ACCEPT             #ssh
iptables -A INPUT -p tcp --dport 21 -j ACCEPT             #ftp
iptables -A INPUT -p tcp --dport 20 -j ACCEPT             #ftp
iptables -A INPUT -p tcp --dport 80 -j ACCEPT             #www
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT       #PPT
iptables -A INPUT -p gre -j ACCEPT                      #grp,协议号47
iptables -A INPUT -p tcp --sport 443 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT 

iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT            #允许×××客户端转发
iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT            #允许×××客户端转发
 
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE        #nat地址转换
iptables -I OUTPUT 1 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT    #允许外出请求。