你不知道的DNSmasq

你不知道的DNSmasq

最近安大电信推出了网页版登录并开始支持设置固定宽带密码,我当时是第一时间把它安排到了路由器上。没想到因此留下了后遗症,之前直接插网线 pppoe 拨号是可以直接访问内网资源的,但是使用路由器 pppoe 拨号后,连上 wifi 的笔记本却不能直接访问内网资源(奇怪的是我的朋友可以)。

开始,我以为是路由器的 route 配置有问题,于是看了一下 route:

root@OpenWrt:~# route
1
2
3
4
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.25.128.1 0.0.0.0 UG 0 0 0 pppoe-wan
192.168.2.0 * 255.255.255.0 U 0 0 0 br-lan

和朋友发来的截图比对了一下,发现并没有什么区别,场面一度尴尬。在网上胡乱搜索着,却没有搜索任何有用的信息。直到朋友提醒我会不会是 DNS 的问题,这才让我找到新的思路。我赶紧使用 dig 命令查询了相应域名的 DNS 解析信息(这里发生了一个小插曲,OpenWrt 默认不支持 dig 命令,需要先使用 opkg install bind-dig 安装 dig)。没想到我为这些内网服务绑定的动态域名真的无法被解析,是 DNS 的问题无疑了。

root@OpenWrt:~# dig sys.westery.cn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; <<>> DiG 9.9.8-P3 <<>> sys.westery.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13544
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

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

;; Query time: 51 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Mar 10 22:19:29 CST 2019
;; MSG SIZE rcvd: 43

没有 ANSWER SECTION,说明域名解析失败了。但是这个 SERVER: 127.0.0.1#53 是什么鬼?

127.0.0.1 不是本地回环地址吗?自己还能做自己的域名服务器???还是问问度娘吧,她或许知道点什么 /斜眼笑

在 OpenWrt 有一个本地的 DNS 服务叫做 dnsmasq,它默认监听 127.0.0.1。而你真的是 DNS 服务器地址其实是被这个服务维护着的, 所以完整的 DNS 解析流程应该是这样: local process -> local dnsmasq -> router -> ISP dns。

光看理论还不行,让我们赶紧验证一下究竟是不是 dnsmasq 的锅:

root@OpenWrt:~# dig @119.29.29.29 sys.westery.cn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; <<>> DiG 9.9.8-P3 <<>> @119.29.29.29 sys.westery.cn
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9499
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

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

;; ANSWER SECTION:
sys.westery.cn. 600 IN A 172.23.9.18

;; Query time: 598 msec
;; SERVER: 119.29.29.29#53(119.29.29.29)
;; WHEN: Sun Mar 10 22:56:40 CST 2019
;; MSG SIZE rcvd: 59

这里使用 @119.29.29.29 强制 DNSPOD 作为 DNS 服务器解析 sys.westery.cn。看!内网 IP 被正常解析出来了!没错,就是 dnsmasq 的问题。可是你这个 dnsmasq 为什么偏偏不解析指向内网 IP 的动态域名呢?别看我呀,我也不知道...接下来就是一个漫长地搜索答案的过程了,开心地是答案还是被我找到了(往下看)。

大坑

引用自:https://www.cnblogs.com/sunsky303/p/9238669.html
1
2
3
4
5
6
7
8
9
10
11
# 这项安全设置是拒绝解析包含私有 IP 地址的域名,
# 这些IP地址包括如下私有地址范围:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。
# 其初衷是要防止类似上游DNS服务器故意将某些域名解析成特定私有内网IP而劫持用户这样的安全攻击。
# 直接在配置文件中注销 stop-dns-rebind 配置项从而禁用该功能。
# 这个方法确实可以一劳永逸的解决解析内网 IP 地址的问题,但是我们也失去了这项安全保护的特性,
# 所以在这里我不推荐这个办法。
# 使用 rebind-domain-ok 进行特定配置,顾名思义该配置项可以有选择的忽略域名的 rebind 行为
# stop-dns-rebind
# rebind-localhost-ok
# rebind-domain-ok=[<domain>]|[[/<domain>/[<domain>/]
# rebind-domain-ok=/.example.com/.test.com/

我好像看到什么?DNSmasq 默认拒绝解析包含私有 IP 地址的域名。原来如此,知道问题了就好解决了,这里附上我的解决步骤:

1
2
3
4
5
6
# 编辑 dnsmasq 配置文件
vim /etc/dnsmasq.conf
# 在文件末尾添加 rebind-domain-ok 规则后退出
rebind-domain-ok=/.lolimay.cn/.westery.cn/ # 允许 *.lolimay.cn 和 *.westery.cn 解析到内网 IP 地址
# 重启 dnsmasq 服务
/etc/init.d/dnsmasq restart

最后 dig 一下我们之前绑定的动态域名:

root@OpenWrt:~# dig sys.westery.cn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; <<>> DiG 9.9.8-P3 <<>> sys.westery.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25558
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

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

;; ANSWER SECTION:
sys.westery.cn. 600 IN A 172.23.9.18

;; Query time: 237 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Mar 10 23:20:51 CST 2019
;; MSG SIZE rcvd: 59

已经被正常解析了,完工 :)

参考资料

  1. Dnsmasq
  2. ubuntu dns服务器127.0.1.1的问题 - 简书
  3. dnsmasq详解&手册