GFW的设备挂载在骨干网的某些路由器上。GFW对不同敏感内容会有不同反应,比如最简单的dns查询twitter.com,GFW会发回错误的域名解析结果。这样的反应有很多种,针对的协议有DNS,HTTP,SMTP等。而且有的反应就是没有反应,比如封IP或者封端口,其反应就是给你丢包。
GFW的第二个特点是half-stream。也就是说,GFW只在乎你单向的数据包。这意味着你可以不需要服务器端的配合,自说自话,自言自语。但是说者无心,听者(GFW)有意。这意味着,你可以朝任意一个IP地址发包,只要内容“合适”而且GFW听到了,就可以触发GFW的响应。
类似的工具之前也有人写过,比如 mongol(https://github.com/mothran/mongol/)。墙的改进之处有四点
- 不只是HTTP关键字,包含了所有可以找到的GFW反应
- 单向射击,不需要服务器配合。速度快,而且可以射击面大大拓宽,意味着可以找到的GFW设备更多。
- 可以配置的基于策略的射击目标选择(比如从国外向国内射击,可以选择联通,电信,移动等不同运营商的IP)
- 探测了路由自身的属性(IP包路径是否随着src或者端口变化)
这些特点加在一起意味着什么呢,它意味着有一台公网上的机器,无论是国内还是国外的,跑一个晚上基本上全国的挂了GFW的路由器都能够找到。而且还能告诉你哪个IP是既做了DNS劫持又做了HTTP关键字检测,哪些IP还做了TCP丢包等。有了IP地址,AS/运营商归属,是否部署了所有规则等原始信息之后,也许可以从大的格局上归纳出一些部署的模式。这是目前该工具可以做的。
引申一下还可以用来探测GFW审查的内容本身。比如qiang包含的高效的HTTP关键字检测的探测器可以用来探测哪些关键字被审查了。长期定时执行还可以观测封与解封的时间。
使用需要python,scapy以及一台公网上的机器
https://github.com/fqrouter/qiang
其中有两个脚本可以独立使用:
http://fqrouter.tumblr.com/post/46745599157/qiang-dns-wrong-answer-probe-py
http://fqrouter.tumblr.com/post/46758595474/qiang-tcp-rst-probe-py