Введение в DNS: основные термины, компоненты и понятия. Как работает DNS

В Linux имя хоста используется многими сервисами и утилитами. Если имя хоста задано неправильно, то вы будете постоянно получать сообщения об ошибках и предупреждения. Всё зависит от того, как вы используете операционную систему. Если это обычный домашний компьютер, личный ноутбук, то можно задать любое имя и игнорировать ошибки. А если вы используете компьютер в качестве сервера, то очень важно правильно задать имя хоста (hostname).
Вот несколько причин настроить имя хоста:
  • Имя хоста отображается в подсказке Bash, сразу после символа @. Так намного проще понять на каком сервере вы залогинены.
  • MTA (message transfer agent) используют имя хоста при отправке писем (в зависимости от конфигурации MTA).

В чём разница между доменным именем и именем хоста?

Как ни странно, это не такой простой вопрос как может показаться на первый взгляд. Значение некоторых терминов может меняться в зависимости от контекста. Давайте начнем с доменного имени . Если вы знаете, как работают системы доменных имен (DNS), то вы знаете что такое доменное имя. Система доменных имен хранит запись типа A или AAAA, запись является соответсвием между доменным именем и IP-адресом. То есть, когда говорят о веб-сайте, под доменным именем обычно имеют в виду его адрес (например, "www.сайт").
Имя хоста - это символическое имя, назначенное устройству, подключенному к сети, которое может быть использовано для организации доступа к этому устройству. А какое же имя писать в качестве hostname? Здесь всё запутано, в документации к разным дистрибутивам Linux можно увидеть противоположные рекомендации . Но большинство участников дискуссий сходятся во мнении, что в качестве hostname лучше указывать короткое имя, а в файле /etc/hosts сначала следует писать доменные имена, а потом уже имя хоста.
Стоит ещё упомянуть термин Fully Qualified Domain Name (с англ. "полностью определённое имя домена"). FQDN получается если к имени хоста присоединить имя родительского домена. К примеру, есть сервер с Apache, ему назначено имя хоста websrv1. И есть сервер с базами данных, ему назначено имя dbsrv. И пусть родительским доменом для них будет example.org. Тогда полностью определенными доменными именами будут websrv1.example.org и dbsrv.example.org.
Так в чем же разница между доменным именем и именем хоста? У меня нет четкого ответа, но можно сказать, что имя хоста может зависеть от доменного имени. Наверно, можно сказать, что FQDN должно быть равно доменному имени. То есть если у вас есть сайт www.example.org, то hostname сервера может быть равен www. И в обратную сторону это правило тоже должно работать. То есть если вы в качестве имени хоста используете не www, а websrv1, то стоит добавить соответсвующую запись в DNS. При этом DNS-сервер может эту запись не распространять за пределы своей подсети, это может быть DNS-сервер для внутренних нужд.

Настройка имени хоста в Ubuntu

Есть в Linux специальная команда hostname, если вызвать её без аргументов, то она выведет текущее имя хоста.
Чтобы изменить имя хоста, передайте новое имя в качестве аргумента:
  1. hostname web-srv-1
Новое имя хоста будет активно сразу после выполнения, но после перезагрузки будет восстановлено имя из файла /etc/hostname. Поэтому нужно изменить ещё и файл hostname. В других статьях пишут, что надо перезапустить сервис hostname, но в моей Ubuntu 14.04 такого сервиса нет. Так что я просто перезагрую операционную систему. Кстати, в Ubuntu есть специальная утилитка, которая меняет и текущее значение hostname и файл /etc/hostname. Называется hostnamectl. Если вызвать её без аргументов, то кроме имени хоста она покажет ещё и версию Ubuntu, версию ядра, архитектуру и тип компьютера. А чтобы установить доменное имя, нужно выполнить команду:
  1. hostnamectl set-hostname web-srv-1
После этого необходимо произвести изменения в файле /etc/hosts. IP-адрес 127.0.1.1 должен соответствовать новому имени хоста.
  1. 127.0.1.1 web-srv-1
И для завершения настройки необходимо перезапустить сеть или перезагрузить операционную систему.

Автоматизированная настройка имени хоста с помощью Fabric

Если вы не знаете, что такое Fabric, то вот документация . Я же просто приведу код функции, с помощью которой я настраиваю имя хоста.
  1. def conf_hostname (hostname , domain = None ):
  2. fqdn = hostname if domain is None else hostname + "." + domain
  3. sudo ("hostname %s " % hostname )
  4. sudo ("echo " %s " > /etc/hostname" % hostname )
  5. fabfiles . sed ("/etc/hosts" , "^(127\.0\.1\.1\s+)[-a-z0-9]+" , " \\ 1 %s %s " % (fqdn , hostname ), use_sudo = True )
  6. sudo ("reboot" )
  7. time . sleep (20 )

