Назад | Перейти на главную страницу

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 через TCP, и насколько это надежно в реальном мире.

При наличии EDNS (http://en.wikipedia.org/wiki/Extension_mechanisms_for_DNS) на большинство DNS-запросов, включая IPv6 и DNSSEC, можно ответить с помощью UDP. Следовательно, многие поставщики серверов не разрешают входящие подключения к TCP-порту 53. Использование TCP обычно ограничивается передачей зон.

Поэтому, если вы планируете создать рекурсивный DNS-сервер для локальных клиентов, он должен быть основан на UDP, поскольку все серверы поддерживают UDP, а большинство не поддерживает TCP.

DNS большую часть времени работает с небольшими сообщениями и ответами (просто сделайте разбрызгивание случайных запросов и подумайте о пространстве, необходимом для компактного представления запроса и ответа). Для этого идеально подходит UDP (без затрат на установку / разрыв соединения). Некоторые запросы имеют объемные ответы (например, посмотрите, что выводит nslookup -query=any google.com), которые не укладываются в минимальную дейтаграмму UDP. Их спрашивают и отвечают по TCP.

Проверьте это внутри несвязанный документация:

   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.