LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1209|回复: 6

总结slackware10.0安装PPTPD服务做MPPE加密VPN的全过程

[复制链接]
发表于 2005-5-14 18:46:08 | 显示全部楼层 |阅读模式
环境:
PIII450/128M/10G/G200
SLACKWARE 10.0 (核心2.4.26)
默认安装
1.首先下载需要的文件(下载到/root目录下)

[PHP]wget ftp://slackware.no/linux/kernel/v2.4/linux-2.4.26.tar.bz2
wget http://www.polbox.com/h/hs001/linux-2.4.26-mppe-mppc-1.0.patch.gz
wget http://linuxpackages.slackwaresupport.com/Slackware-10.0/Daemon/pptpd/pptpd-1.1.4-i386-1ah.tgz[/PHP]
然后补丁核心:
[PHP]cd /root
tar xfvj linux-2.4.26.tar.bz2
gunzip linux-2.4.26-mppe-mppc-1.0.patch.gz

mv linux-2.4.26 /usr/src/linux-2.4.26-VPN
cd /usr/src/
ln -s linux-2.4.26-VPN/ linux

cd /usr/src/linux
zcat /root/linux-2.4.26-mppe-mppc-1.0.patch.gz |patch -p1
cp /boot/config-ide-2.4.26 .config
make oldconfig[/PHP]
当出现MPPE选项时选择m,编译成内核模块,接着编译内核:
[PHP]
make dep
make bzImage
make modules(很长时间,我好象用了40分钟)
make modules_install

cp arch/i386/boot/bzImage /boot/bzImage-2.4.26-VPN
cp System.map /boot/System.map-vpn-2.4.26
cp .config /boot/config-vpn-2.4.26

cd /boot
ln -sf config-vpn-2.4.26 config
ln -sf System.map-vpn-2.4.26 System.map[/PHP]
然后更改/root/lilo.conf文件配置
把 image = /boot/vmlinuz  一句
改为
[PHP]image = /boot/bzImage-2.4.26-VPN[/PHP]
再打开/etc/rc.d/rc.modules
在最后一行增加
[PHP]/sbin/modprobe ppp_mppe_mppc[/PHP]

2.安装pptpd:

[PHP]cd /root
installpkg pptpd-1.1.4-i386-1ah.tgz[/PHP]

编辑 /etc/pptpd.conf
内容:

[PHP]
debug
option  /etc/ppp/options.pptpd
localip 10.87.200.1
remoteip 10.87.200.2-10
pidfile /var/run/pptpd.pid
[/PHP]

编辑 /etc/ppp/options.pptpd
内容:

[PHP]mtu 1450 #(发送包大小;据说很重要)
mru 1450 #(接收包大小;单位:bytes)
-chap #(不使用CHAP验证方式)
-mschap #(不使用MSCHAP验证方式)
+mschap-v2 #(使用mschap-v2验证方式)
lcp-echo-failure 30
lcp-echo-interval 5
ipcp-accept-local
ipcp-accept-remote
proxyarp #(Create proxy ARP entry)
lock #(锁定PTY设备文件,没有研究出到底什么含义,我看WEBMIN中这样翻译的.)
auth #(是否需要使用/etc/ppp/chap-secrets文件来验证,我这里需要验证)
name pptpd  #(PPTPD服务器名称,和下边要设置的chap-secrets 对应)
ms-dns 202.102.227.68 #(拨入VPN后的的DNS地址)
ms-dns 10.87.13.86 #(可以设置两个)
#ms-wins *.*.*.* #(过时了,我没有设置)
#netmask 255.255.255.0 #(这个选项是其他文章中抄来的,不管怎样设置子网都是#255.255.255.255
#ppp就是点对点协议,所以子网必须是255.255.255.255,即使设置也无效)

