У мене працює VM під керуванням 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
структури.