A fully qualified domain name (FQDN) is the complete domain name for a specific computer, or host, on the internet. The FQDN consists of two parts: the hostname and the domain name. For example, an FQDN for a hypothetical mail server might be mymail.somecollege.edu . The hostname is mymail , and the host is located within the domain somecollege.edu .

In this example, .edu is the top-level domain (TLD). This is similar to the root directory on a typical workstation, where all other directories (or folders) originate. (Within the .edu TLD, Indiana University Bloomington has been assigned the indiana.edu domain, and has authority to create subdomains within it.)

The same applies to web addresses. For example, www.indiana.edu is the FQDN on the web for IU. In this case, www is the name of the host in the indiana.edu domain.

When connecting to a host (using an SSH client, for example), you must specify the FQDN. The DNS server then resolves the hostname to its IP address by looking at its DNS table. The host is contacted and you receive a login prompt.

If you are using only the hostname (without the domain information) to connect to a server, the application you"re using may not be able to resolve the hostname. This can happen if either the DNS suffix search order in your computer"s TCP/IP properties is incorrect, or the DNS table is corrupted. In these cases, entering the host"s FQDN will allow DNS to locate the server. Also, if you are trying to connect to a remote host that is not local to your internet service provider (ISP), you will probably have to use the FQDN. For example, it"s unlikely that a DNS server at IU would have a listing for remote hosts at another university or an unrelated ISP.

Сегодня мы поговорим про одну из самых важных вещей при настройке сервера. Был такой анекдот (дословно не помню):
- чего так сильно задумался?
- да hostname серверу выбираю.
- ну ты прям как имя ребенку выбираешь, час уже сидишь.
- ну ты чо. Ребенку можно имя сменить потом, а вот hostname у сервера хрен сменишь.

И действительно — оооочень много геморроя в моей жизни (а особенно в районе почты) было связано с тем, что предыдущие админы/владельцы сервера/рандомные фрилансеры не понимали важности fqdn. Для чего оно вообще нужно? Сервер при обращении к другим серверам будет «представляться» и называть своё «имя». Это имя должно быть корректным (и у нас должны быть документы, бгыгы, чтобы полиция не арестовала). Шутки шутками, но hostname очень важен во «взаимоотношениях» почтовых серверов — если вы пропустите эту статью, то письма с сервера будут улетать в спам почти на всех почтарях.
Много софта тоже завязан на fqdn и будет работать не совсем корректно, если ваш сервер отвечает херню в ответ на команду hostname -f.

Что такое fqdn в принципе? Это доменное имя (да, обычное доменное имя, вроде www.сайт). Можно почитать википедию. Я вам лучше покажу на пальцах на примере корректно настроенного сервера, так будет понятнее.

Возьмём для примера корректно настроенный сервер.
Заходим на него по ssh и проверяем hostname:

root@server:~# hostname -f
messer.qs.biz

В ответ на эту команду мы должны получить именно fqdn сервера, а не короткое имя (не messer, например).

Далее узнаем «дефолтный» IP сервера (если у вас всего один IP на сервере — то можете просто скопировать его из письма).
Вообще нужно иметь в виду, что все исходящие коннекты с сервера (если вы не настраивали маршрутизацию локально) будут проходить с одного IP-адреса, вопреки всяческой мифологии.
Собственно, быстрее всего узнать исходящий IP сервера примерно так:

root@server:~# curl ifconfig.me
46.4.251.93

root@server:~# curl ip.vlad.pro
46.4.251.93

Запоминаем — с этого адреса (если вы не предпринимали ничего для того, что было по другому) сервер будет открывать все исходящие коннекты — например, обращаться к другим сайтам курлом из php-кода (даже в том случае, если ваш сайт «смотрит» А-записью во второй-третий-десятый IP сервера).

Теперь проверим, что у этого IP есть PTR-запись:

root@server:~# host 46.4.251.93
93.251.4.46.in-addr.arpa domain name pointer messer.qs.biz.

И напоследок проверим, что мы не совсем сошли с ума и прописали прямую запись для нашего хоста в правильный IP:

root@server:~# host messer.qs.biz.
messer.qs.biz has address 46.4.251.93

Вообще всё это было присказка. Теперь начинается сама 5-я часть мануала.
Нам нужно сделать, чтобы в итоге все команды выше отдавали в ответ правильные данные.

Первым делом выберите fqdn для сервера. Обычно fqdn — это домен третьего уровня, на котором «не будет сайта». Проще говоря, www.qs.biz — хреновый fqdn в перспективе (потому что www.qs.biz домен когда-нибудь захочет переехать на другой сервер), а вот messer.qs.biz — неплохое имя, вряд ли я когда-нибудь решу поднять там сайт.
Так же не очень хорошая идея делать fqdn второго уровня по той же причине (хотя если вам не лень регистрировать домен второго уровня только ради этого и вы точно не собираетесь на него вешать сайт — то милости просим).

