我有一个位于 NAT 防火墙后面的 Bind 9 DNS 服务器,假设面向 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
但是,在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.
从 VPS,我可以建立连接(使用 telnet)到 1.2.3.4:53
从内部 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
关于为什么我的 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
这是 Ubuntu 12.04 LTS 的默认 bind 安装,配置了大约 11 个区域。
$ named -v
BIND 9.8.1-P1
来自内部 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)
查询期间来自客户端的 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
总结一下之前在评论中写的内容并进一步解释:
看起来有点像您的 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 状态表的方式的配置错误或错误 - 所以你最好的选择是向制造商的客户支持开一个案例(已将代码升级到最新/最好的事先——这样的问题很可能之前已经被其他用户注意到,因此很可能已经被修复了)。
好的... ...我只说一次... ...您无法通过 NAT 访问私有 DNS,除非 NAT 是 DNS。如果您必须通过端口转发才能访问设备,则必须将设备配置为响应该端口。
例如,我在任何端口上向我内部网络上的任何 DNS 发送 DNS 查询,我不需要端口号,因为它们不在 NAT 后面,消息是直接的,我从本地 DNS 服务器获得 DNS 查询,在默认 DNS 端口上运行。
您将特定端口上的查询发送到外部网络。该端口是默认的 DNS 响应端口吗?如果不是,我想你知道是哪一个。它已在错误消息中提供给您。如果可能,请尝试将您的 DNS 服务器设置为响应特定端口号。将其设置为像您的示例一样响应 53。如果它仍然无法通过,则您的 NAT 正在将消息重新路由到传出端口号。
仅仅因为您通过端口号将数据发送到特定机器并不意味着数据通过相同的端口号返回。DNS 响应端口可能不同,这是问题 A,路由器在 NAT 之后沿着返回地址在开放端口上发送回响应,该端口不一定与传入端口相同。首先,您的消息到达路由器,然后到达所需的端口,然后到达端口转发到的机器,然后沿着响应端口返回,到达路由器,路由器转换地址和端口,并将其发送回您的地址。
尝试在 DNS 端的路由器上触发端口。将其设置为在从 NAT 后面打开端口 53 时打开端口 53。如果这不起作用,请检查您的 DNS 服务器并将其设置为也在端口 53 上响应。那应该允许消息传递起作用。
如果这是 VPN 类型网络的 DNS,则 VPN 应该处于活动状态,并且该服务器应该转发端口,而 DNS 在 VPN 子网上有一个静态地址。现在您可以连接 VPN 主机服务器和客户端服务器,客户端服务器后面的任何人都可以看到 DNS 是主要的,他们的互联网网关是他们的次要的,他们的 ISP DNS 是第三的。