使用 OpenVPN 服务器翻墙的相关问题解决

转自:http://igfw.tk/archives/1141

前一段时间参照这篇在Ubuntu上搭建OpenVPN服务器,并配合Mac和Windows的客户端 (一)在自己的 VPS 上装好 OpenVPN 服务器后使用一直不太正常,这两天花了点时间调试解决,结果总结如下。调试期间多次得到 @yegle @ChandleWEi @Greendamn@FretiaX 等推友的帮助,尤其是 @ChandleWEi 深夜还在我家现场调试 iptables,特此感谢。

MTU 太大造成的连接不稳定

症状

刚连接上 OpenVPN 只用浏览器打开一两个页面时速度很正常,但随着流量加大网络就会开始阻塞,直到完全无法连接任何服务器。而且与 OpenVPN 服务器之间的连接容易自动断开。

解决方案

在 OpenVPN 服务器的 server.conf 里加入 mssfix 1300。此方案由 @yegle 提供。数字应该是他多次测试得出的较优选择,我试过设为 mssfix 1400 自己的 PC 没问题,而朋友的机器会速度奇慢。

DNS 污染造成的部分墙外网站无法访问

症状

连接 OpenVPN 后 Twitter 可以正常访问,被严重 DNS 污染的 Facebook 则会被浏览器提示无法连接。

解决方案

在 OpenVPN 服务器上使用 iptables 强行劫持客户端对任何 DNS 服务器的查询请求,将请求的目标 IP 地址修改为墙外的 DNS 服务器,例如 Google 的公共 DNS 服务器 8.8.8.8 和 8.8.4.4。此方案参照 @yegle 的方案稍作修改,不需要 OpenVPN 服务器自己提供 DNS 服务。iptables 命令如下:

  1. iptables -t nat -A PREROUTING -p udp –dport 53 -j DNAT –to-destination 8.8.8.8
iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 8.8.8.8

残留问题

虽然这个近乎暴力的方式可以很有效并且是一劳永逸地从服务器端解决 DNS 污染问题,但还是有一种情况必须由客户端自己更改 DNS 地址。这种情况为,客户端的 DHCP 设备(一般就是共享上网用的路由器)为其分配的 DNS 地址与网关地址在同一个网段,或者通常就是同一个地址。这样就算是连接上 OpenVPN 后默认网关变成了 OpenVPN 服务器的 IP 地址,但由于 DNS 跟原网关在同一个网段,客户端的 DNS 查询请求还是会不进入 OpenVPN 而直接从原网关发出,导致得到被污染的错误结果。

解决方案

手动设置客户端的 DNS 地址为任意墙外 DNS 地址,例如 Google 的公共 DNS 服务器 8.8.8.8 和 8.8.4.4。

Windows UAC(用户帐户控制)导致 OpenVPN GUI 无法设置 OpenVPN 服务器为默认网关

症状

在服务器端解决了以上问题之后,客户端 OpenVPN GUI 可以连接成功。但仍然无法访问墙外网站,nslookup www.facebook.com 会得到明显被污染的 IP 地址。route print 可以观察到路由表中的默认网关没有 OpenVPN 服务器 IP 地址。

解决方案

关掉 UAC,或者以管理员身份启动 OpenVPN GUI。

来源:Rainux’s Journal 原文:使用 OpenVPN 服务器翻墙的相关问题解决


没有评论: