我在 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
但是,在远程 VPS 上使用该host
命令时,我收到以下输出:
# 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,我可以建立到 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
关于为什么我的 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
答案1
总结一下之前评论中的内容并做进一步的解释:
看起来您的 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 状态表的方式存在错误 - 因此最好的办法是向制造商的客户支持部门提出案例(事先将代码升级到最新/最佳版本 - 其他用户可能之前已经注意到了此类问题,因此很可能已经修复)。
答案2
好的……我只说一次……您无法通过 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 视为主要 DNS,其互联网网关为次要 DNS,其 ISP DNS 为第三 DNS。