Встановлення імені хоста: FQDN або коротке ім'я?


178

Я помітив, що "кращий" метод встановлення імені хоста системи принципово відрізняється між системами Red Hat / CentOS та Debian / Ubuntu.

Документація CentOS та посібник з розгортання RHEL кажуть, що ім'ям хоста має бути FQDN :

HOSTNAME=<value>, де <value>має бути повністю кваліфіковане ім'я домену (FQDN), наприклад hostname.example.com, але може бути будь-яким ім'ям хоста.

Посібник із встановлення RHEL трохи більш неоднозначний:

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

Посилання Debian говорить, що ім'я хоста не повинно використовувати FQDN :

3.5.5. Ім'я хоста

Ядро підтримує ім'я хоста системи . Скрипт init у runlevel S, який посилається на " /etc/init.d/hostname.sh ", встановлює ім'я хоста системи під час завантаження (використовуючи команду ім'я хоста ) на ім'я, збережене в " / etc / ім'я хоста ". Цей файл повинен містити лише ім’я хоста системи, а не повноцінне доменне ім’я.

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

Мої запитання:

  • Чи краще в неоднорідному середовищі скористатися рекомендацією постачальника або вибрати її та бути послідовною для всіх хостів?
  • Яке програмне забезпечення ви зіткнулися, яке чутливе до того, чи ім'я хоста встановлено на FQDN або коротке ім'я?

Відповіді:


106

Я б вибрав послідовний підхід у всьому середовищі. Обидва рішення працюють чудово і залишатимуться сумісними з більшістю програм. Однак є різниця в керованості.

Я вказую коротке ім'я як налаштування HOSTNAME і встановлюю FQDN в якості першого стовпця /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'

7
Як і ви, я віддаю перевагу короткому імені, проте нещодавно я виявив, що для деяких програм Oracle потрібен вихід hostnameFQDN. Просто мати це /etc/hostsне досить добре. Це переплутало мою послідовність.
Джеймс О'Горман


2
Чи не повинен /etc/sysconfig/networkмістити такі рядки: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example?
Жасмін Лоньєс

@JasmineLognnes Правильно, я це виправив. Я сподіваюся, що ewwhite не проти.
kubanczyk

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 є запис для машини ( 10.0.0.1 hostname.example.com hostname) і /etc/nsswitch.conf вказує локальну роздільну здатність перед DNS ( hosts: files dns), тоді робочий вирішальник виконує локальний файл хостів. Як такий, що аргумент щодо використання FQDN замість імені хоста рідко містить воду. Крім того, ще одним прикладом програмного забезпечення, яке жорстко вимагає hostnameповернення FQDN, є пакет поштових серверів Zimbra.
аварійно-відключений

@crashmaxed: Це кілька додаткових вимог, будь-яка з яких може бути неможливою у певному середовищі або викручена помилково. Мати FQDN в структурах даних ядра набагато простіше.
живіт

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 VM під управлінням 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 / ім'я хоста в /boot/initrams-FOO.img ...


4
Вибачте, якщо це повинно бути очевидним, але що стосується будь-якого з цього набору імені хоста?
Chris S

В основному зауваження, які я робив під час дослідження встановлення імені хоста на моїх екземплярах Fedora 19 EC2. Що стосується результату: 1) Встановіть FQHN в / etc / hostname 2) Не торкайтеся / etc / hosts 3) Ви можете встановити 'ім'я хоста ядра' або FQHN, або некваліфіковане ім'я хоста, якщо невідоме значення взято з / тощо / ім'я хоста 4) Ви можете встановити "ім'я домену ядра" на ім'я домену, що приємніше, ніж просто "(немає)".
Девід Тонхофер

-4

Параметри / etc / hosts працює добре.

Але ви хочете переконатися, що всі належні файли оновлені, запустіть інструмент налаштування


У моєму дистрибутиві немає інструменту "налаштування"; який дистрибутив ви використовуєте, який має такий?
nickgrim

будь-яка ОС на основі Redhat має інструмент настройки rhel / centos / fedora для ОС, яку ви використовуєте?
Riaan

3
Оскільки питання говорить про відмінності між дистрибутивами на основі RHEL та Debian, ми повинні припустити, що запитувач використовує обидва. На дистрибутивах, що базуються на Debian, немає інструменту "налаштування".
Martijn Heemels

-4

Гм ... У Linux-хостах, якщо ви хочете змінити HOSTNAME та FQDN, вам слід вирішити 3 кроки (наприклад, новий хост - rizzo.ifp.com ):

Крок №1 Змініть значення HOST у конфігурації властивостей мережі:

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
На це питання вже є справді якісні відповіді. Це не додає нічого нового.
Еса Йокінен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.