如何本地避免GFW的DNS污染

2012/08/11

最近看了 IGFW 上的如何不受DNS污染,讲的是做VPN服务器的VPS 配置方法。我来说下目前我知道的各平台上,本地避免DNS 污染的方法。
DNS污染的原理部分,参考这篇 深入理解GFW:DNS污染。本地避免污染,有两个思路:
  1. 通过加密方式,查询可信的DNS服务器
  2. 设置国外DNS服务器,并丢弃GFW DNS伪包
第一种思路下,目前比较靠谱的是 DNSCrypt,支持Windows (下载)和 Mac(下载)。DNSCrypt 使用很方便,把 Enable OpenDNS、Enable DNSCrypt 全勾上就好,也建议勾上 Fallback to insecure DNS。
第二种方式,Windows上不好弄。Mac 和 Linux 都有办法实现。前提是设置国外DNS,继续推荐台湾中华电信的168.95.1.1 。然后:
  • Mac:安装 kernet 内核扩展(下载),我自己做的,开机自启动,风险自负。
  • Linux:西厢计划项目做了这一部分,不过编译内核模块毕竟麻烦。2.6.33.7 以上版本的内核(不保证这是最低版本),依赖 iptables 1.4.10,都会自带u32 模块,可以用iptables 规则做丢弃GFW DNS伪包:
    iptables -I INPUT -p udp -m udp –sport 53 -m u32 –u32 “0&0x0F000000=0×05000000 && 22&0xFFFF@16=0x5d2e0859,0xcb620741,0x0807c62d,0x4e10310f,0x2e52ae44,0xf3b9bb27,0xf3b9bb1e,0x9f6a794b,0x253d369e,0x9f1803ad” -j DROP iptables -I INPUT -p udp -m udp –sport 53 -m u32 –u32 “0&0x0F000000=0×05000000 && 22&0xFFFF@16=0x3b1803ad” -j DROP
    设置联网自动加载iptables 配置:Ubuntu下,可以把以上规则写入 /etc/network/if-pre-up.d/iptablesload 文件。其它Linux发行版应该也有类似的方法。强烈建议淘宝上卖自制路由器的同学们,把这个防火墙规则写到路由器中,也能多一个卖点。
另外,继续推荐IGFW博客。顺便推广下自己做的 IGFW墙内镜像,有点慢,日独立IP过1000我就做服务器缓存(目前已经到500)。

Related Posts