Задание имени хоста: полное доменное имя или короткое имя?

178

Я заметил, что «предпочтительный» метод установки имени хоста системы принципиально отличается в системах Red Hat / CentOS и Debian / Ubuntu.

В документации CentOS и руководстве по развертыванию RHEL говорится, что имя хоста должно быть полным доменным именем :

HOSTNAME=<value>где <value>должно быть полное доменное имя (FQDN), например hostname.example.com, но может быть любым именем хоста, которое необходимо.

Руководство по установке RHEL немного более двусмысленно:

Программа установки предложит вам указать имя хоста для этого компьютера, либо в виде полного доменного имени (FQDN) в формате hostname.domainname, либо в качестве краткого имени хоста в формате hostname .

Справочник Debian говорит, что имя хоста не должно использовать полное доменное имя :

3.5.5. Имя хоста

Ядро поддерживает имя хоста системы . Сценарий инициализации на уровне выполнения S, который является символической ссылкой на « /etc/init.d/hostname.sh », устанавливает системное имя хоста во время загрузки (с помощью команды hostname ) на имя, хранящееся в « / etc / hostname ». Этот файл должен содержать только системное имя хоста, а не полное доменное имя.

Я не видел каких-либо конкретных рекомендаций от IBM по поводу использования, но некоторые программы, похоже, имеют предпочтения.

Мои вопросы:

  • В гетерогенной среде лучше использовать рекомендацию поставщика или выбрать одну и быть последовательной на всех хостах?
  • С каким программным обеспечением вы столкнулись, который чувствителен к тому, установлено ли для имени хоста полное доменное имя или короткое имя?
Cakemox
источник

Ответы:

106

Я бы выбрал последовательный подход во всей среде. Оба решения работают нормально и будут совместимы с большинством приложений. Хотя есть разница в управляемости.

Я использую короткое имя в качестве параметра HOSTNAME и задаю полное доменное имя в качестве первого столбца /etc/hostsдля IP- адреса сервера, за которым следует короткое имя.

Я не сталкивался со многими программными пакетами, которые обеспечивают или отображают предпочтения между ними. Я считаю, что короткое имя может быть чище для некоторых приложений, особенно для регистрации. Может быть, мне не повезло, увидев, как внутренние домены server.northside.chicago.rizzomanufacturing.com. Кто хочет видеть это в логах или в командной строке ?

Иногда я участвую в приобретении или реструктуризации компании, когда меняются внутренние домены и / или субдомены. Мне нравится использовать короткое имя хоста в этих случаях, потому что регистрация, кикстарты, печать, мониторинг системы и т. Д. Не требуют полной реконфигурации для учета новых доменных имен.

Типичная настройка сервера RHEL / CentOS для сервера с именем «rizzo» с внутренним доменом «ifp.com» будет выглядеть следующим образом:

/etc/sysconfig/network:
HOSTNAME=rizzo
...

-

/etc/hosts:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.16.100.13   rizzo.ifp.com rizzo

-

[root@rizzo ~]# hostname 
rizzo

-

/var/log/messages snippet:
Dec 15 10:10:13 rizzo proftpd[19675]: 172.16.100.13 (::ffff:206.15.236.182[::ffff:206.15.236.182]) - Preparing to               
 chroot to directory '/app/upload/GREEK'
Dec 15 10:10:51 rizzo proftpd[20660]: 172.16.100.13 (::ffff:12.28.170.2[::ffff:12.28.170.2]) - FTP session opened.
Dec 15 10:10:51 rizzo proftpd[20660]: 172.16.100.13 (::ffff:12.28.170.2[::ffff:12.28.170.2]) - Preparing to chroot                
to directory '/app/upload/ftp/SRRID'
ewwhite
источник
7
Как и вы, я предпочитаю короткое имя, однако недавно я обнаружил, что некоторые приложения Oracle требуют, чтобы выходные данные hostnameбыли FQDN. Просто иметь это /etc/hostsнедостаточно хорошо. Это смешалось с моей последовательностью.
Джеймс О'Горман
3
Разница в капитализации имен хостов в этом примере, безусловно, не является лучшей практикой. Ref: tools.ietf.org/search/rfc1178
teknopaul
2
Не должен /etc/sysconfig/networkсодержать такие строки: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example?
Жасмин Логннес
@JasmineLognnes Правильно, я исправил это. Надеюсь, я не против.
Кубанчик
1
Дело не только в предпочтениях. Смотрите hostname(1)на любой Linux машине.
39

