搭建的PPTP的VPN在公司连经常报619错误,花费了我很多时间去解决。
但是经常是一会好一会不好,看log之看到是超时。今天才知道原来是网关iptables的问题。
PPTP方式的VPN使用了GRE协议,这个协议跟TCP/UDP是同一级的协议。因为GRE协议没有端口的概念,LINUX不能像TCP/UDP那样IP伪装。所以,LINUX网关后面的pptpvpn客户机连接vpn时总会遇见这种那种的问题。
所以,当只有单个客户机通过linux网关连接VPN的时候,最简单的办法是用iptables把所有GRE协议的包转发给客户机。比如客户机的ip是192.168.0.2,iptables命令是
iptables -t nat -I PREROUTING -p gre -j DNAT --to-destination192.168.0.2
上面的命令感觉很奇怪,当这个 规则输入了,即使立刻删除,也依旧生效,一直过了好久才断掉。
当然,如果客户机连接的vpn ip地址互不相同,还可以根据源ip地址DNAT。但是,当多台机器要连接相同的pptpvpn服务器时,问题就出现了,简单的DNAT规则并不能生效,因为他们都是GRE协议。唯一能分辨的就只有GRE包里面的ClassID。这个ID在默认的linux防火墙上并没有得到支持。
为了方便,打算用L2TP的或者SSTP的VPN试试吧。。