Dnsmasq

DNSMasq 無法解析公共域名上的不可路由 IP

  • November 24, 2016

我們的 DNSMasq 無法解析來自指定私有 IP 地址的公共域的 A、CNAME 或別名記錄。

例如:

$ nslookup
> server 172.16.1.1
Default server: 172.16.1.1
Address: 172.16.1.1#53

> www.work-domain.com
Server:         172.16.1.1
Address:        172.16.1.1#53

Non-authoritative answer:
Name:   www.work-domain.com
Address: 55.77.XXX.XXX

> server-b.work-domain.com
Server:         172.16.1.1
Address:        172.16.1.1#53

Non-authoritative answer:
*** Can't find server-b.work-domain.com: No answer

但是切換到公共 DNS 工作正常:

$ nslookup
> server 8.8.8.8
Default server: 8.8.8.8
Address: 8.8.8.8#53

> www.work-domain.com
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   www.work-domain.com
Address: 55.77.XXX.XXX

> server-b.work-domain.com
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   server-b.work-domain.com
Address: 10.1.XXX.XXX

請注意,該server-b.work-domain.com條目正確解析為不可路由的 IP 地址10.1.XXX.XXX?那是我的問題,它不適用於本地網路上的本地 dnsmasq。

這些 IP 地址是我們 Amazon AWS 私有子網的一部分,我們有 VPN 可以訪問它們。

這與在多個子網的 4 個不同公共域註冊的所有 200 多台伺服器都是 100% 一致的,所有伺服器都使用私有不可路由 IP 地址。但是,使用公共可路由 IP 地址的所有其他記錄都可以正常工作,在同一個域上!

其他一切都 100% 使用本地 dnsmasq 正常工作:

  • 解析所有公共域
  • 解析公共 IP 的所有 IP 反向查找
  • 解析所有內部私有域和主機
  • 解決私有 IP 和 DHCP 租約的所有 IP 反向查找

它只是使用私有不可路由 IP 的公共記錄。

我一定錯過了一些無法中斷閱讀 MAN 頁面的選項。

版本:

Dnsmasq version 2.73 # (part of AdvancedTomato)

配置(刪除敏感條目,留下範例):

# dhcp-option=lan,3,172.16.1.1
cache-size=8192
log-async=25
strict-order
#local=/lan/
#domain=lan,172.16.1.0/24,local
expand-hosts
domain-needed

# network devices
address=/router-gateway.lan/172.16.1.1
address=/router-office.lane/172.16.1.2
...and so on x 70

# arpa entries
ptr-record=1.1.16.172.in-addr.arpa,"router-gateway.lan"
ptr-record=2.1.16.172.in-addr.arpa,"router-office.lan"
...and so on

AdvancedTomato 上的本地解析吐出:

# cat /etc/resolv.conf
nameserver 127.0.0.1

# cat /etc/resolv.dnsmasq
nameserver 8.8.8.8
nameserver 8.8.4.4

再次.. 一切都與 Windows、OSX 和 Linux 客戶端上的本地 LAN 完美配合,解析公共和內部域和 LAN,甚至沒有域後綴的主機(server-xyz -> 解析為 server-xyz.lan)。

它只是使用不可路由 IP 的公共域。

@HåkanLindqvist 的評論為我指明了正確的方向。只要他回答,我就會將他標記為答案。直到那時…

他的評論向我指出了rebinddnsmasq 的選項:

--stop-dns-rebind
   Reject (and log) addresses from upstream nameservers which are in the private IP ranges. This blocks an attack where a browser behind a firewall is used to probe machines on the local network.
--rebind-localhost-ok
   Exempt 127.0.0.0/8 from rebinding checks. This address range is returned by realtime black hole servers, so blocking it may disable these services.
--rebind-domain-ok=[<domain>]|[[/<domain>/[<domain>/]
   Do not detect and block dns-rebind on queries to these domains. The argument may be either a single domain, or multiple domains surrounded by '/', like the --server syntax, eg. --rebind-domain-ok=/domain1/domain2/domain3/

有了這些知識,我看到這實際上是正在發生的事情:

# cat /tmp/etc/dnsmasq.conf
...
rebind-localhost-ok
...

然後我將以下內容添加到我的 dnsmasq.conf 以修復它:

rebind-domain-ok=/work-domain1.com/work-domain2.com/

嗚呼!有用!

我的 dnsmasq 必須使用預設的嚴格選項進行編譯。

引用自:https://serverfault.com/questions/816740