У меня есть виртуальная машина, на которой запущен Debian Wheezy, и поиск некоторых имен хостов занимает несколько секунд, хотя распознаватель отвечает немедленно. Странно, но поиск с getaddrinfo()
влияет, но gethostbyname()
это не так.
Я переключился на распознаватели Google, чтобы исключить возможность поломки локальных преобразователей, поэтому мой /etc/resolv.conf
внешний вид выглядит следующим образом:
search my-domain.com
nameserver 8.8.4.4
nameserver 8.8.8.8
У меня nsswitch.conf
есть строка:
hosts: files dns
и мой /etc/hosts
не содержит ничего необычного.
Если я попытаюсь telnet webserver 80
, он зависнет на несколько секунд, прежде чем получить разрешение имени. ltrace
Выход [1] показано , что зависание находится в getaddrinfo()
вызове:
getaddrinfo("ifconfig.me", "telnet", { AI_CANONNAME, 0, SOCK_STREAM, 0, 0, NULL, '\000', NULL }, 0x7fffb4ffc160) = 0 <5.020621>
Тем не менее, tcpdump
обнаруживается, что сервер имен ответил немедленно, и только во втором ответе был telnet
разблокирован. Ответы выглядят одинаково:
05:52:58.609731 IP 192.168.1.75.43017 > 8.8.4.4.53: 54755+ A? ifconfig.me. (29)
05:52:58.609786 IP 192.168.1.75.43017 > 8.8.4.4.53: 26090+ AAAA? ifconfig.me. (29)
05:52:58.612188 IP 8.8.4.4.53 > 192.168.1.75.43017: 54755 4/0/0 A 219.94.235.40, A 133.242.129.236, A 49.212.149.105, A 49.212.202.172 (93)
[...five second pause...]
05:53:03.613811 IP 192.168.1.75.43017 > 8.8.4.4.53: 54755+ A? ifconfig.me. (29)
05:53:03.616424 IP 8.8.4.4.53 > 192.168.1.75.43017: 54755 4/0/0 A 219.94.235.40, A 133.242.129.236, A 49.212.149.105, A 49.212.202.172 (93)
05:53:03.616547 IP 192.168.1.75.43017 > 8.8.4.4.53: 26090+ AAAA? ifconfig.me. (29)
05:53:03.618907 IP 8.8.4.4.53 > 192.168.1.75.43017: 26090 0/1/0 (76)
Я проверил журналы брандмауэра хоста, и на порту 53 ничего не блокируется.
Что вызывает игнорирование первого ответа DNS?
[1] Я добавил пару строк, чтобы ltrace.conf
видеть внутри addrinfo
структуры.