Python запрашивает библиотеку, не разрешающую неавторизованный поиск DNS - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть веб-приложение Python Gunicorn, которое выдает следующую ошибку при попытке разрешить внутреннее имя DNS с помощью кэширования coredns:

raise ConnectionError(e, request=request)\nrequests.exceptions.ConnectionError: HTTPConnectionPool(host='lb.consul.local', port=80): 
Max retries exceeded with url: /hello/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f414d5259b0>: 
Failed to establish a new connection: [Errno -2] Name or service not known',))"

Я могу разрешить то же самое с помощью dig:

dig @172.1.0.54 lb.consul.local

; <<>> DiG 9.9.5-9+deb8u16-Debian <<>> lb.consul.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58411
;; flags: qr rd; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;lb.consul.local. IN A

;; ANSWER SECTION:
lb.consul.local. 1 IN A 172.10.9.0

;; Query time: 1 msec
;; SERVER: 172.1.0.54#53(172.1.0.54)
;; WHEN: Wed Feb 20 02:43:47 UTC 2019
;; MSG SIZE  rcvd: 358

Стоит отметить, что ответ не является авторитетным из кодов ответа копать qr rd.Если я переключу обратно /etc/resolv.conf, чтобы указать на полномочный сервер DNS вместо сервера coredns, выступающего в качестве кэша, все снова будет работать нормально.

Есть ли у библиотеки запросов какие-либо проблемы, решаемые из неавторизованных источниковили есть способ настроить библиотеку для приема ответов от неавторизованных источников DNS?

РЕДАКТИРОВАТЬ 20 февраля

Сервер, на котором работает приложение, настроен правильноговорить с указанным выше DNS-сервером:

root@server-test-7bff545c5b-42ln5:/app# cat /etc/resolv.conf
nameserver 172.1.0.54
search nstest.svc.cluster.local svc.cluster.local cluster.local 
ec2.internal
options ndots:5

РЕДАКТИРОВАТЬ 20 февраля 8:50 PST

Я смог воспроизвести это только с оболочкой Python внутримашина, если я запускаю ее сразу же назад:

>>> import socket
>>> socket.getaddrinfo('lb.consul.local', 80, 0, socket.SOCK_STREAM)
[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('172.10.9.0', 80))]
>>> socket.getaddrinfo('lb.consul.local', 80, 0, socket.SOCK_STREAM)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/socket.py", line 745, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

Журналы на стороне DNS:

2019-02-20T16:35:21.688Z [INFO] 172.10.112.60:41539 - 6366 "AAAA IN lb.consul.local. udp 57 false 512" NOERROR qr,aa,rd 134 0.003542729s
2019-02-20T16:35:21.717Z [INFO] 172.10.112.60:58468 - 40098 "AAAA IN lb.consul.local. udp 57 false 512" NOERROR qr,rd 134 0.000064083s

Опять отсутствует ответ на запрос aa.

РЕДАКТИРОВАТЬ 20 февраля 18:05 PST

Еще несколько часов в этом, и я только обошел проблему, просто отключив отрицательный кеш в сердечниках через этот PR: https://github.com/coredns/coredns/pull/2588.

Это, похоже, решило проблему.Но опять же, я до сих пор не знаю, что послужило причиной того, что эти отрицательные результаты запроса ipv6, поступающие из кэша coredns, вызвали исключение в библиотеке сокетов, когда явно разрешался ipv4.

...