LINUX网关后面的pptp vpn客户机连接vpn

给iptables打pptp-conntrack-nat 补丁

这里好象没有最新的关于经过iptables 1.3.4 nat 后 pptp client connect vpn server  和2.6.14.2内核的文章.

pptp 采用GRE封装,GRE header里不象tcp,udp里有端口号,如果你编译内核时在netfilter没有选上pptp,那么在iptables是不认的,protocol field "unkown".编译好后,记得modprobe ip_nat_pptp,默认不加载,我不知道怎么默认加载,呵呵.

再添加入下:

iptables -t nat -I PREROUTING -p gre -d natserveripaddress -j DNAT --to pptp-client-ip-addres

以上的意思是将所有来自vpn server 的GRE包转发到pptp client.


iptables 1.3.4 和2.6.14.2内核已经支持pptp 了,不必再patch-o-magic.

多个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,这是一个用户空间下的gre包转发工具。只要下载源码,编译,得到了pptpproxy。比如你的linux网关内网ip是192.168.0.254,vpn服务器是202.202.202.202,只要运行

pptpproxy -p 202.202.202.202

就可以了

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

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

pptpproxy还支持多vpn server代理。

如果你运行的是*BSD或者MAC,也许frickin更符合你的需要。