Назад | Перейти на главную страницу

Как определяется полное доменное имя?

Я использую Ubuntu и управляю своими хостами с помощью Puppet. До одной или двух машин назад мои хосты разрешили hostname.backend.example.com. Последние две машины разрешаются в hostname.staging.internal. Я немного озадачен тем, как появились эти имена.

# /etc/resolv.conf
nameserver 173.203.4.8
nameserver 173.203.4.9

domain backend.example.com

И

# /etc/hosts
10.182.230.38  web01.staging.internal web01
127.0.0.1     localhost localhost.localdomain

/ bin / hostname отвечает так:

# hostname -a
web01

# hostname -A
108-166-97-91.static.cloud-ips.com web01.staging.internal 

# hostname -I
108.166.97.91 10.182.230.38

Существует запись DNS, которая сопоставляет 108.166.97.91 с web01.backend.example.com. Почему, где и как имя хоста получило web01.staging.internal, а не общедоступную запись DNS?

В hostname команда возвращает результаты из DNS и /etc/hosts.

hostname эквивалентен uname -n и является фактическим "именем хоста" или "узлом" коробки.
Все остальные hostname аргументы используют это имя узла для поиска информации.

Итак, прежде чем идти дальше, я должен объяснить /etc/hosts формат файла.
Первое поле довольно очевидно, это IP-адрес, на который должны разрешаться все имена хостов в строке. Второе поле - это основное имя хоста для этого IP. Остальные поля являются псевдонимами.

Итак, если вы бежите hostname -f сначала он попытается разрешить IP для вашего имени узла. В зависимости от того, как у вас hosts: запись настроена в /etc/nsswitch.conf этот метод будет отличаться.

  • Если вы настроили его для использования DNS, он будет использовать поисковые домены, настроенные в /etc/resolv.conf пока он не получит обратно IP от DNS.
  • Если вы настроили его для использования файлов, он будет искать в /etc/hosts чтобы найти строку, где либо основное имя хоста, либо псевдоним является вашим текущим именем узла (uname -n), а затем вернуть в этой строке имя основного хоста.

Получив IP-адрес, он попытается выполнить обратный поиск по этому IP-адресу. Опять же, он будет использовать для этого DNS и ваш файл hosts на основе вашего nsswitch.conf. В случае использования вашего файла hosts он вернет основную запись (которая является первым полем после IP-адреса в файле).

hostname -a будет работать только с файлом hosts, так как выполнение обратного поиска в DNS дает только 1 результат. С файлом hosts он возвращает алисы в соответствующей строке (которая является всем после первой записи, основного имени хоста).

Примеры
Если ваше имя узла - foobar, и у вас есть запись в /etc/hosts например:

127.0.0.1 foobar.example.com foobar localhost.localdomain localhost

Тогда вы получите следующие результаты команды:

# hostname
foobar
# uname -n
foobar

# hostname -f
foobar.example.com

# hostname -a
foobar localhost.localdomain localhost