今天我玩了一下 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.