require-mppe #(使用MPPE加密)
require-chap #(使用验证)
require-mppe-40 #(使用 40-bit MPPE 加密)
require-mppe-128 #(使用 128-bit MPPE 加密)[/PHP]
编辑/etc/ppp/chap-secrets
内容:
[PHP]# Secrets for authentication using CHAP
# client        server          secret          IP addresses
# example_user  *               <password>      *
recoilest  pptpd  123456  "*"
#"recoilest"是拨入VPN用户名称; "pptpd" 是服务器名称; "123456"是拨入VPN密码;
#如果允许VPN自动分配远程接入IP地址,那么可以像上边一样设置为"*";
#如果需要指定远程IP地址的话可以这样:
#recoilest  pptpd  123456  10.87.200.6[/PHP]
这样设置就完成了,通过
[PHP]sh /etc/rc.d/rc.pptpd start [/PHP]
可以启动PPTPD服务,启动后netstat -a可以看到
[PHP]tcp        0      0 *:pptp                  *:*                     LISTEN[/PHP]
说明服务已经启动了.
如果需要服务器启动时启动PPTPD服务可以在rc.local中加入:
[PHP]sh /etc/rc.d/rc.pptpd start[/PHP]
在使用过程中,我发现使用 sh /etc/rc.d/rc.pptpd stop 不是很有效,不如killall pptpd

3.通过VPN转发数据:

我的iptables设置:
[PHP]modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

iptables -t nat -A POSTROUTING -o eth0 -s 10.87.200.0/24 -j MASQUERADE

iptables -A FORWARD -p udp -s 10.87.200.0/24 --dport 53 -j ACCEPT
iptables -A FORWARD -p tcp -s 10.87.200.0/24 --dport 1723 -j ACCEPT
iptables -A FORWARD -p gre -s 10.87.200.0/24 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT[/PHP]

4.通过XP拨入VPN

开始--〉设置--〉网络连接--〉创建一个新的连接,下一步--〉连接到我的工作场所的网络--〉虚拟专用网络连接--〉名子--〉初始连接-- 〉主机或者IP地址--〉完成

使用帐户: recoilest 密码:123456 拨入.

如果出现

说明成功了.

5.拨入后网络访问的问题

重要提示1以上设置只能默认通过ETH0来转发数据
如果需要访问其他网络资源,需要增加静态路由表(在服务器端,根据环境设置)

[PHP]route add -net 10.87.1.0/24 gw 10.87.2.254[/PHP]

重要提示2如果你拨入以后不能访问本地网络,请手动更改路由表(在工作站端,根据环境)
或者把 VPN连接属性中---IP设置-----高级----在远程网络上使用默认网关 选项取消对钩

最后
希望大家遇到什么问题,我们可以探讨.
也可以到http://www.poptop.org/看一下
 楼主| 发表于 2005-5-14 20:18:03 | 显示全部楼层

还有一个问题期待解决

这个东西真的很不错
不过启用了MPPE 128加密以后.速度感觉下降了一些.
而且有很少一部分网站打不开.
我是郑州的http://www.zz.ha.cn 打不开.
可能是
mtu 1450  
mru 1450
设置的问题.
应该不是iptables的问题.
很奇怪,远程VPN客户是可以ping通 http://www.zz.ha.cn

如果关闭了MPPE加密 就一切正常了。

faint 能不能帮帮忙看一下
回复 支持 反对

使用道具 举报

发表于 2005-5-14 22:24:33 | 显示全部楼层
好帖。。。

兄弟辛苦了。。

已经收到  http://slack.linuxsir.cn

北南 呈上
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-15 00:45:29 | 显示全部楼层
谢谢加精
网上的其他文章有很多不正确的地方,我也参考了很多E文,以及官方.
这东西不好搞,我弄了一个星期.
希望写出来对大家都有所帮助.
回复 支持 反对

使用道具 举报

发表于 2005-5-15 13:12:53 | 显示全部楼层
不错的帖子。
回复 支持 反对

使用道具 举报

发表于 2005-5-15 13:16:04 | 显示全部楼层
Post by Recoilest
这个东西真的很不错
不过启用了MPPE 128加密以后.速度感觉下降了一些.
而且有很少一部分网站打不开.
我是郑州的http://www.zz.ha.cn 打不开.
可能是
mtu 1450  
mru 1450
设置的问题.
应该不是iptables的问题.
很奇怪,远程VPN客户是可以ping通 http://www.zz.ha.cn

如果关闭了MPPE加密 就一切正常了。

faint 能不能帮帮忙看一下


