标签归档:DNS

Mikrotik动态更新从PPPOE获得的dns服务器

手里的那只RB750Gr3之前给几个出租屋的房间配置dhcp的时候,都是将客户端的dns指向RB750Gr3自己作为网关的ip地址,这样,RouterOS会作为一个DNS代理,查询和缓存DNS请求。这样设置其实没啥问题,只是这几天又突发奇想,想着要不直接分发运营商的DNS服务器地址给用户,如此一来,可以稍微的降低一下路由器的负载(其实没多少)。

Mikrotik的脚本功能其实比较强大,但是相关的文档就惨不忍睹,好在论坛上有好心人回答问题,给我提供了一些思路。以下是我写的脚本。

:local dynamic (([/ip dns print as-value]) -> "dynamic-servers" );
:local dns

:set dynamic [:tostr $dynamic]

:for i from=0 to=([:len $dynamic] - 1) do={ 
 :local char [:pick $dynamic $i]
 :if ($char = ";") do={
  :set $char ","
 }
 :set dns ($dns . $char)
}

/ip dhcp-server network set [ find comment=UserNet ] dns-server=$dns

简单的解释以下脚本内容:

  • 1.从/ip dns里面读取“dynamic-servers”的内容,这些ip地址是pppoe拨号之后,从pppoe服务器上获取到的。
  • 2.要将dynamic的内容填充到dhcp-server里面,但是因为读取到的内容是一个array,用”;”分隔,没法直接套用,所以,需要转换成string类型。
  • 3.然后将”;”替换成”,”,然后就可以在修改配置的命令行里面调用了。
  • 因为配置里面,包含了多个dhcp-server,而我不需要修改全部的network的配置,所以,我给需要修改配置的network,写了一个备注,内容是“UserNet”。这样脚本就会只修改备注内容是“UserNet”的network配置了。

脚本做好之后,就是调用了,可以选择定时执行脚本或者是在pppoe会话起来的时候执行,我选择的是在pppoe会话起来的时候执行。找到pppoe调用的ppp profile,在scripts里面调用就行了。

用smartdns来防治DNS污染

一直以来,我对dns查询受到污染的情况一直都比较苦恼。国内的DNS服务器基本上都是受污染的,而通过VPN直接去从国外的DNS服务器查询,则会获得为国外优化的结果,时常莫名奇妙就访问国外的网站,特别是一些有中国版和国际版区别的站点,诸如京东淘宝之流。

今天和在和朋友讨论dns查询的问题的使用,对方提到用tcp来进行dns查询,这就让我感到一些神奇。在拿8.8.8.8来进行过测试之后,我有了一个重大的发现。

使用tcp向8.8.8.8进行dns查询

8.8.8.8的tcp/53端口是开放的!而且有个很重要的特征!对于受屏蔽的域名,dns查询的会话会收到tcp rst导致中断,而未受屏蔽的域名,则可以正常查询。

那好说!只要找到一个DNS转发器,能支持用TCP来进行上行查询的软件就行了(当然,还有一个能用的梯子)。

最开始,我是打算用dnsmasq的按顺序查询,不过dnsmasq似乎不支持tcp查询,不得不放弃。然后又想起另外一个东西叫做smartdns的,能够使用tcp进行dns查询。那就好办。

思路是这样,现调整好vpn的路由。8.8.8.8不走vpn,8.8.4.4走vpn,然后smartdns配置server-tcp 8.8.8.8和server-tcp 8.8.4.4。这种情况下可以同时获得国内优化版和国际优化查询结果,这两者都是未经污染的,无需额外过滤。再由smartdns进行探测,得到访问速度最快的服务器(一般都是国内的)。搞定。

windows无法解析域名

参考:https://answers.microsoft.com/en-us/windows/forum/windows_7-networking/windows-7-browsers-unable-to-resolve-domain-names/77e1f86d-618d-4d37-b693-8c37bed3b28d

今天不幸办公的PC炸了,不得不重置win10,在重置之后出现了一个非常诡异的问题,浪费了我一整个下午。

这个故障的特征是windows不会向DNS服务器查询域名,手动用nslookup是可以正常获取到解析结果,但是除了nslookup以外,ping之类的工具、浏览器都会直接返回一个无法解析地址的错误。在整个过程中,用wireshark抓包会发现系统根本没有向dns服务器发起解析的请求。

经过一番google(垃圾百度),找到一个问题,就在上面的参考,里面有位Lakusus的老哥给出了一个答案,就是电脑的计算机名丢了,一检查,果然如此,在重新设置上计算机名并重启就正常了。

