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


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

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

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

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

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

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

3.5.5. Имя хоста

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

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

Мои вопросы:

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

160
2017-11-17 13:07


Источник




Ответы:


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

Я использую короткое имя как параметр 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'

95
2017-11-17 13:20



Как и вы, я предпочитаю короткое имя, однако недавно я обнаружил, что некоторые приложения Oracle требуют вывода hostname быть FQDN. Просто имея это в /etc/hosts недостаточно. Это совратило с моей последовательностью. - James O'Gorman
Разница в капитализации имен хостов в этом примере, безусловно, не является лучшей практикой ref: tools.ietf.org/search/rfc1178 - teknopaul
не должны /etc/sysconfig/network содержат строки типа: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example ? - Jasmine Lognnes
@JasmineLognnes Правильно, я исправил это. Надеюсь, все это не против. - kubanczyk
Речь идет не только о предпочтении. Видеть hostname(1) на любой Linux-машине.


Практически все программное обеспечение чувствительно к правильной настройке имени хоста. В то время как я работал в 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
    

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


35
2017-11-21 18:48



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


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

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


27
2017-12-15 14:45



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


Несколько тангенциально, исследуя этот вопрос, я достаточно схожу, чтобы проверить исходный код «hostname» и написать сценарий для печати результатов расследования (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 ...


9
2017-10-03 11:39



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


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

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


-4
2017-11-25 11:56



В моем дистрибутиве нет инструмента настройки; какое распределение вы используете, у кого есть? - nickgrim
любая ОС, основанная на redhat, имеет инструмент настройки rhel / centos / fedora whar OS, который вы используете? - Riaan
Поскольку вопрос говорит о различиях между дистрибутивами на основе RHEL и Debian, мы должны предположить, что искатель использует оба. В дистрибутивах на Debian нет инструмента установки. - Martijn Heemels


Hm ... В хостах 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
2017-12-22 10:56





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

1.2.3.4 full.example.com full

Таким образом, пример может понравиться:

[External IP] rizzo.example.com rizzo 

-4
2018-04-05 07:23



На этот вопрос уже есть действительно качественные ответы. Это не добавляет ничего нового. - Esa Jokinen