Практически все программное обеспечение чувствительно к правильной настройке имени хоста. Когда я работал в Digg, я однажды отключил весь сайт на 2 часа из-за внесения, казалось бы, невинного изменения, /etc/hostsкоторое повлияло на представление системы об имени хоста. Ступай слегка. Тем не менее, вы можете быть немного смущены здесь. Я не думаю, что HOSTNAME=настройки прямо эквивалентны тому, как используются дистрибутивы на основе Debian /etc/hostname.

Что работает для меня в гетерогенной среде:

  1. Задайте имя хоста рекомендованным поставщиком способом, используя условие в программном обеспечении для управления конфигурацией.
  2. Используйте hostnameкоманду для установки имени хоста, используемого ядром и т. Д.
  3. В /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Эта конфигурация еще не подвела меня.

Пол Латроп
источник
Это в значительной степени установка, которую я использую на работе. Короткое имя должно быть в порядке, если имя домена находится в пути поиска ДНК (/etc/resolv.conf) для соответствующих компьютеров в вашей среде
gWaldo
Вы специально рекомендуете локальный IP-адрес, а не публичный?
code_monk
34

У вас наверняка не возникнет проблем с поиском ссылок в Интернете, которые скажут вам определенно сделать это так или иначе. Однако мне кажется, что наличие короткого имени в качестве имени хоста и полное имя в / etc / hosts, безусловно, более распространено. Это кажется более разумным способом, так как тогда службы, которым нужно полностью определенное имя, могут быть адаптированы для вызова hostname --fqdnвместо них.

Я только недавно столкнулся с одним программным обеспечением, которое жестко требует, чтобы fqdn был возвращен hostname, который был ganeti. Они документируют это здесь . Однако я не вижу причин, по которым они не могут адаптироваться hostname --fqdn.

тушеное мясо
источник
«Я не вижу причин, по которым они не могут адаптироваться hostname --fqdn», - дан ответ в первом абзаце под заголовком «Почему полное имя хоста» - это требует догадок и рабочего распознавателя. Запрашивать ядро ​​- самый безопасный и надежный вариант.
Уомбл
3
@womble - Пока в файле / etc / hosts есть запись для machine ( 10.0.0.1 hostname.example.com hostname), а /etc/nsswitch.conf указывает локальное разрешение перед DNS ( hosts: files dns), тогда наличие локального распознавателя выполняется локальным файлом hosts. Таким образом, аргумент для использования полного доменного имени вместо имени хоста редко содержит воду. Кроме того, другим примером программного обеспечения, которое жестко требует hostnameвозврата полного доменного имени, является пакет почтового сервера Zimbra.
крах
@crashmaxed: это несколько дополнительных требований, любое из которых может оказаться невозможным в данной среде или по ошибке испорчено. Наличие полного доменного имени в структурах данных ядра намного проще.
womble
11

Несколько странно, когда я изучал этот вопрос, я сходил с ума, чтобы проверить исходный код «имени хоста» и написать скрипт для вывода результатов расследования (Fedora 19). Чего не хватает, так это взгляда на «/ etc / hosts», который, по моему скромному мнению, должен быть во избежание всего этого в первую очередь.

#!/bin/bash

function pad {
   if [[ $1 == '?' ]]; then
      printf "%-23s" "?"
   else
      printf "%-23s" "'$1'"
   fi
}

# ----- Kernel -----

# Two ways to configure the kernel values: 
# 1) Put FQDN into "kernel.hostname" and nothing into "kernel.domainname"
# 2) Put machine name into "kernel.hostname" and DNS domain name into "kernel.domainname" (makes more sense)

echo "== Kernel values =="
echo

H=`/sbin/sysctl -n kernel.hostname`
D=`/sbin/sysctl -n kernel.domainname`

echo "Kernel hostname: '$H'"
echo "Kernel domainname: '$D'"

# ----- What does bash say -----

echo
echo "== According to bash =="
echo

echo "HOSTNAME = '$HOSTNAME'"

# ----- Hostname config file ------

echo
echo "== Hostname config file =="
echo

ETCH="/etc/hostname"

if [[ -f $ETCH ]]; then
   CONTENTS=`cat $ETCH`
   echo "File '$ETCH' contains: '$CONTENTS'"
else
   echo "File '$ETCH' does not exist"
fi

# ----- Network config file ------

echo
echo "== Network config file =="
echo

SYSN="/etc/sysconfig/network"

if [[ -f $SYSN ]]; then
   LINE=`grep -e "^HOSTNAME=" $SYSN`
   if [[ -n $LINE ]]; then
      echo "File '$SYSN' contains: '$LINE'"
   else 
      echo "File '$SYSN' exists but does not contain a line for 'HOSTNAME'"
   fi
else
   echo "File '$SYSN' does not exist"
fi

# ----- Nodename -------

echo
echo "== Nodename =="
echo

UNAME=`uname --nodename` # On Linux, this is the hostname

echo "The 'nodename' given by 'uname --nodename' is: '$UNAME'"

# ----- The 'hostname' mess ------

THE_HOSTNAME=`hostname`
SHORT_NAME=`hostname --short`
NIS_DNAME=`domainname`     
YP_DNAME=`hostname --yp`    # Same as `nisdomainname` ; this may fail with "hostname: Local domain name not set"

if [[ $? != 0 ]]; then
   YP_DNAME="?"
fi

echo
echo "== 'hostname' directly obtained values =="
echo
echo "The result of gethostname();"
echo "...obtained by running 'hostname'"
echo "Hostname: $(pad $THE_HOSTNAME)"
echo
echo "The part before the first '.' of the value returned by gethostname();"
echo "...obtained by running 'hostname --short'"
echo "Short name: $(pad $SHORT_NAME)"
echo
echo "The result of getdomainname(); the code of 'hostname' seems to call this the 'NIS domain name';"
echo "...on Linux, this is the kernel-configured domainname;"
echo "...obtained by running 'domainname'"
echo "NIS domain name: $(pad $NIS_DNAME)"
echo
echo "The result of yp_get_default_domain(), which may fail;"
echo "...obtained by running 'ĥostname --yp'"
echo "YP default domain: $(pad $YP_DNAME)"

DNS_DNAME=`hostname --domain`  # Same as `dnsdomainname`'
FQDN_NAME=`hostname --fqdn`
ALIAS_NAME=`hostname --alias`

echo
echo "== 'hostname' values obtained via DNS =="
echo
echo "The part after the first '.' of the 'canonical name' value returned by getaddrinfo(gethostname());"
echo "...obtained by running 'hostname --domain'"
echo "DNS domain name: $(pad $DNS_DNAME)"
echo
echo "The 'canonical name' value returned by getaddrinfo(gethostname());"
echo "...obtained by running 'hostname --fqdn'"
echo "Fully qualified hostname: $(pad $FQDN_NAME)"
echo
echo "Alias obtained by gethostbyname(gethostname());"
echo "...obtained by running 'hostname --alias'"
echo "Hostname alias: $(pad $ALIAS_NAME)"

BY_IP_ADDR=`hostname --ip-address`
ALL_IP_ADDR=`hostname --all-ip-addresses`
ALL_FQDN_NAMES=`hostname --all-fqdn`

echo
echo "== 'hostname' values obtained by collecting configured network addresses =="
echo
echo "Collect the IP addresses from getaddrinfo(gethostname()), apply getnameinfo(ip) to all those addresses;"
echo "...obtained by running 'hostname --ip-address'"
echo "By IP address: $BY_IP_ADDR"
echo
echo "Call getnameinfo(NI_NUMERICHOST) on all addresses snarfed from active interfaces;"
echo "...obtained by running 'hostname --all-ip-addresses'"
echo "All IP addresses: $ALL_IP_ADDR"
echo
echo "Call getnameinfo(NI_NAMEREQD) on all addresses snarfed from active interfaces (involves lookup in /etc/hosts);"
echo "...obtained by running 'hostname --all-fqdn'"
echo "All fully qualified hostnames: $ALL_FQDN_NAMES"

Вывод на виртуальной машине Amazon EC2, работающей под управлением Fedora 19 , после ручной установки значений ядра и заполнения /etc/hostname, но без изменений /etc/hostsможет выглядеть следующим образом:

== Kernel values ==

Kernel hostname: 'kyubee'
Kernel domainname: 'homelinux.org'

== According to bash ==

HOSTNAME = 'ip-172-31-24-249.localdomain'

== Hostname config file ==

File '/etc/hostname' contains: 'kyubee.homelinux.org'

== Network config file ==

File '/etc/sysconfig/network' exists but does not contain a line for 'HOSTNAME'

== Nodename ==

The 'nodename' given by 'uname --nodename' is: 'kyubee'

== 'hostname' directly obtained values ==

The result of gethostname();
...obtained by running 'hostname'
Hostname: 'kyubee'

The part before the first '.' of the value returned by gethostname();
...obtained by running 'hostname --short'
Short name: 'kyubee'

The result of getdomainname(); the code of 'hostname' seems to call this the 'NIS domain name';
...on Linux, this is the kernel-configured domainname;
...obtained by running 'domainname'
NIS domain name: 'homelinux.org'

The result of yp_get_default_domain(), which may fail;
...obtained by running 'ĥostname --yp'
YP default domain: 'homelinux.org'

== 'hostname' values obtained via DNS ==

The part after the first '.' of the 'canonical name' value returned by getaddrinfo(gethostname());
...obtained by running 'hostname --domain'
DNS domain name: ''

The 'canonical name' value returned by getaddrinfo(gethostname());
...obtained by running 'hostname --fqdn'
Fully qualified hostname: 'kyubee'

Alias obtained by gethostbyname(gethostname());
...obtained by running 'hostname --alias'
Hostname alias: ''

== 'hostname' values obtained by collecting configured network addresses ==

Collect the IP addresses from getaddrinfo(gethostname()), apply getnameinfo(ip) to all those addresses;
...obtained by running 'hostname --ip-address'
By IP address: fe80::8f6:8eff:fe49:9e21%eth0 172.31.24.249

Call getnameinfo(NI_NUMERICHOST) on all addresses snarfed from active interfaces;
...obtained by running 'hostname --all-ip-addresses'
All IP addresses: 172.31.24.249

Call getnameinfo(NI_NAMEREQD) on all addresses snarfed from active interfaces (involves lookup in /etc/hosts);
...obtained by running 'hostname --all-fqdn'
All fully qualified hostnames: ip-172-31-24-249.eu-west-1.compute.internal

Устойчивый способ получить полное имя хоста в Perl будет:

sub getHostname {

   my $hostname_short = `/bin/hostname --short`;
   if ($? != 0) { print STDERR "Could not execute 'hostname --short' -- exiting\n"; exit 1 }
   chomp $hostname_short;

   my $hostname_long  = `/bin/hostname`;
   if ($? != 0) { print STDERR "Could not execute 'hostname' -- exiting\n"; exit 1 }
   chomp $hostname_long;

   if ($hostname_long =~ /^${hostname_short}\..+$/) {
      # "hostname_long" is a qualified version of "hostname_short"
      return $hostname_long
   }
   else {
      # both hostnames are "short" (and are equal)
      die unless ($hostname_long eq $hostname_short);

      my $domainname = `/bin/domainname`;
      if ($? != 0) { print STDERR "Could not execute 'domainname' -- exiting\n"; exit 1 }
      chomp $domainname;

      if ($domainname eq "(none)") {
         # Change according to taste
         return "${hostname_short}.localdomain"
      }
      else {
         return "${hostname_short}.${domainname}"
      }
   }
}

и в bash это будет:

function getHostname {

   local hostname_short=`/bin/hostname --short`

   if [ $? -ne 0 ]; then
      echo "Could not execute 'hostname --short' -- exiting" >&2; exit 1
   fi

   local hostname_long=`/bin/hostname`

   if [ $? -ne 0 ]; then
      echo "Could not execute 'hostname' -- exiting" >&2; exit 1
   fi

   if [[ $hostname_long =~ ^"$hostname_short"\..+$ ]]; then
      # "hostname_long" is a qualified version of "hostname_short"
      echo $hostname_long
   else
      # both hostnames are "short" (and are equal)
      if [[ $hostname_long != $hostname_short ]]; then
         echo "Cannot happen: '$hostname_long' <> '$hostname_short' -- exiting" >&2; exit 1
      fi

      local domainname=`/bin/domainname`

      if [ $? -ne 0 ]; then
         echo "Could not execute 'domainname' -- exiting" >&2; exit 1
      fi

      if [[ domainname == '(none)' ]]; then
         # Change according to taste
         echo "${hostname_short}.localdomain"
      else
         echo "${hostname_short}.${domainname}"
      fi
   fi
}

Примечания

Примечание 1: HOSTNAME - это переменная оболочки, которую предоставляет bash («Автоматически устанавливает имя текущего хоста.»), Но нет никаких указаний на то, что bash достигает этого значения.

Примечание 2: Никогда не забывайте / etc / hostname в /boot/initrams-FOO.img ...

Дэвид Тонхофер
источник
4
Извините, если это должно быть очевидно, но какое отношение это имеет к настройке имени хоста?
Крис С
В основном заметки, которые я сделал во время исследования установки имени хоста в моих экземплярах Fedora 19 EC2. Что касается результата: 1) Установите FQHN в / etc / hostname 2) Не трогайте / etc / hosts 3) Вы можете установить 'имя хоста ядра' либо в FQHN, либо в неквалифицированное имя хоста, если неустановлено, значение берется из / etc / hostname 4) Вы можете установить «имя домена ядра» на имя домена, которое лучше, чем просто «(нет)».
Дэвид Тонхофер
-4

Параметры / etc / hosts работают хорошо.

Но вы хотите , чтобы убедиться , что все соответствующие файлы будут обновлены Запустите установочный инструмент

Riaan
источник
В моем дистрибутиве нет инструмента «Настройка»; какой дистрибутив вы используете, который есть?
Никгрим
любая ОС на базе RedHat имеет инструмент установки rhel / centos / fedora, какую ОС вы используете?
Riaan
3
Поскольку вопрос говорит о различиях между дистрибутивами на основе RHEL и Debian, мы должны предположить, что запрашивающий использует оба. В дистрибутивах, основанных на Debian, нет инструмента 'setup'.
Мартин Химельс
-4

Хм ... В хостах linux, если вы хотите изменить HOSTNAME и FQDN, вы должны решить 3 шага (например, новый хост - rizzo.ifp.com ):

Шаг # 1 Измените значение HOST в конфигурации свойств NETWORK:

sudo vi /etc/sysconfig/network

Изменить или добавить строку:

HOSTNAME=rizzo.ifp.com

Шаг № 2 Отредактируйте конфигурацию хостов

sudo vim /etc/hosts
#IPv4
127.0.0.1       localhost localhost.localdomain localhost4 localhost4.localdomain4
[External IP]   rizzo rizzo.ifp.com

Шаг № 3 Перезагрузите хост Хорошо, просто проверьте новую конфигурацию

[rizzo@rizzo]# hostname -f
rizzo.ifp.com
суб
источник
-4

Порядок не правильный. Должно быть:

1.2.3.4 full.example.com full

Таким образом, пример может выглядеть так:

[External IP] rizzo.example.com rizzo 
Кристиан Азуэро
источник
4
На этот вопрос уже есть действительно качественные ответы. Это не добавляет ничего нового.
Эса Йокинен