这个脚本基于 Internet Censorship in China: Where Does the Filtering Occur? 这篇论文,mongol.py基本就是该论文4.3节Algorithm的实现。除了防火墙设备ip查找算法,论文还阐述了以下内容:
- 从现有实验结果看,有状态的连接(即已完成三次握手的连接)+ 敏感词 才会触发审查
- 对访问外国的流量审查严格,国内主要还是靠social control(如人工审查)
- 国内两大ISP,电信的审查设备主要设置在省区城域网,网通的主要设置在骨干网,因在省区也有审查设备,GFC其实也具备国内流量审查的能力
- 审查起作用后,链路被阻塞的状态会维持一段时间,这段时间内,即使后续的报文不包含敏感词,也会被阻塞
mongol.py接受一个ip参数,其完成以下工作:
首先新建socket与指定ip 80端口进行连接,发送一条GET消息:
GET / HTTP/1.1 \r\n
Host: ip \r\n
\r\n
在connect调用返回前,三次握手已经完成。之后拿到response,判断响应状态码,如果是200 OK 或 302 Redirect 或 401 Unauthorized,则表明可与目的ip 80端口建立有效连接。
然后对于有效连接,利用scapy进行ackattack(相当于traceroute),并记录本机到目的ip的中间router设备ip,注意所记录的router中可能有一个就是GFC设备,此时由于还没有发送敏感词,并未触发审查
再之后重新新建一个socket进行目的ip连接,此时发送一条包含敏感词的GET消息:
GET /tibetalk \r\n
Host: ip \r\n
\r\n
如果发送后出现socket error,则说明GFC设备在该链路上向本机发送了RST报文(也会向目的ip发送),审查机制被触发
最后再次进行ackattack,因为本机收到RST后,本机到目的ip的链路还会阻塞一段时间,这时即使是不包含敏感词的一个ack报文都会被阻塞,trace到的最后一个ip地址就是GFC设备的ip地址
貌似直接traceroute实现不是基于tcp三次握手的,否则直接traceroute Facebook就可以找到防火墙服务器ip;另对于是否stateful的连接才会触发审查,还可以用netcat工具进行验证。
以上提到的论文作者为查找全中国范围内的GFC设备,提到的一个方法也很有趣,利用中国政府网-部门地方链接以及各种导航网站获取到全国各个地方的网站,以此作为检测工具的目的ip地址参数。
Have fun!