DNS 配置

GFW真是太不要脸了,现在给google来了个中间人攻击,把他的证书替换了,真是吊的飞起。现在就算用dnscrypt也没有用了。因为GFW没有阻止ip,直接就是攻击。CTMD。不过我偶然发现只要DNS不是解析到中国的就不会遭受中间人攻击。因为CDN的关系,DNS可以根据客户端ip来解析对应的服务器ip。我如果解析到美国的google ip就不会被中间人攻击。当然,全局的转发也是可以的,比如socks,但速度还是有区别的。

注意:这里说的都是在教育网,没有在其他网络尝试。

unbound + dnscrypt + opendns

opendns的ip是208.67.222.222,208.67.220.220 {443, 53, 5353},支持加密传输。这在之前dnscryptunbound已经讨论过。但这种方法已经不适合。因为他会解析到google对应东南亚的ip。

ssh tunnel + nc

这个是比较蛋疼,也比较复杂。我也没有试过,总体来说,先建立ssh本地转发tunnel,然后用nc将udp转为tcp,经ssh tunnel转发。那么解析的ip就不一样了。具体看链接

ssh tunnel + unbound

我认为这是最合适的方法。先要启用unbound tcp-upstream,并设置forward-zone。我的unbound.conf文件见文末。然后启用ssh tunnel:  ssh -L 9053:8.8.8.8:53 server-ip  。最后是修改resolv.conf文件。只要改为 nameserver 127.0.0.1 ,一切ok,测试结果见文末。

ssh reverse tunnel + unbound

这个也行,原理跟上面类似,但这里用的是ssh reverse tunnel。比如  ssh -R 9053:8.8.8.8:53 user@china-host 。这个命令要在国外主机运行,他的意思是连接到china-host,并将通过china-host:9053的流量,经过国外主机(本主机)转发到8.8.8.8:53。有点小复杂。原理是一样的,也是能跑起来的。

测试结果

链接

  1. unbound conf
  2. udp to tcp
  3. ssh port forwarding

 

本地dns代理(unbound)

DNS即Domain Name System,主要是管理和解析域名。像www.google.com这样的字符串路由器是不认的,路由器认ip地址,192.168.1.1这样的。为何路由器不直接根据字符串来路由呢?因为字符串没有层次化这个概念,ip有,比如美国的主要ip段,路由器就不必知道每个具体ip,只要根据前几位即可路由。而字符串则没有这样的层次化。所以需要DNS,这是非常重要的协议。 前面也说了,dns是非常不安全的,所以我用dnscrypt使dns能够安全一些。

前面的博文已经介绍了如何在本机上搭建dns代理,并使用dnscrypt。那我的手机平板和其他电脑也想使用这个dns代理怎么办?

dns

其实很方便,只要修改unbound的设置即可。具体设置如下。为何forward-zone端口是40,见前面的博文。其实为了增加稳定性,可以再加一个forward-addr: 8.8.8.8 。本地的dnscrypt-proxy跪了也问题不大。access-control: 59.78.11.0/24 allow,其中的ip是一个子网,代表59.78.11.0-59.78.11.255能ip都能使用。请根据自己的情况修改该选项。

 

这样设置之后,重启服务,然后手机或者平板要设置dns服务器,长按相应的无线,modify network->show advanced options->填入dns 1 为dns代理服务器的ip。

天朝现在(2014.3)这么做之后就可以上facebook了,或者这样说能通过改hosts来上的网站现在都能上了。

dnscrypt 安全的dns

可以说DNS是整个Internet中,最薄弱的部分(虽然其他某些部分也不安全)。因为这个dns是UDP的,可以随便被修改,这样就会让你上冒牌网站了。想想就吓尿了。这也被我们伟大的墙利用了,当然这只是小手段。最近(2014.2.14)左右,youtube可以“直接”上了。瞬间让我看到了希望。习大大果然不同凡响。

为什么说是“直接”上呢?因为墙降低了手段,只用了DNS污染,只要DNS正确就能上youtube。这就方便多了,网速也很快。虽然我不怎么上youtube,但这是一种自由的象征。

不仅如此,如果你遭受了ARP攻击,而采用下面的DNS查询方式可以免于被DNS污染。可见安全的DNS是非常重要的,当然也是非常有意思的。

DNSCrypt 是由来已久的,目前有很多“free, DNSCrypt-enabled resolvers”,像opendns(我就用过这个,感觉很可以,所以就一直用着了。我就担心这些dns被墙掉)。而只有服务器也不行啊,需要工具与服务器交流。我使用的是dnscrypt-proxy。公开源码,可以自己编译。arch直接安装就好了。

完成以上这几个步骤,可以打开测试地址,默认的dns解析服务器是opendns的,配置文件是/etc/conf.d/dnscrypt-proxy,可以进行修改,具体man dnscrypt-proxy。

如果测试成功,就可以进行下一步,不行的话也试试下一步再重启。

光有DNSCrypt还不是完美的,因为他没有cache,每次有query他都会重新访问OpenDNS。这样效率就低了,可以看看有cache和没有cache的区别。

没有cache:

cpu8

有cache:

cpu9

我是用unbound解决这个问题的,当然还有代替工具powerdns这样的,但是用不来。

修改/usr/lib/systemd/system/dnscrypt-proxy.service, port 40。或者修改/etc/conf.d/dnscrypt-proxy,里面的DNSCRYPT_LOCALPORT=40。

准备完毕,可以开机启动服务。

最好重启一下。

最后有个问题,就是这里的53端口被监听了,我就不能建ap了,这个还不知道原理,以后再思考一下怎么解决。

链接: