多个PPTP VPN客户机通过LINUX网关连接VPN服务器

PPTP方式的VPN使用了GRE协议,这个协议跟TCP/UDP是同一级的协议。因为GRE协议没有端口的概念,LINUX不能像TCP/UDP那样IP伪装。所以,LINUX网关后面的pptp vpn客户机连接vpn时总会遇见这种那种的问题。

所以,当只有单个客户机通过linux网关连接VPN的时候,最简单的办法是用iptables把所有GRE协议的包转发给客户机。比如客户机的ip是192.168.0.2,iptables命令是

iptables -t nat -I PREROUTING -p gre -j DNAT --to-destination 192.168.0.2

上面的命令感觉很奇怪,当这个规则输入了,即使立刻删除,也依旧生效,一直过了好久才断掉。

当然,如果客户机连接的vpn ip地址互不相同,还可以根据源ip地址DNAT。但是,当多台机器要连接相同的pptp vpn服务器时,问题就出现了,简单的DNAT规则并不能生效,因为他们都是GRE协议。唯一能分辨的就只有GRE包里面的Class ID。这个ID在默认的linux防火墙上并没有得到支持。解决方法有两个

1,使用2.0版本以上的iptables,里面内置了ip_nat_gre等模块用于支持gre包的ip伪装。这个方案比较复杂,工程浩大,还要给内核打补丁。以后更新内核的时候也更加麻烦。

2,使用pptp proxy(http://www.mgix.com/pptpproxy/)。这是一个用户空间下的gre包转发工具。只要下载源码,编译,得到了pptpproxy。比如你的linux网关内网ip是192.168.0.254,vpn服务器是202.202.202.202,只要运行

pptpproxy -p 192.168.0.254,202.202.202.202

就可以了

这时,vpn客户机只要把192.168.0.254作为vpn服务器ip地址就可以了。

当然,让pptp监听在127.0.0.1,然后配合一些iptables转发规则,甚至可以做成一个透明pptpproxy代理。

pptpproxy还支持多vpn server代理。

如果你运行的是*BSD或者MAC,也许frickin(http://frickin.sourceforge.net/)更符合你的需要

Net | 评论(1) | 引用(20) | 阅读(20333)
li
2008/12/22 18:29
高手,太感谢了.
分页: 1/3 第一页 1 2 3 下页 最后页