小米路由器mini解决dns污染问题(仅思路)

既然找到这篇文章,一般都是对dns有一些了解了,就不讲dns是干嘛的了
首先我们来了解下dns污染问题手工解决怎么解决。

1、下载bind9源码,编译,得到dig.exe(linux下很好用的工具),cmd中直接运行,结果如图

dig

PS:先讲讲dig是干嘛的:dig是一款域名解析工具,和windows自带的nslookup差不多,不过dig更方便,更好用
2、输入命令 dig www.baidu.com,结果如图,可以看到这里解析到了百度的IP地址,如果输入dig www.facebook.com,就会看到一个错误的IP(我这里已经解决了污染问题,获取不到错误IP,就不截图了)
baidu

这里有一条重要资料:dns污染只污染53端口使用udp通讯的dns协议

OK,53端口,一个入手的地方,udp,又一个入手的地方。

第二条重要资料:opendns支持非53端口(443和5353),udp或tcp通讯的dns协议查询服务

使用dig @208.67.222.222 -p5353 www.facebook.com(PS:@后是指定从哪里查,-p是指定从哪个端口查),验证发现获取到facebook的正确地址,如图
facebook

现在思路来了,小米路由器mini自带dnsmasq,我们把上游dns服务器指定为opendns的5353端口就可以了。
修改后,测试发现国内很多网站打开速度变慢了,原因如下:
国内很多大型网站采用了CDN技术,修改dns后,被判断为了国外用户,解析到了国外访问速度较快的IP上。
这个问题如何解决呢,其实很简单的,被污染的网站有一个列表,我们把这个列表提取出来,指定这个列表中的网址使用opendns解析,而默认的上游dns还是采用国内的,这样就解决了变慢的问题。
如何提取?我这里给出一份python的脚本:

import sys,re,base64,cStringIO,urllib2

def splitList(txt):
    arr = txt.split("\n")
    pattern ='^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$'
    l = []
    for line in arr:
        if (not len(line)): #empty line
            continue
        if (line[0] == "!"): #Comment line
            continue
        elif(line[0:2] =="@@"):#Forbidding line
            continue
        elif(line.find("/")!=-1 or line.find("*")!=-1 or line.find("[")!=-1 or line.find("%")!=-1 or line.find(".")==-1 ): #URL is ignored, only domains left
            continue
        elif(re.search(pattern, line)):#IP address
            continue
 
        #In this case, domain name is irrelevant to protocol(http or https)
        elif(line[0:2] =="||"):
            l.append(line[2:])
        elif(line[0] == "."):
            l.append(line[1:])
        else:
            l.append(line)

    return l

#Decode and decorate the input string
url = urllib2.urlopen('https://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt',timeout=10)
f = cStringIO.StringIO(url.read())
txt = f.read()
txt = base64.decodestring(txt)
domains = splitList(txt)
fp = open('./dnsmasq.custom.conf','a')
per_line=""
fp.write("#gfwlist\n")
for line in domains:
    if (line!=per_line):
        fp.write("server=/" + line + "/208.67.220.220#5353\n")
        print "server=/" + line + "/208.67.220.220#5353\n"
    per_line=line
fp.close()

脚本是在别人的基础上修改的,需要python 2,翻墙环境下才能成功。
运行后会生成dnsmasq.custom.conf这个文件,将这个文件放到路由器的/etc/dnsmasq.d路径中,重启dnsmasq服务或者直接重启路由器,然后dig www.facebook.com,成功

标签: none

评论已关闭