ZaLinux.ru

Как в Linux определяется порядок источников для разрешения имён (приоритет файла hosts и DNS)

Перед доступом к сайту компьютеру необходимо узнать его 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 — это системная служба, подробности:

Строка [!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

Повторюсь, не мору ручаться за верность последнего совета.

Рекомендуемые статьи:

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *