G2EX

如何获取Dropbox的可用HOSTS IP

一、命令介绍

命令:nslookup -vc www.dropbox.com 8.8.8.8

解释:nslookup(name server lookup)域名查询,用于查询DNS的记录。这里指定使用Google的8.8.8.8DNS服务器查询www.dropbox.com的IP地址。参数vc代表Always use a virtual circuit when sending requests to the server.,意思是向DNS发送的查询请求始终使用虚电路模式,也就是使用TCP协议查询域名的IP地址。

为什么要是使用vc参数?

nslookup命令默认使用UDP协议查询,因为UDP协议的数据包是无序到达的,被GFW(Great Firewall of China,防火长城)构造的无效IP地址会先到达我们的电脑,我们会被DNS缓存污染导致无法访问该域名。使用TCP协议可以保证在指定的DNS可用情况下得到正确的IP地址。

下图中没有使用vc参数得到的两条IP地址是被GFW污染的虚假IP,无法ping通。

nslookup命令图示

在浏览器里输入使用vc参数得到的108.160.166.13,则会跳转到Dropbox的主页。

要想正常是用Dropbox网页和客户端,不仅要知道正确的www.dropbox.comIP地址,还需要知道以下域名对应的IP地址。

1
2
3
4
5
6
7
8
9
dropbox.com
forums.dropbox.com
dl.dropboxusercontent.com
d.dropbox.com
client-lb.dropbox.com
dl-client(1,2...999).dropbox.com
dl-debug(1,2...40).dropbox.com
client(1,2...99).dropbox.com
notify(1,2...10).drobox.com

手动获取这些域名的IP地址太费时,那就需要用到下面的脚本了。感谢 Yannis Xu 的基本脚本 和 doc001 对脚本的完善。

二、获取Dropbox hosts ip的Python脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/python
# -*- coding: utf-8 -*-

def GetLists(subdomain,start,end):
ret = []
for i in xrange(int(start),int(end)+1):
ret.append(subdomain+str(i)+'.dropbox.com')
return ret

def GetDlClientLists():
return GetLists('dl-client',1,999)

def GetDlDebugLists():
return GetLists('dl-debug',1,40)

def GetClientLists():
return GetLists('client',1,99)

def GetNotifyLists():
return GetLists('notify',1,10)

hosts = []
hosts.extend([
'dropbox.com',
'www.dropbox.com',
'forums.dropbox.com',
'dl.dropboxusercontent.com',
'd.dropbox.com',
'client-lb.dropbox.com'
])
hosts.extend(GetDlClientLists())
hosts.extend(GetDlDebugLists())
hosts.extend(GetClientLists())
hosts.extend(GetNotifyLists())

import subprocess
for h in hosts:
cmd = 'nslookup -vc ' + h + ' 8.8.8.8'
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

valid = False
for line in p.stdout.readlines():
if line.startswith('Non-authoritative answer:'):
valid = True
elif valid and line.startswith('Address:'):
ip = line.replace('Address: ','').replace('\n','')
print ip + ' ' + h

把脚本保存为GetDropboxIP.py,在命令行窗口或终端中执行:

1
python GetDropboxIP.py > hosts_dropbox.txt

最后把hosts_dropbox.txt中的记录放到系统hosts文件中。终于可以正常使用Dropbox了。

三、另一个问题

毕竟我们在大陆,Google的8.8.8.8DNS服务器在国外,GFW位于两者中间,使用nslookup -vc HOSTNAME 8.8.8.8命令经常会出现丢包现象,更不要说连续查询上千条记录。所以,我们可以使用国外的计算机查询Dropbox的IP地址

拥有国外VPS的同学就非常方便了。没有国外VPS的同学呢?让你的国外小伙伴来跑脚本把结果给你?还是自己动手吧。

Cloud 9KodingCodeboxCodenvyNitrous.IO 等网站都是国外优秀的虚拟主机编程IDE,可以在这些免费主机中运行上面的脚本,这里以Cloud 9为例。

  1. 首先需要注册一个免费账号,然后,在DASHBOARD里通过点击CREATE NEW WORKSPACE来创建新的工程,这里直接使用它默认创建的示例工程,选择demo-project,然后点击START EDITING创建工程并编辑

  2. 在Python目录下新建GetDropboxIP.py文件,并把脚本内容粘贴到文件中。
    新建文件

  3. 在IDE下方的bash里执行:python GetDropboxIP.py > hosts_dropbox.txt
    执行脚本

  4. 等待几十秒,脚本执行完成后,在IDE左侧文件列表中右键点击生成的hosts_dropbox.txt,选择Download下载到本地。
    下载hosts

  5. Enjoy.

四、参考内容

  1. http://yannisxu.me/post/reconnect-dropbox
  2. http://www.doc001.com/post/2014-06-22