NAT 背后的 DNS 服务器

Bry*_*yan 7 domain-name-system nat bind port-forwarding ubuntu-12.04

我有一个 Bind 9 DNS 服务器位于 NAT 防火墙后面,假设面向 Internet 的 IP 是 1.2.3.4

对传出流量没有限制,端口 53 (TCP/UDP) 从 1.2.3.4 转发到内部 DNS 服务器 (10.0.0.1)。VPS 或内部 Bind 9 服务器上没有 IP 表规则。

从位于互联网其他地方的远程 Linux VPS,nslookup 工作正常

# nslookup foo.example.com 1.2.3.4
Server:    1.2.3.4
Address:   1.2.3.4#53

Name:      foo.example.com
Addresss:  9.9.9.9
Run Code Online (Sandbox Code Playgroud)

但是,在host远程 VPS 上使用该命令时,我收到以下输出:

# host foo.example.com 1.2.3.4
;; reply from unexpected source: 1.2.3.4#13731, expected 1.2.3.4#53
;; reply from unexpected source: 1.2.3.4#13731, expected 1.2.3.4#53
;; connection timed out; no servers could be reached.
Run Code Online (Sandbox Code Playgroud)

从 VPS,我可以建立到 1.2.3.4:53 的连接(使用 telnet)

从内部 DNS 服务器 (10.0.0.1),主机命令似乎没问题:

# host foo.example.com 127.0.0.1
Using domain server:
Name: 127.0.0.1
Address: 127.0.0.1#53
Aliases:

foo.example.com has address 9.9.9.9
Run Code Online (Sandbox Code Playgroud)

关于为什么我的 VPS 上的主机命令抱怨从另一个端口返回的回复有什么建议,我可以做些什么来解决这个问题?


更多信息:

从网络外部的 Windows 主机

>nslookup foo.example.com 1.2.3.4
DNS request timeout
    timeout was 2 seconds
Server: UnKnown
Address: 1.2.3.4

DNS request timed out.
    timeout was 2 seconds
DNS request timed out.
    timeout was 2 seconds
DNS request timed out.
    timeout was 2 seconds
DNS request timed out.
    timeout was 2 seconds
*** Request to UnKnown timed-out
Run Code Online (Sandbox Code Playgroud)

这是 Ubuntu 12.04 LTS 的默认绑定安装,配置了大约 11 个区域。

$ named -v
BIND 9.8.1-P1
Run Code Online (Sandbox Code Playgroud)

来自内部 DNS 服务器的 TCP 转储(过滤)

20:36:29.175701 IP pc.external.com.57226 > dns.example.com.domain: 1+ PTR? 4.3.2.1.in-addr.arpa. (45)
20:36:29.175948 IP dns.example.com.domain > pc.external.com.57226: 1 Refused- 0/0/0 (45)
20:36:31.179786 IP pc.external.com.57227 > dns.example.com.domain: 2+[|domain]
20:36:31.179960 IP dns.example.com.domain > pc.external.com.57227: 2 Refused-[|domain]
20:36:33.180653 IP pc.external.com.57228 > dns.example.com.domain: 3+[|domain]
20:36:33.180906 IP dns.example.com.domain > pc.external.com.57228: 3 Refused-[|domain]
20:36:35.185182 IP pc.external.com.57229 > dns.example.com.domain: 4+ A? foo.example.com. (45)
20:36:35.185362 IP dns.example.com.domain > pc.external.com.57229: 4*- 1/1/1 (95)
20:36:37.182844 IP pc.external.com.57230 > dns.example.com.domain: 5+ AAAA? foo.example.com. (45)
20:36:37.182991 IP dns.example.com.domain > pc.external.com.57230: 5*- 0/1/0 (119)
Run Code Online (Sandbox Code Playgroud)

查询期间来自客户端的 TCP 转储

21:24:52.054374 IP pc.external.com.43845 > dns.example.com.53: 6142+ A? foo.example.com. (45)
21:24:52.104694 IP dns.example.com.29242 > pc.external.com.43845: UDP, length 95
Run Code Online (Sandbox Code Playgroud)

the*_*bit 5

总结一下先前在评论中写的内容并进一步解释:

看起来有点像您的 UDP NAT 规则被破坏了。一个指示是错误消息reply from unexpected source: 1.2.3.4#13731, expected 1.2.3.4#53和您从客户端获取的跟踪,其中响应看起来像dns.example.com.29242 > pc.external.com.43845: UDP, length 95。响应数据包的源端口应该是 53,它在从 DNS 服务器获取的转储中是正确的(解析为domain用于显示目的)。

虽然一些(尤其是历史上的)解析器可能会接受来自不同端口/IP 的 DNS 响应,但大多数不会 - 主要是出于阻止DNS 欺骗和缓存中毒攻击的安全原因。

无论如何,对于无连接的 UDP NAT 流量,您的路由器应该保留先前收到的 UDP DNS 查询数据包中的状态数据,并将响应数据包的 IP:port 元组重新映射回 1.2.3.4:53 - 这显然没有. 这可能是配置错误或路由器处理端口转发案例的 UDP 状态表的方式中的错误 - 所以最好的办法是向制造商的客户支持开一个案例(已将代码升级到最新/最好事先 - 这样的问题很可能之前已经被其他用户注意到,因此可能已经被修复)。