顺便一说,我在设置的时候不能在win10的“设置”程序里面修改,只能去控制面板-系统那里修改。

希望能对某位不幸的朋友提供一些帮助。

在RouterOS上启用基于域名的策略路由

最近在折腾RouterOS,发现了一种相当有趣的用法,可以基于域名来选择路由。
首先,在ip/firewall/address lists中添加地址,地址可以是ip地址或者是域名,如果是域名,则RouterOS会自动进行一次域名解析,例如这样:
ip.firewall.addresslist
可以看到域名被自动解析成了ip地址,而解析出来的记录前面有个D标记,这意味着这是动态的,ip地址记录会随着dns解析记录而变更。

例子中,我就创建了一个叫做twitter.com的address list,这就可以在mangle中做点手脚了,就像这样:

我在prerouting链中添加了一个mangle,对目标地址在twitter.com列表中的路由都进行一个标记,打上一个叫做gfw的路由标记,在打上标记之后呢,就可以在路由表中,添加一个新的路由:

例子中,我有一个名字叫做gfw的接口,作用就不多说,因为是一个ppp的链接,所以gateway可以不填地址,直接填一个接口的名字,RouterOS可以处理这种情况。上图中,就是说所有打着gfw标记的路由,默认路由是走gfw这个接口。至此,全部基本设置已经完成。

这种addresslist配合mangle的用法除了策略路由还有很多其他的用法,比如说想要屏蔽某些网站,不让用户访问,这就可以在route中,选择这个unreachable的类型,这可比用web-proxy什么的实用多了,屏蔽掉的就不仅仅是80端口了,而是整个ip,无论是http还是https或者其他协议之类的,都会屏蔽掉。当然,在一些比较精细的控制方面,比如说允许访问http://www.helloworld.com但是不允许访问http://www.helloworld.com/something这种就无能为力了,只能向L7方面寻求帮助。


这种方法还有类似的,比如说传统一点,在address lists中,不用域名,而是用地址块,比如说这样:

把一整块地址加进去address lists里面,也是可以的,这样更加容易绕开方法里面的一种缺陷,因为这种方法只能对应一个域名,无法处理子域名或者使用通配符,如果是大量的域名,这会让工作变得相当的麻烦,需要脚本来进行处理。

这种方法有另外一种缺陷,就是面对着同一个域名会有大量ip地址或者是使用CDN网络的网站的时候,容易出问题,RouterOS本身缓存的dns解析地址一般来说只有2条,如果客户端使用了其他dns服务器而不是RouterOS本身作为DNS服务器的话有可能会存在这样一种情况:

RouterOS解析域名A,得到ip地址1ip地址2,并对ip地址1ip地址2进行了策略路由,客户端从dns服务器解析域名A,得到ip地址3ip地址4,这种情况下,客户端访问域名A就没法得到正确的策略路由。

对应的方法很简单,只要指定RouterOS作为客户端的dns服务器就可以了。如果是有客户端想使用其他dns服务器绕过策略路由,可以使用dnat进行劫持,如果是使用dnscrypt之类的软件的话,似乎没什么好对策,毕竟就算是gfw也只能阻挡而不能污染或者劫持dnscrypt。

openwrt上使用dnscrypt来处理dns污染

现在dns污染真的很烦人,总是会莫名其妙地遇到然后导致访问失败,折腾了相当久都没有什么好办法。dnsmasq上加上了chinalist,可以搞定国内的大部分域名,大部分CDN也能用,但是国外的地址解析一直都不是很稳定。

试过直接经梯子用国外的dns服务器,但是由于梯子本身的不稳定,上网的体验太差了,动不动就解析不了ip地址。然后经过一番搜索,得知了dnscrypt已经移植到了openwrt上,于是果断已看,还真有。

root@Belkin ~ # opkg list | grep dnscrypt
dnscrypt-proxy - 1.4.3-1 - dnscrypt-proxy provides local service which can be used directly as your local resolver or as a DNS forwarder, encrypting and authenticating requests using the DNSCrypt protocol and passing them to an upstream server. The DNSCrypt protocol uses high-speed high-security elliptic-curve cryptography and is very similar to DNSCurve, but focuses on securing communications between a client and its first-level resolver.

结果装上之后一试,哎呦,速度还可以,也比较稳定,没出现什么经常性的抽风。

安装的过程非常简单,opkg install dnscrypt-proxy之后修改/etc/config/dnscrypt-proxy,只需要取消注释一行就可以用了

config dnscrypt-proxy
    option address '127.0.0.1'
    option port '5353'
    option resolver 'cisco'
    # option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'
    # option ephemeral_keys '1'

至于可以用的公用解析器,可以参考public DNSCrypt resolvers。

