VPN 访问外网问题及解决办法

网上有很多配置 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”模块,是无效的。

Creative Commons License Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution 4.0 International license .