Перед доступом к сайту компьютеру необходимо узнать его IP. Обычно для этого используется запрос к DNS серверу, который веб-браузер или операционная система выполняют автоматически, без действий пользователя.
В операционных системах Windows и Linux имеется файл hosts, в котором можно установить IP адреса для любых имён — хостов и доменных имён. По умолчанию операционные системы работают так:
- если запрашиваемое имя присутствует в файле hosts, то его IP берётся из этого файла и запрос к DNS серверу не делается
- если в файле hosts имя хоста не найдено, то выполняется запрос к DNS серверу
В операционной системе Linux можно поменять приоритет источников для получения IP адреса или вовсе отключить некоторые из них. Для этого используется файл /etc/nsswitch.conf
Для чего нужен /etc/nsswitch.conf
Файл /etc/nsswitch.conf — это «Name Service Switch configuration file», то есть конфигурационный файл переключения служб имён. Он устанавливает настройки не только службы преобразования имён хостов и доменных имён, но эта настройка, пожалуй, самая востребованная.
Строка, которая отвечает за преобразование имён хостов начинается на «hosts». В моей системе эта строка выглядит так:
hosts: files mymachines myhostname resolve [!UNAVAIL=return] dns
hosts — это указание на службу, для которой предназначена строка.
files означает файл, относящийся к этой службе. У каждой службе в системе свой файл, в данном случае имеется ввиду /etc/hosts
Кстати, для других служб файлы следующие:
aliases /etc/aliases ethers /etc/ethers group /etc/group hosts /etc/hosts initgroups /etc/group netgroup /etc/netgroup networks /etc/networks passwd /etc/passwd protocols /etc/protocols publickey /etc/publickey rpc /etc/rpc services /etc/services shadow /etc/shadow
Поскольку слово files стоит в строке первым, то в начале имя хоста (доменное имя) ищется в файле /etc/hosts
mymachines — судя по названию, означает имя машины. Можно предположить (информации в документации я не нашёл), что если искомое имя совпадает с именем машины, то возвращается IP адрес текущей машины
myhostname — аналогично, документацию я не нашёл, но ключевое слово имеет отношение имени текущего хоста, возможно, работает как и mymachines
resolve — это системная служба, подробности:
- https://www.freedesktop.org/software/systemd/man/nss-resolve.html
- https://www.freedesktop.org/software/systemd/man/systemd-resolved.html
Строка [!UNAVAIL=return] означает, что если предыдущая служба недоступна, то немедленно будет возвращён результат без запроса в следующем источнике. Поскольку resolve кэширует и валидирует DNS, то, видимо, без resolve нет смысла делать запрос через dns. Также resolve отвечает за преобразования некоторых локальных имён, в том числе "localhost" и "localhost.localdomain" (а также любые имена хостов, заканчивающиеся на ".localhost" или ".localhost.localdomain"), а также "_gateway", который преобразовывается в адрес текущего маршрута по умолчанию.
Кстати, по этой причине возможен следующий фокус (будет пропингован IP адрес маршрута по умолчанию):
ping _gateway
dns — эта запись означает запрос имён у DNS серверов
Как можно увидеть, в первую очередь приоритет отдаётся /etc/hosts, и если ничего не найдено с помощью других сервисов, то только в этом случае для разрешения имени задействуется DNS.
Другие подробности, в том числе про условия передачи управления следующей службы, смотрите в справочной странице файла nsswitch.conf:
man nsswitch.conf
Когда вступают в силу изменения в файле nsswitch.conf. Почему не работают изменения в файле nsswitch.conf
Если вы будете редактировать настройки файла nsswitch.conf, то помните, что службы, которые его используют, считывают файл только один раз. Если после этого в файл были сделаны изменения, то служба по-прежнему будет использовать старый вариант! Получается, чтобы изменения вступили в силу, нужно перезагрузить операционную систему.
Как отключить файл /etc/hosts
Чтобы отключить файл /etc/hosts, нужно в файле /etc/nsswitch.conf найти строку, которая начинается на hosts и удалить из неё слово files.
Например, начальный вид строки:
hosts: files mymachines myhostname resolve [!UNAVAIL=return] dns
Для отключения /etc/hosts нужно чтобы строка выглядела так
hosts: mymachines myhostname resolve [!UNAVAIL=return] dns
Как сделать приоритет DNS выше файла /etc/hosts
Чтобы запросы к DNS серверу выполнялись до поиска имён в файле /etc/hosts, нужно в файле /etc/nsswitch.conf найти строку, которая начинается на hosts и слово dns поставить ДО слова files. Например, так:
hosts: resolve [!UNAVAIL=return] dns files mymachines myhostname
Как оптимизировать файл /etc/nsswitch.conf
Я не проверял этот совет на своей ОС и не мору ручаться, что после него всё будет работать как надо, но я наткнулся на рекомендацию в файле /etc/nsswitch.conf из строки с hosts удалить всё лишнее и записать её в следующем виде:
hosts: dns files
Повторюсь, не мору ручаться за верность последнего совета.
Связанные статьи:
- Как настроить локальный DNS используя файл /etc/hosts в Linux (77.5%)
- Какие есть полезные инструменты с интерфейсом командной строки для системных администраторов Linux (50%)
- Как сделать общую сетевую папку в Linux (настройка SMB в Linux) (50%)
- Как смонтировать сетевую папку Windows/Samba в Linux (50%)
- Как подключиться к сетевой папке в командной строке Linux (50%)
- Программы для бенчмарка CPU в Linux (RANDOM - 22.6%)