Когда выбрали fqdn, прописываем прямую А-запись (и AAAA-запись, если есть ipv6) на IP сервера. Здесь я не возьмусь описывать, как именно прописать — регистраторов миллион, панелей управления DNS ещё больше. Если ваш домен делегирован на NS-ы регистратора, то можете подглядеть в инструкции Яндекс.ПДД — http://help.yandex.ru/pdd/add-domain/hoster-settings.xml , там для некоторых регистраторов есть инструкция с картинками.

Через пару часов после того, как вы прописали прямую запись (или сколько у вас там TTL), можно прописывать PTR-запись (или по-другому — обратную запись). Как это сделать, опять же, нужно уточнить в саппорте своего хостера. Могу только отметить, что у PTR-записи на конце должна быть точка, если будете прописывать сами в веб-морде.

Ну и после всего этого остаётся настроить hostname сервера. Для этого нужно поправить 2 файла.
/etc/hostname:

messer.qs.biz

То есть пишем fqdn без точки на конце.

В файл /etc/hosts нужно добавить такую строку:

46.4.251.93 messer.qs.biz messer

Обратите внимание на порядок столбцов в строке — сначала ip, потом fqdn целиком, потом короткое имя хоста (до первой точки).

И в конце нужно запустить команду:

root@server:~# /etc/init.d/hostname start

Для убунты 14.04 и дебиана 8-го (и новее):

root@server:~# service hostname start

На этом всё. Остаётся только дождаться, когда PTR и A записи созданные ранее разъедутся по всем резолверам (обычно — TTL*2) и можно начинать использовать сервер.

Не имеющее неоднозначностей в определении. Включает в себя имена всех родительских доменов иерархии DNS .

В DNS и, что особенно существенно, в файлах зоны (англ.) , FQDN завершаются точкой (например, example.com.), то есть включают корневое доменное имя, которое является безымянным.

Различие между FQDN и доменным именем появляется при именовании доменов второго, третьего (и т. д.) уровня. Для получения FQDN требуется обязательно указать в имени домены более высокого уровня (например, sample является доменным именем, однако FQDN имя выглядит как sample.gtw-02.office4.example.com.). В DNS-записях доменов (для перенаправления, почтовых серверов и т. д.) всегда используются FQDN.

Источники

  • Брайан Хилл. Полный справочник по Cisco = Cisco: The Complete Reference. - М .: «Вильямс» , 2007. - С. 1088. - ISBN 0-07-219280-1 .

Напишите отзыв о статье "FQDN"

Ссылки

См. также

Отрывок, характеризующий FQDN

– Он говорит – женщина, а Марья Николавна – барыня, – сказал дворовый человек.
– Да вы знаете ее, зубы длинные, худая, – говорил Пьер.
– И есть Марья Николавна. Они ушли в сад, как тут волки то эти налетели, – сказала баба, указывая на французских солдат.
– О, господи помилуй, – прибавил опять дьякон.
– Вы пройдите вот туда то, они там. Она и есть. Все убивалась, плакала, – сказала опять баба. – Она и есть. Вот сюда то.
Но Пьер не слушал бабу. Он уже несколько секунд, не спуская глаз, смотрел на то, что делалось в нескольких шагах от него. Он смотрел на армянское семейство и двух французских солдат, подошедших к армянам. Один из этих солдат, маленький вертлявый человечек, был одет в синюю шинель, подпоясанную веревкой. На голове его был колпак, и ноги были босые. Другой, который особенно поразил Пьера, был длинный, сутуловатый, белокурый, худой человек с медлительными движениями и идиотическим выражением лица. Этот был одет в фризовый капот, в синие штаны и большие рваные ботфорты. Маленький француз, без сапог, в синей шипели, подойдя к армянам, тотчас же, сказав что то, взялся за ноги старика, и старик тотчас же поспешно стал снимать сапоги. Другой, в капоте, остановился против красавицы армянки и молча, неподвижно, держа руки в карманах, смотрел на нее.
– Возьми, возьми ребенка, – проговорил Пьер, подавая девочку и повелительно и поспешно обращаясь к бабе. – Ты отдай им, отдай! – закричал он почти на бабу, сажая закричавшую девочку на землю, и опять оглянулся на французов и на армянское семейство. Старик уже сидел босой. Маленький француз снял с него последний сапог и похлопывал сапогами один о другой. Старик, всхлипывая, говорил что то, но Пьер только мельком видел это; все внимание его было обращено на француза в капоте, который в это время, медлительно раскачиваясь, подвинулся к молодой женщине и, вынув руки из карманов, взялся за ее шею. В Linux имя хоста используется многими сервисами и утилитами. Если имя хоста задано неправильно, то вы будете постоянно получать сообщения об ошибках и предупреждения. Всё зависит от того, как вы используете операционную систему. Если это обычный домашний компьютер, личный ноутбук, то можно задать любое имя и игнорировать ошибки. А если вы используете компьютер в качестве сервера, то очень важно правильно задать имя хоста (hostname).
Вот несколько причин настроить имя хоста:
  • Имя хоста отображается в подсказке Bash, сразу после символа @. Так намного проще понять на каком сервере вы залогинены.
  • MTA (message transfer agent) используют имя хоста при отправке писем (в зависимости от конфигурации MTA).

