上一篇文章《在 EdgeRouter Lite 上实现科学上网》是用的比较传统的方式,即简单地添加目的路由。对于比较大规模的 ICP 例如 Google, Facebook,挖出他们的网段然后添加到路由表里是可行的(主要是他们有较好的网络基础设施建设,都申请了自己的 IP 地址段,并且用 BGP 互联广播到全网)。不过对于绝大多数被封的站点,想要一个一个地追踪他们的 IP 地址是多少并保持更新,这无疑是非常吃力的。好在昨天翻 Dnsmasq 的 Manpage 读到了 ipset 的功能选项,放狗一搜发现早有人提到这项功能了,不过都是在 Openwrt 上实现的。这回我决定在 EdgeRouter Lite 上也实现一次。
目前 ER-Lite 上最新的固件是 1.5.0 版本,基于 Debian Squeeze 6.0.9 ,很遗憾其中的 Dnsmasq 版本是 2.62,根据 Change Log,需要到 2.66 版本才能有 ipset 支持,这样只好自己编译了。好在编译起来不麻烦,把几个需要的 feature 在 src/config.h 里加上,然后在 Makefile 里把 CC CFLAGS LDFLAGS PKG_CONFIG_PATH 等几个变量设好,就可以直接编译了。(当然有些 feature 需要额外的依赖,需要事先编译好)我这里编译的 dnsmasq 2.71 版本,feature 尽量和原系统预装的 2.62 保持一致。
ubnt@ERL:~$ /usr/sbin/dnsmasq --version Dnsmasq version 2.71 Copyright (c) 2000-2014 Simon Kelley Compile time options: IPv6 GNU-getopt no-RTC DBus no-i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth no-DNSSEC This software comes with ABSOLUTELY NO WARRANTY. Dnsmasq is free software, and you are welcome to redistribute it under the terms of the GNU General Public License, version 2 or 3.
直接替换原系统里的 2.62 版本,就可以无缝工作了。以 Google 为例,在配置中添加如下选项:
ubnt@ERL:~$ configure [edit] ubnt@ERL# set service dns forwarding options server=/google.com/8.8.8.8 [edit] ubnt@ERL# set service dns forwarding options ipset=/google.com/CROSS_WALL
第一行是指定 google.com 下所有的域名都交给 8.8.8.8 这个 DNS Server 来解析,第二行是指定所有 google.com 域名下解析出来的 IP 都扔到名为 CROSS_WALL 的这个 ipset 里(当然 ipset 需要事先创建好)
到 8.8.8.8/32 的路由可以通过之前建立的 OpenVPN tunnel 出去,直接添加到路由表。这样防止解析出来的域名受到污染。随后在 firewall rule 里让所有 destination addr 符合 CROSS_WALL 这个 ipset 的包都走特定的 tunnel 出去,这样就实现了智能路由,科学上网了。trace route 如下:
C:\Users\Xiaoding>tracert -d www.google.com Tracing route to www.google.com [173.194.127.210] over a maximum of 30 hops: 1 6 ms 1 ms 5 ms 192.168.111.1 2 281 ms 285 ms 286 ms 10.8.0.1 3 276 ms 282 ms 271 ms 96.44.154.33 4 267 ms 271 ms 275 ms 72.11.150.105 5 283 ms 279 ms 277 ms 96.44.180.97 6 280 ms 280 ms 277 ms 206.72.210.41 7 290 ms 283 ms 284 ms 64.233.174.41 8 291 ms 308 ms 290 ms 64.233.174.190 9 400 ms 408 ms 393 ms 64.233.174.177 10 403 ms 402 ms 422 ms 209.85.243.249 11 437 ms 406 ms 410 ms 66.249.94.30 12 407 ms 411 ms 413 ms 209.85.240.133 13 426 ms 442 ms 442 ms 173.194.127.210 Trace complete.