昨晚发现Dropbox被封锁,网上一直没有解决办法出现,所以今天自己学习动手解决。如果你没兴趣看我是如何解决的,请直接移步Dropbox Host将内容添加到你的hosts文件当中就可以了。
下面讲一下,我解决问题的整个过程:
屏蔽原理
GFW对网络的屏蔽98%以上靠的都是Dns污染,Dropbox这次遭殃也不例外。首先,我们用 nslookup
来查看查看一下dropbox的官方网站。
我们分别输入如下两个命令:
结果如下图所示:
第一行命令的结果是 59.24.3.173 , 第二行命令的结果是 108.160.166.142, 两个命令的区别在于 -vc,
Always use a virtual circuit when sending requests to the server.
这个参数的意思是用虚拟的路径去查询, 所以结果是正确的。 108.160.166.142 才是我们所要找的ip, 59.24.3.173 这个ip又是什么呢? 这是GFW重新导向的一个虚假的ip地址,维基百科上有这些ip地址的收录: 域名服务器缓存污染
解决思路
如果说用的是DNS污染,那么我们只要修改host文件,将所有Dropbox需要用到的域名导向正确的IP地址即可。抓包分析Dropbox需要用到的Url路径 -> 查找这些Url路径的真实IP地址 -> 更新Host文件 。
实战
1.抓包
这里我推荐一款抓包软件Charles,功能强大,操作简单,跨平台,唯一的缺点就是收费,而且很贵。
Dropbox都是通过443端口进行文件传输,抓包内容如下图所示:
这是我修改了Host之后截图的结果,所以基本上数据包都请求成功了。(PS:如果没有修改,基本上所有数据包应该都是红色的叉叉)
接下来我们找出需要的url:
d.dropbox.com
起初,我以为这些url都是固定的,所以将每一个都查询ip并添加到host,结果发现没用,后来才发现 dl-client399 后面这个三位数是随机变动的,同理与client22,dl-debug,notify7这几个, 其余url为固定。
那样的话少说,也有1000多个url需要查,手动肯定是不行的,只能通过脚本批量查询。
2.批量查询url真实ip地址
shell脚本不怎么熟,这种小事情用Python来解决最方便了,分分钟搞定。下面只贴一段代码去遍历dl-client399.dropbox.com
类型的url,其他几个url也是同理。
import subprocess
for num in range(1, 1000):
url = "dl-client" + str(num) + ".dropbox.com"
cmd = "nslookup -vc " + url + " 8.8.8.8"
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) #用Python来调用系统命令
ip = p.stdout.readlines()[-2].replace("Address: ", "").replace("\n", "") #过滤出ip
print ip + " " + url #打印结果为 204.236.220.23 dl-client7.dropbox.com
3.将所有脚本查询完的结果复制粘贴到hosts文件中
效果如下:
加进去了,还是不能上传下载呢
很赞,现在能正常使用dropbox了。
host似乎还是有问题, 整个流程非常有意思.
我这里只能上传不能下载,不知道怎么回事
统一回复一下: 每个人的网络环境可能不同,所有某些链接的host没有加进去,可能要自己抓包看一下。
@excellentbright 模板中建议不要使用Google Fonts,会影响页面前端的渲染速度(鉴于现在的情形)…… :)
试试https://github.com/holmium/dnsforwarder
多谢楼上二位 @hepo @Wind4
既然Dropbox无法同步的问题在于DNS污染,那么解决DNS污染问题,自然就解决了Dropbox无法同步及类似的问题(比如说HTTPS访问Facebook,YouTube之类的)。hosts虽然能解决DNS污染问题,但是它更偏重于域名的定向解析。所以,还是推荐让专业的来——dnsforwarder。
这是什么终端软件啊?看起来好清新
@xiangsheng iTerm2 + zsh
既然在调用nslookup时添加“-vc”参数可以查到正确的IP地址,那么在全局直接使用这种方式查找IP地址不就可以解决DNS污染的问题了么?
正在用,和不错啊