可能和你的isp有关吧。如果是adsl,用iptables可以调整一下MSS的,TCPMSS,
man iptables看看、
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-2 01:05:17 | 显示全部楼层
补充 为什么一些网站不能访问 (转自 http://hackhome.com/2005/5-16/20423160592.shtml)
这是一个比较复杂的问题。首先,发现问题的过程是这样的:笔者使用一台WinXP的电脑(简称主机A)连接公司的VPN成功后,访问内网的一个基于 B/S的CRM系统(简称主机B)时,发现首页可以显示(页面比较简单,包含的数据量较小),输入账号密码登陆后,发现只能显示页面顶部的一点点内容,而下面大部分内容无法显示。而换一台Win2000的电脑登陆,内容就可以完全显示出来。登陆到Linux VPN主机上,利用tcpdump对数据传输过程进行抓包分析,发现:每当B向A传输大于1396字节的数据时,VPN主机就会反馈B如下信息
注意:
10.87.0.200:VPN主机的内网网卡的IP地址
10.87.200.1:主机A的IP地址
10.87.200.6:主机B通过VPN获取的IP地址
21:54:21.953848 IP 10.87.0.200 > 10.100.0.100: icmp 556: 10.100.0.203 unreachable -
need to frag (mtu 1396)
可以看到VPN主机向提供web服务的主机B返回了一个ICMP不可达的差错报文。其含义是VPN主机收到了一个需要分片才能通过的数据包,而这个数据包在其IP头部又设置了不能分片(DF)的标志。所以该数据包不能通过VPN主机。
根据TCP/IP协议,在建立TCP连接时,传输双方都要指明自己的mss(最大报文长度)大小,然后选取双方之中最小的那个mss,以避免在随后的数据传送过程中出现数据包分片传输的情况。通过抓包分析,主机B的mss为1460字节,主机A的mss为1357字节。两者取小所以双方协商的结果确定 mss为1357字节,也就是说以后进行TCP数据传输时,数据包的最大传输单元MTU不能超过1397(mss+20字节的IP头部+20字节的TCP 头部),同时在IP头部设置了不能分片(DF)的标志。
然后在VPN主机上执行netstat –i,观察各个网络接口的路径MTU值为多少。观察结果如下:
Iface MTU
eth0 1500 //外网网卡接口
eth1 1500 //内网网卡接口
lo 16436 //本机回环接口
ppp0 1396 //WinXP VPN接入通道接口
可以看到ppp0接口的路径MTU为1396字节,也就是说如果一个数据包想要通过这个接口的话,一定不能大于1396字节,如果大于这个值,会出现两种结果:
1、如果这个数据包的IP头部没有设置不能分片(DF)的标志,那么VPN主机就把这个数据包分片,使其数据包大小小于1396字节,然后允许其通过。
2、反之,如果这个数据包的IP头部设置不能分片(DF)的标志,那么VPN主机就会返回一个ICMP不可达的差错报文。同时丢弃这个数据包。
问题就出在这里,主机A和主机B协商的mss为1357字节,也就是说其TCP数据包的MTU为1397,而ppp0允许的路径MTU却为1396,主机 A的MTU居然大于ppp0的路径MTU!当主机B向主机A发送了一个1397字节的数据包时,自然不能通过ppp0接口了。回到发现问题的那个情况,首页之所以能够显示成功,是因为首页包含的数据较小,传输时只需要一个没有超过1396字节的IP数据包就可以了,所以能够显示出来,而登陆成功后的页面包含的数据较大,需要分为多个IP数据包进行传输。这里可以假设一下,开头的一个IP数据包因为没有超过1396字节因而通过,而随后的IP数据包因为其大小为1397字节,超过了路径MTU,所以不予通过。反映到页面,就是登陆页面下面的大部分内容无法显示了。
我们再来看看用安装了Win2000主机C连接VPN又是什么状况呢?通过抓包发现,主机C提出的mss为1360(可以推算出其MTU为1400),而执行netstat –i,发现此时的ppp0的MTU为1496,路径MTU大于主机C的MTU,这个结果是正常的。
大家一定会问,何主机B提出的MTU小于路径MTU,这个问题只能问问微软了,我查了一些英文资料,说这是WinXP本身系统的一个问题。
知道了问题的原理,那让我们来看看如何进行解决吧。解决方法很简单,就是借助iptalbes,设定主机B进行协商时提出的mss为1356。即在iptables里面加入一条规则:
iptables -A FORWARD -p tcp --syn -s 10.87.200.0/31 -j TCPMSS --set-mss 1356
因为mss是在TCP连接建立开始时,通过带有syn标志的IP数据包进行传输的,所以我们在iptables里面规定,在转发数据时,只要发现带有 syn标志并且源地址为主机B的IP数据包时,将其mss设定为1356字节,这样就与ppp0接口的路径MTU向匹配了,数据自然就可以畅通无阻啦。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表