При попытке отладить сетевую проблему, локальную для нашей интрасети, стало очевидно, что curl
host
nslookup
и dig
ведут себя по-разному. Где dig
и host
возвращает IP-адрес рассматриваемого URL, curl
и nslookup
return:
curl: (6) Could not resolve host: internal.site.company.com
и
nslookup: can't resolve 'internal.site.company.com`
Хотя это не должно иметь значения, по сути, чтобы дать больше контекста проблемы, эта проблема возникает на докер-машине
и за ней (проверено с помощью докер-машины на обоих virtualbox
и параллели
, если быть точным). Докер-машина
и контейнеры, которые она размещает, имеют правильный IP-адрес желаемого внутреннего DNS-сервера в их /etc/resolv.conf
. IP-адрес желаемого URL-адреса также доступен с компьютеров, которые не могут разрешить имя. Как упоминалось выше, адрес является внутренним сайтом, и наш DNS-сервер также является внутренним. Сайт доступен и разрешается с компьютера, на котором установлена докер-машина
.
Что подводит меня к вопросам ...
1) Под капотом, что делают dig
и host
иначе, чем cURL
и nslookup
?
2) Что может мешать браузеру или curl
от разрешения URL-адреса способом, которым оба host
и dig
успешно разрешают имя?
dig -v
: DiG 9.11.1
host -v
: host 9.11.1
curl -V
: curl 7.49.1
версия докера: Версия 17.06.0-ce-mac19 (18663) Канал: стабильный
Boot2Docker version 17.06.0-ce, build HEAD : 0672754
Я ожидаю curl
для нас библиотеку распознавания, которая будет использовать провайдеров имен, перечисленных в спецификации /etc/nsswitch.conf
хостов по порядку. Если это не включает DNS, то DNS-разрешение не произойдет. Документ nslookup
не документирован для использования этого файла, но по вашему опыту это может произойти. Часто эти данные кэшируются даемоном службы имен. Если демон не справляется, вы можете получить проблемы подобного рода, даже если другие конфигурации верны.
host
и dig
являются чистыми программами DNS поиска. Оба они разрешают имена только через DNS. Они не будут разрешать имена с помощью файлов или других не-DNS провайдеров. Я ожидаю, что они будут использовать информацию в /etc/resolv.conf
напрямую.