翻墙路由器的原理与实现(14)_掘图志

返回首页
当前位置: 主页 > 路由器设置 >

翻墙路由器的原理与实现(14)

时间:2016-02-01 13:38点击:

自此DNS穿墙的讨论基本上就完成了。DNS劫持是所有GFW封锁手段中最薄弱的一环,有很多种方法都可以穿过。如果不想写代码,用V2EX DNS的非标准端口是最容易的部署方式。如果愿意部署代码,用nfqueue丢弃错误答案是最可靠通用的方式,不依赖于特定的服务器。fqdns集成了所有的克服DNS劫持的手段,其为fqrouter的组成部分之一: https://github.com/fqrouter/fqdns

封IP观测

观测twitter.com

首先使用dig获得twitter.com的ip地址:

root@OpenWrt:~# dig +tcp @8.8.8.8 twitter.com ; <<>> DiG 9.9.1-P3 <<>> +tcp @8.8.8.8 twitter.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8015 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;twitter.com. IN A ;; ANSWER SECTION: twitter.com. 7 IN A 199.59.149.230 twitter.com. 7 IN A 199.59.150.39 twitter.com. 7 IN A 199.59.150.7

根据前面的内容我们知道使用dns over tcp,大部分的域名解析都不会被干扰的。这里得到了三个ip地址。先来测试199.59.149.230

root@OpenWrt:~# traceroute 199.59.149.230 -n traceroute to 199.59.149.230 (199.59.149.230), 30 hops max, 38 byte packets 1 123.114.32.1 19.862 ms 4.267 ms 101.431 ms 2 61.148.163.73 920.148 ms 5.108 ms 3.868 ms 3 124.65.56.129 7.596 ms 7.742 ms 7.735 ms 4 123.126.0.133 5.310 ms 7.745 ms 7.573 ms 5 * * * 6 * * *

这个结果是最常见的。在骨干路由器上,针对这个ip丢包了。这种封锁方式就是最传统的封IP方式,BGP路由扩散,现象就是针对上行流量的丢包。再来看199.59.150.39

root@OpenWrt:~# traceroute 199.59.150.39 -n traceroute to 199.59.150.39 (199.59.150.39), 30 hops max, 38 byte packets 1 123.114.32.1 14.046 ms 20.322 ms 19.918 ms 2 61.148.163.229 7.461 ms 7.182 ms 7.540 ms 3 124.65.56.157 4.491 ms 3.342 ms 7.260 ms 4 123.126.0.93 6.715 ms 7.309 ms 7.438 ms 5 219.158.4.126 5.326 ms 3.217 ms 3.596 ms 6 219.158.98.10 3.508 ms 3.606 ms 4.198 ms 7 219.158.33.254 140.965 ms 133.414 ms 136.979 ms 8 129.250.4.107 132.847 ms 137.153 ms 134.207 ms 9 61.213.145.166 253.193 ms 253.873 ms 258.719 ms 10 199.16.159.15 257.592 ms 258.963 ms 256.034 ms 11 199.16.159.55 267.503 ms 268.595 ms 267.590 ms 12 199.59.150.39 266.584 ms 259.277 ms 263.364 ms

在我撰写的时候,这个ip还没有被封。但是根据经验,twitter.com享受了最高层次的GFW关怀,新的ip基本上最慢也是隔日被封的。不过通过这个traceroute可以看到219.158.4.126其实就是那个之前捣乱的服务器,包是在它手里被丢掉的(严格来说并不一定是219.158.4.126,因为ip包经过的路由对于不同的目标ip设置不同的端口都可能会不一样)。再来看199.59.150.7

root@OpenWrt:~# traceroute 199.59.150.7 -n traceroute to 199.59.150.7 (199.59.150.7), 30 hops max, 38 byte packets 1 123.114.32.1 11.379 ms 10.420 ms 23.008 ms 2 61.148.163.229 6.102 ms 6.777 ms 7.373 ms 3 61.148.153.61 5.638 ms 3.148 ms 3.235 ms 4 123.126.0.9 3.473 ms 3.306 ms 3.216 ms 5 219.158.4.198 2.839 ms !H * 6.136 ms !H

这次同样是封IP,但是现象不同。通过抓包可以观察到是什么问题:

root@OpenWrt:~# tcpdump -i pppoe-wan host 199.59.150.7 or icmp -vvv 07:46:11.355913 IP (tos 0x0, ttl 251, id 0, offset 0, flags [none], proto ICMP (1), length 56) 219.158.4.198 > 123.114.40.44: ICMP host r-199-59-150-7.twttr.com unreachable, length 36 IP (tos 0x0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 38) 123.114.40.44.45021 > r-199-59-150-7.twttr.com.33449: UDP, length 10

原来219.158.4.198发回来了一个ICMP包,内容是地址不可到达(unreachable)。于是traceroute就在那里断掉了。

root@OpenWrt:~# iptables -I INPUT -p icmp --icmp-type 3 -j DROP

如果把unreachable类型的ICMP包丢弃掉,会发现ip包仍然过不去

root@OpenWrt:~# traceroute 199.59.150.7 -n traceroute to 199.59.150.7 (199.59.150.7), 30 hops max, 38 byte packets 1 123.114.32.1 4.866 ms 3.165 ms 3.212 ms 2 61.148.163.229 3.107 ms 3.104 ms 3.270 ms 3 61.148.153.61 6.001 ms 7.246 ms 7.398 ms 4 123.126.0.9 7.840 ms 7.223 ms 7.443 ms 5 * * *

这次就和被丢包了是一样的观测现象了。

root@OpenWrt:~# iptables -L -v -n | grep icmp 3 168 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 3

同时,可以看到我们仍然是收到了icmp地址不可到达的包的,只是被我们drop掉了。

观测被封ip的反向流量

之前的观测中,被封的ip是ip包的dst。如果我们从国外往国内发包,其src是被封的ip,那么ip包是否会被GFW过滤掉呢?登录到一台国外的vps上执行下面的python代码

from scapy.all import *  

send(IP(src="199.59.150.7"dst="123.114.40.44")/ICMP()) 

然后在国内的路由器(123.114.40.44)上执行抓包程序

root@OpenWrt:~# tcpdump -i pppoe-wan host 199.59.150.7 or icmp -vvv tcpdump: listening on pppoe-wan, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes 10:41:14.294671 IP (tos 0x0, ttl 50, id 1, offset 0, flags [none], proto ICMP (1), length 28) r-199-59-150-7.twttr.com > 123.114.40.44: ICMP echo request, id 0, seq 0, length 8 10:41:14.294779 IP (tos 0x0, ttl 64, id 25013, offset 0, flags [none], proto ICMP (1), length 28) 123.114.40.44 > r-199-59-150-7.twttr.com: ICMP echo reply, id 0, seq 0, length 8
------分隔线----------------------------
推荐内容