Gangmax Blog

使用VPN时发生server timeout问题的解决

最近忽然发现使用vpn的时候,原来可以访问的国外网站都发生了timeout错误,如twitter和facebook,而访问国内网站都没有问题。

首先我当然是怀疑vpn service的问题,但是发现同样的vpn service在Windows下正常而在Ubuntu下就有错,这说明vpn service本身是工作的。

其次我怀疑是本地Ubuntu下vpn配置的问题,但是随后发现,同样的配置,在公司可以工作,在家就不行。

这样一来,问题就出在了我在家的这台机器的Ubuntu环境上。随后我发现了一个有趣的现象:一些使用IP访问的国外网站竟然是正常访问的。出现”server timeout”问题的都是使用域名访问的网站。那么这个问题最有可能的根源在于DNS解析。

为了证实我的想法,我使用traceroute来查看访问facebook.com和twitter.com的时候到底是route到哪里导致的timeout,随后发现了一个惊人的结果:当trace twitter.com的时候,dns给出的目标IP经过查询竟然是一个Internet保留IP地址。这说明问题的根源确实是因为DNS解析给出的目标IP是错误的,所以当然访问不到目标网站。而直接使用IP访问目标网站就没有问题。

再使用以下命令查看我本机的dns设置:

1
2
3
~$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 10.0.0.1

“10.0.0.1”是我的路由器,也就是说我本地没有任何特定的dns配置,那么当前的dns的配置就是直接从网络运营商联通处获得的。有趣的是,此前一直没有问题的dns解析,从二月初开始被污染了,运营商想干啥?

为了解决这个问题,我直接修改”/etc/resolv.conf”文件,使用google著名的dns服务器”8.8.8.8”,再试,问题解决。

不过,这样修改”/etc/resolve.conf”文件的话,重启系统之后该文件会被重新覆盖。这是因为NetworkManager进程会在每次系统重启后根据网络配置重写这个文件。所以最根本的解决办法是修改你的路由器配置:在路由器的配置里面指定DNS server(比如使用8.8.8.8和8.8.4.4),而不要使用默认从网络运营商获得DNS的选项。具体如何操作视所使用的路由器不同而不同。在我的NetGear路由器中,登录http://10.0.0.1(路由器自带的web配置UI)很容易就能找到该选项。

最后的疑问是:为什么同一台机器,在Windows下没事而在Ubuntu上就有问题?想来只可能是Windows系统上,配置了其它的DNS server。我平时不用Windows,现在也懒得登上去查看了。

Comments