隧道技术的基本过程是在源局域网与公网的接口处将数据(可以是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 #允许外出请求。