В моей компании при установке Ubuntu я не могу пропинговать ни одну локальную машину:
$ ping foobar.mycompany.local
ping foobar.mycompany.local: Name or service not known
Но если я вставлю dns
в /etc/nsswitch.conf
начало списка, то это сработает:
# hosts: files mdns4_minimal [NOTFOUND=return] dns
hosts: dns files mdns4_minimal [NOTFOUND=return]
Я хотел бы понять, почему.
решение1
Ваша компания использует домен DNS, заканчивающийся на .local
, который на самом деле является специальным суффиксом и зарезервирован IETF дляМногоадресная DNS-рассылка. Так как у вас установлен клиент mDNS (mdns4_minimal), он настраивается на приоритетную обработку всех *.local
имен.
(К сожалению, в корпоративных интрасетях все еще распространена практика создания несуществующего доменного имени илиайпи адресдиапазон и надеюсь, что он останется несуществующим навсегда...)
Просмотрите настроенные модули один за другим:
hosts: files mdns4_minimal [NOTFOUND=return] dns
- Модуль «files» ищет /etc/hosts, а затем возвращает «не найдено».
- Обработка продолжается до следующего модуля.
- Модуль «mdns4_minimal» выполняет поиск в локальной подсети LAN с помощью Multicast DNS (mDNS), а затем возвращает «не найдено».
[NOTFOUND=return]
указывает на то, что обработка не должна продолжаться после этой ошибки; т.е. «не найдено» должно быть немедленно возвращено программе.- Модуль «dns» никогда не достигается.
Зачем лишний "[NOTFOUND=return]"? По разным данным, он нужен для ускорения безуспешных запросов и предотвращения утечки информации, а также для снижения нагрузки на публичные DNS-серверы.
Допустим, чья-то сетьфактически использованоmDNS (что распространено в Linux/macOS). Если пользователь пытался разрешить «MyLittleLaptop.local» и он не был найден, система продолжала пробовать следующий модуль («dns»), и запрос отправлялся на публичный DNS (например, на DNS-серверы школы или на маршрутизатор кофейни).
Но – согласно оговорке IETF – *.local
имена не могут существовать в публичном DNS, поэтому такой запрос был бы бесполезен, все, что он делает, это раскрывает вашу личную информацию администратору сети. Поэтому добавляется тег [NOTFOUND=return], чтобы полностью не допустить его попадания в DNS.
Если ваша корпоративная сеть использует .local
внутренний DNS и выдовольно уверенон никогда не будет использовать mDNS, вы можете удалить весь модуль – в результате получится:
hosts: files dns
Если вы хотите отдать приоритет DNS, но оставить возможность использования mDNS, то переместите его в конец:
hosts: files dns mdns_minimal