dig了一下,查询时间大概在200-ms,效果良好~

root@Belkin /etc/config # dig youtube.com -p 5353 127.0.0.1

; <<>> DiG 9.9.8-P3 <<>> youtube.com -p 5353 127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40410
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;youtube.com.                   IN      A

;; ANSWER SECTION:
youtube.com.            300     IN      A       216.58.203.14

;; Query time: 194 msec
;; SERVER: 127.0.0.1#5353(127.0.0.1)
;; WHEN: Thu Jun 30 23:51:44 CST 2016
;; MSG SIZE  rcvd: 56

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 6494
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;127.0.0.1.                     IN      A

;; AUTHORITY SECTION:
.                       2158    IN      SOA     a.root-servers.net. nstld.verisign-grs.com. 2016062901 1800 900 604800 86400

;; Query time: 188 msec
;; SERVER: 127.0.0.1#5353(127.0.0.1)
;; WHEN: Thu Jun 30 23:51:44 CST 2016
;; MSG SIZE  rcvd: 113

然后配置dnsmasq,修改/etc/dnsmasq.conf,添加一行

conf-dir=/etc/dnsmasq.d

然后把https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf下载到/etc/dnsmasq.d/,再去修改dnsmasq的转发为127.0.0.1#5353

dnsmasq转发

或者直接修改/etc/config/dhcp

config dnsmasq
    option domainneeded '1'
    option boguspriv '1'
    option localise_queries '1'
    option local '/lan/'
    option domain 'lan'
    option expandhosts '1'
    option authoritative '1'
    option readethers '1'
    option leasefile '/tmp/dhcp.leases'
    option resolvfile '/tmp/resolv.conf.auto'
    option rebind_protection '0'
    list server '127.0.0.1#5353'

blog重新上线

经历了一段操蛋的时间,让我意识到,老老实实续费域名才是正道。

原来一直用godaddy,大店家,质量真心不错,只是他们家的用户名(不支持email地址登录)和密码我永远记不住,要去找回。

内容没话说,100个dns记录,附赠一个免费的邮箱,也就那样。当时要续费的时候因为没有优惠码,于是想转服务商,看着说明说会很麻烦,结果一个脑抽“不如删掉再注册吧”,结结果悲剧了,忘记有保护期这么一回事,导致我最后丢掉了我的域名。

后来又试了crazydomain.au,结果是个大坑,注册域名需要你上传身份证或者驾照什么的不说,在他那边申请了backorder,结果等了70+天之后发现域名已经被抢注了,我擦,吃干饭的?后来想想,唉,注册个新的吧。就注册了个.info域名。当时还搞特价,1.99刀一年,还乐呵呵的想这么便宜,一下子就注册了5年,还不到10刀,高兴的很啊,以前一年都不止这个价。结果注册完了想改dns记录,就看到一个dns service,旁边有个activate,心想,不了个是吧,点了进去,说要继续收费,卧槽,果断邮件问了客服,得到的答案真是要另外付费。尼玛,我注册来用的不是注册来炒的!要额外加收110+的人民币,要你何用!

最后来到了gandi.net,干净利落,果然no bullshit。而且价格表大大方方的放在了页面底部,相比godaddy,我查了半天都找不到pricing list的链接。

最后注册了个.equipment的域名,有点长,但是听起来挺酷的。gandi.net附赠了不少东西,其中有5个邮件账户和1年免费的安全证书这个不错,其他blog什么的用不上。

另外gandi.net的话用paypal支付时有最低限额的,最低转账14刀,我消费了12刀+结果还是被扣了14刀。剩下的钱会转到他的“预付费账户”里面。

发自 WordPress for Android

在openwrt中指定对lan的dns服务器

按照惯例,先上参考:
http://www.right.com.cn/forum/thread-46811-1-1.html

嗯,因为在学校的话有内部网络,而内部网络里面有自己的dns服务器,于是就出现了许多奇奇怪怪的域名(私有)
比如说*.ustb这种域名(不知这顶级域名被注册了没有,啧啧啧啧)
于是就出现问题了,这种失手,dnsmasq的转发有时候会有问题(已经设置了转发到本地dns服务器,但是总是对本地域名解析失败,不知为何)
今天就又出现了类似的问题,一怒之下,上网一搜,ok,出来了,恩山的神人真多。

方法就是在
网络-接口-LAN 页面的下半部
里面有dns的设定,切换到高级选项页,下面有个空“dhcp-选项”
在里面填入

6,dns1,dns2

可以将指定的dns服务器推送给客户端。
参数里面的“6”由

dnsmasq --help dhcp

得到。