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)
总结一下先前在评论中写的内容并进一步解释:
看起来有点像您的 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 状态表的方式中的错误 - 所以最好的办法是向制造商的客户支持开一个案例(已将代码升级到最新/最好事先 - 这样的问题很可能之前已经被其他用户注意到,因此可能已经被修复)。