unbound 中的 tcp-upstream 不起作用。在现实世界中,使用 TCP 查询上游 DNS 服务器真的有效吗?

unbound 中的 tcp-upstream 不起作用。在现实世界中,使用 TCP 查询上游 DNS 服务器真的有效吗?

今天我玩了一下 unbound.conf 中的一些选项,只是为了好玩。我启用了 tcp-upstream,但它不适用于某些域。

操作系统:OpenBSD 当前版本。未绑定:1.4.19

启用 tcp-upstream 的示例:

--> dig www.google.com  

; <<>> DiG 9.4.2-P2 <<>> www.google.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30362
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         43200   IN      A       173.194.34.210
www.google.com.         43200   IN      A       173.194.34.212
www.google.com.         43200   IN      A       173.194.34.211
www.google.com.         43200   IN      A       173.194.34.209
www.google.com.         43200   IN      A       173.194.34.208

;; Query time: 579 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Feb 20 01:01:54 2013
;; MSG SIZE  rcvd: 112

--> dig www.facebook.com  

; <<>> DiG 9.4.2-P2 <<>> www.facebook.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 48116
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.facebook.com.              IN      A

;; Query time: 4529 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Feb 20 01:02:05 2013
;; MSG SIZE  rcvd: 34

/var/log/messages显示 Facebook 查询的此错误:

unbound: [29654:0] error: tcp connect: Connection refused

禁用 tcp-upstream 后:

--> dig www.facebook.com  

; <<>> DiG 9.4.2-P2 <<>> www.facebook.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50721
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.facebook.com.              IN      A

;; ANSWER SECTION:
www.facebook.com.       43200   IN      CNAME   star.c10r.facebook.com.
star.c10r.facebook.com. 43200   IN      A       173.252.101.26

;; Query time: 692 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Feb 20 01:06:20 2013
;; MSG SIZE  rcvd: 74

我猜问题是某些服务器不允许 TCP 客户端。有没有什么解决方法?tcp-upstream 在现实世界中真的可用吗?

我知道 UDP 是 DNS 的更好协议。我不需要“改用 UDP”这样的答案。我只想问 DNS over TCP 是否存在这个问题,以及这在现实世界中是否可靠。

答案1

DNS 在大多数情况下适用于小消息和响应(只需进行随机查询,并考虑查询和响应的紧凑表示所需的空间)。对于这种用途,UDP 是理想的选择(没有连接设置/拆除成本)。有些查询有庞大的答案(例如,查看 的输出)nslookup -query=any google.com,这些答案不适合最小的 UDP 数据报。这些是通过 TCP 询问和回答的。

答案2

有了 EDNS(http://en.wikipedia.org/wiki/Extension_mechanisms_for_DNS) 大多数 DNS 查询(包括 IPv6 和 DNSSEC)都可以使用 UDP 进行应答。因此,许多服务器提供商不允许传入连接到 TCP 端口 53。TCP 的使用通常仅限于区域传输。

因此,如果您计划为本地客户端创建递归 DNS 服务器,则它应该基于 UDP,因为所有服务器都支持 UDP,但大多数服务器不支持 TCP。

答案3

查看内部未绑定文档:

   outgoing-num-tcp: <number>
          Number  of  outgoing TCP buffers to allocate per thread. Default
          is 10. If set to 0, or if do_tcp is  "no",  no  TCP  queries  to
          authoritative servers are done.

   incoming-num-tcp: <number>
          Number  of  incoming TCP buffers to allocate per thread. Default
          is 10. If set to 0, or if do_tcp is "no", no  TCP  queries  from
          clients are accepted.

相关内容