2012年1月20日星期五

VPN故障排除

在Linux上配置了L2TP/IPSec,用 Android手机连上去,不能访问因特网。后来想到服务器内核的ip_forward没有打开,这样手机的请求在ppp0上可以看到,但是内核不会转发 给默认网关网卡。开了后,在服务器的默认网关网卡上可捕捉到手机对Internet的访问,但是收不到回复包。连DNS都不通,先搞定这个。

直接在服务器上查询dig @8.8.8.8 ebay.com是成功的:
11:11:26.994869 IP 10.146.18.213.50984 > 8.8.8.8.domain: 17471+ A? ebay.com. (26)
11:11:26.997250 IP 8.8.8.8.domain > 10.146.18.213.50984: 17471 4/0/0 A 66.135.205.13, A 66.135.205.14, A 66.211.160.87, A 66.211.160.88 (90)
该包的源地址10.146.18.213eth0的inet地址。而手机上的DNS查询,在服务器eth0抓的包如下:
11:16:11.133115 IP 192.168.1.128.58100 > 8.8.8.8.domain: 57041+ A? www.ebay.com. (30) 
eth0上出发的包,地址却是VPN上客户端的地址192.168.1.128,这应该是失败的原因,这样的包到都到不了DNS服务器(内核会丢弃吗?)。

后来才想到要做SNAT的,要让VPN用户访问外网这是必须的一步:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.146.18.213
以后一定要记得了。虽然忘记了这一步,但是通过冷静分析,通过抓包搞清了问题的原因。

没有评论:

发表评论