VPN 访问外网问题及解决办法
On 2012-11-28 13:18:18 By SoliVPN 访问外网问题及解决办法
网上有很多配置 VPN 的文章,或许你已经根据其中的一篇配置好了你的 VPN。但你也可能发现,虽然成功连接上了 VPN 但仍然访问不了被屏蔽的网站。
如果出现这种情况,那你就需要做下面这些操作了。
配置 iptables
客户端能连接到 VPN 后,还需要在 VPN 山配置 iptables 以允许客户端使用此 VPN 访问外网。
首先,开启 ip 转发:
# echo -n 1 > /proc/sys/net/ipv4/ip_forward
然后,向 iptables 添加规则:
# /sbin/iptables -t nat -s 192.168.0.0/24 -A POSTROUTING -o eth0 -j MASQUERADE
其中,192.168.0.0
与你在 /etc/pptpd.conf
里配置的 remoteip
对应;eth0
与你的 VPN 的网卡名对应。
为了在每次启动时,以上两步都被执行,可以将上面两句追加到 /etc/rc.local
文件中。
问题一
如果你使用的是国外的 VPS 架设你的 VPN,在执行上述操作是,可能会遇到如下错误:
iptables: No chain/target/match by that name
在网上搜到的很多文章说,这是因为系统没有加载 iptables 模块导致的。可以通过 lsmod
来检查内核是否加载了该模块,然后用如下命令加载:
# modprobe iptables
实践证明这是行不通的,至少在 VPS 上是不行的。
其实,(据说)真正的原因是因为“openvz 没有把 MASQ 模块虚拟化”:
iptables "MASQUERADE" isn't virtualized
解决办法如下:
对于 xen/kvm:
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
对于 OpenVZ:
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o venet0 -j SNAT --to YourIP
注意,你可能需要根据你的情况替换上面的“192.168.0.0”、“eth0”、“venet0”和“YourIP”。
使用下面的命令查看是否设置成功:
# iptables -L -t nat
如果成功了,就把相应的命令追加到 /etc/rc.local
,让它开机执行吧。
问题二
经过以上折腾,应该可以顺利使用 VPN 了。
在配置 VPN 的过程中,我还遇到了一个客户端连接不上 VPN 的问题。查看 pptpd 的日志,发现有如下错误:
: LCP: timeout sending Config-Requests
: Connection terminated.
: Modem hangup
: Exit.
奇怪的是,有时能连接成功,然后就再也连接不上了。纠结了几天后终于找到了解决办法。
把 /etc/pptpd.conf
中的
localip 192.168.10.1
remoteip 192.168.10.50-245
改成
localip 192.168.0.1
remoteip 192.168.0.50-245
之后问题解决。
同样的,搜索到的其他方法,比如安装“ip_nat_XXX”模块,是无效的。