В чём разница между доменным именем и именем хоста?

Как ни странно, это не такой простой вопрос как может показаться на первый взгляд. Значение некоторых терминов может меняться в зависимости от контекста. Давайте начнем с доменного имени . Если вы знаете, как работают системы доменных имен (DNS), то вы знаете что такое доменное имя. Система доменных имен хранит запись типа A или AAAA, запись является соответсвием между доменным именем и IP-адресом. То есть, когда говорят о веб-сайте, под доменным именем обычно имеют в виду его адрес (например, "www.сайт").
Имя хоста - это символическое имя, назначенное устройству, подключенному к сети, которое может быть использовано для организации доступа к этому устройству. А какое же имя писать в качестве hostname? Здесь всё запутано, в документации к разным дистрибутивам Linux можно увидеть противоположные рекомендации . Но большинство участников дискуссий сходятся во мнении, что в качестве hostname лучше указывать короткое имя, а в файле /etc/hosts сначала следует писать доменные имена, а потом уже имя хоста.
Стоит ещё упомянуть термин Fully Qualified Domain Name (с англ. "полностью определённое имя домена"). FQDN получается если к имени хоста присоединить имя родительского домена. К примеру, есть сервер с Apache, ему назначено имя хоста websrv1. И есть сервер с базами данных, ему назначено имя dbsrv. И пусть родительским доменом для них будет example.org. Тогда полностью определенными доменными именами будут websrv1.example.org и dbsrv.example.org.
Так в чем же разница между доменным именем и именем хоста? У меня нет четкого ответа, но можно сказать, что имя хоста может зависеть от доменного имени. Наверно, можно сказать, что FQDN должно быть равно доменному имени. То есть если у вас есть сайт www.example.org, то hostname сервера может быть равен www. И в обратную сторону это правило тоже должно работать. То есть если вы в качестве имени хоста используете не www, а websrv1, то стоит добавить соответсвующую запись в DNS. При этом DNS-сервер может эту запись не распространять за пределы своей подсети, это может быть DNS-сервер для внутренних нужд.

Настройка имени хоста в Ubuntu

Есть в Linux специальная команда hostname, если вызвать её без аргументов, то она выведет текущее имя хоста.
Чтобы изменить имя хоста, передайте новое имя в качестве аргумента:
  1. hostname web-srv-1
Новое имя хоста будет активно сразу после выполнения, но после перезагрузки будет восстановлено имя из файла /etc/hostname. Поэтому нужно изменить ещё и файл hostname. В других статьях пишут, что надо перезапустить сервис hostname, но в моей Ubuntu 14.04 такого сервиса нет. Так что я просто перезагрую операционную систему. Кстати, в Ubuntu есть специальная утилитка, которая меняет и текущее значение hostname и файл /etc/hostname. Называется hostnamectl. Если вызвать её без аргументов, то кроме имени хоста она покажет ещё и версию Ubuntu, версию ядра, архитектуру и тип компьютера. А чтобы установить доменное имя, нужно выполнить команду:
  1. hostnamectl set-hostname web-srv-1
После этого необходимо произвести изменения в файле /etc/hosts. IP-адрес 127.0.1.1 должен соответствовать новому имени хоста.
  1. 127.0.1.1 web-srv-1
И для завершения настройки необходимо перезапустить сеть или перезагрузить операционную систему.

Автоматизированная настройка имени хоста с помощью Fabric

Если вы не знаете, что такое Fabric, то вот документация . Я же просто приведу код функции, с помощью которой я настраиваю имя хоста.
  1. def conf_hostname (hostname , domain = None ):
  2. fqdn = hostname if domain is None else hostname + "." + domain
  3. sudo ("hostname %s " % hostname )
  4. sudo ("echo " %s " > /etc/hostname" % hostname )
  5. fabfiles . sed ("/etc/hosts" , "^(127\.0\.1\.1\s+)[-a-z0-9]+" , " \\ 1 %s %s " % (fqdn , hostname ), use_sudo = True )
  6. sudo ("reboot" )
  7. time . sleep (20 )


Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: