Ustawianie nazwy hosta: FQDN lub krótka nazwa?

178

Zauważyłem, że „preferowana” metoda ustawiania systemowej nazwy hosta zasadniczo różni się między systemami Red Hat / CentOS i Debian / Ubuntu.

Dokumentacja CentOS i przewodnik wdrażania RHEL mówią, że nazwą hosta powinna być nazwa FQDN :

HOSTNAME=<value>, gdzie <value>powinna być w pełni kwalifikowana nazwa domeny (FQDN), np. hostname.example.com, ale może to być dowolna niezbędna nazwa hosta.

Instrukcja instalacji RHEL jest nieco bardziej niejednoznaczna:

Instalator monituje o podanie nazwy hosta dla tego komputera, jako w pełni kwalifikowaną nazwę domeny (FQDN) w formacie nazwa_hosta.domena lub jako krótka nazwa hosta w formacie nazwa hosta .

Odwołanie do Debiana mówi, że nazwa hosta nie powinna używać nazwy FQDN :

3.5.5 Nazwa hosta

Jądro zachowuje systemową nazwę hosta . Skrypt inicjujący na poziomie S, który jest dowiązaniem symbolicznym do „ /etc/init.d/hostname.sh ”, ustawia systemową nazwę hosta w czasie rozruchu (za pomocą komendy hostname ) na nazwę zapisaną w „ / etc / hostname ”. Ten plik powinien zawierać tylko nazwę hosta systemu, a nie w pełni kwalifikowaną nazwę domeny.

Nie widziałem żadnych konkretnych rekomendacji ze strony IBM, które należy stosować, ale niektóre programy wydają się mieć preferencje.

Moje pytania:

  • Czy w heterogenicznym środowisku lepiej jest skorzystać z zalecenia dostawcy, czy wybrać jedno i zachować spójność na wszystkich hostach?
  • Jakie napotkane oprogramowanie jest wrażliwe na to, czy nazwa hosta jest ustawiona na FQDN, czy na krótką nazwę?
Cakemox
źródło

Odpowiedzi:

106

Wybrałbym spójne podejście w całym środowisku. Oba rozwiązania działają dobrze i pozostaną kompatybilne z większością aplikacji. Istnieje jednak różnica w zarządzaniu.

Używam krótkiej nazwy jako ustawienia HOSTNAME i ustawiam FQDN jako pierwszą kolumnę /etc/hostsadresu IP serwera, a następnie krótką nazwę.

Nie spotkałem wielu pakietów oprogramowania, które wymuszają lub wyświetlają preferencje między nimi. Uważam, że ta krótka nazwa jest czystsza w przypadku niektórych aplikacji, w szczególności logowania. Może miałem pecha, widząc takie domeny wewnętrzne server.northside.chicago.rizzomanufacturing.com. Kto chce to zobaczyć w logach lub poleceniu powłoki ?

Czasami biorę udział w przejęciach lub restrukturyzacji firm, w których zmieniają się domeny wewnętrzne i / lub poddomeny. W takich przypadkach lubię używać krótkiej nazwy hosta, ponieważ logowanie, uruchamianie, drukowanie, monitorowanie systemów itp. Nie wymagają pełnej rekonfiguracji, aby uwzględnić nowe nazwy domen.

Typowa konfiguracja serwera RHEL / CentOS dla serwera o nazwie „rizzo” z domeną wewnętrzną „ifp.com” wygląda następująco:

/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
źródło
7
Podobnie jak ty, wolę tę krótką nazwę, jednak niedawno odkryłem, że niektóre aplikacje Oracle wymagają danych wyjściowych hostnamejako FQDN. Samo posiadanie go /etc/hostsnie jest wystarczająco dobre. To pomieszało się z moją konsekwencją.
James O'Gorman,
3
Różnica wielkości liter w nazwach
teknopaul
2
Nie powinny /etc/sysconfig/networkzawierać linie takie jak: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example?
Jasmine Lognnes,
@JasmineLognnes Racja, poprawiłem to. Mam nadzieję, że ewwhite nie ma nic przeciwko.
kubanczyk
1
Nie chodzi tylko o preferencje. Zobacz hostname(1)na dowolnym komputerze z systemem Linux.
39

Prawie całe oprogramowanie jest wrażliwe na prawidłowe ustawienie nazwy hosta. Podczas pracy w Digg raz sprowadziłem całą witrynę na 2 godziny z powodu wprowadzenia pozornie niewinnej zmiany, /etc/hostsktóra wpłynęła na pojęcie nazwy hosta w systemie. Lekko stąpać. To powiedziawszy, możesz być nieco zdezorientowany. Nie sądzę, aby HOSTNAME=to ustawienie było bezpośrednio równoważne z wykorzystaniem dystrybucji opartych na Debianie /etc/hostname.

W heterogenicznym środowisku działa dla mnie:

  1. Ustaw nazwę hosta w sposób zalecany przez dostawcę, używając warunkowego oprogramowania do zarządzania konfiguracją.
  2. Użyj hostnamepolecenia, aby ustawić nazwę hosta używaną przez jądro itp.
  3. W /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Ta konfiguracja jeszcze mnie nie zawiodła.

Paul Lathrop
źródło
To właściwie konfiguracja, której używam w pracy. Skrócona nazwa powinna być poprawna, dopóki nazwa domeny znajduje się na ścieżce wyszukiwania DNA (/etc/resolv.conf) dla odpowiednich maszyn w twoim środowisku
gWaldo,
czy szczególnie polecasz adres IP sieci lokalnej, a nie publiczny?
code_monk
34

Z pewnością nie będziesz mieć problemu ze znalezieniem referencji online, które powiedzą ci, aby zdecydowanie zrobić to w ten czy inny sposób. Wydaje mi się jednak, że posiadanie krótkiej nazwy jako nazwy hosta i posiadanie pełnej nazwy w / etc / hosts jest zdecydowanie bardziej rozpowszechnione. Wydaje się to bardziej rozsądnym sposobem, ponieważ usługi, które wymagają w pełni kwalifikowanej nazwy, mogą zostać dostosowane do wywoływania hostname --fqdn.

Ostatnio spotkałem tylko jedno oprogramowanie, które sztywno wymaga zwrotu fqdn hostname, którym było ganeti. Dokumentują to tutaj . Nie widzę jednak żadnego powodu, dla którego nie mogliby się dostosować hostname --fqdn.

gulasz
źródło
„Nie widzę powodu, dla którego nie mogą się przystosować hostname --fqdn”, odpowiada pierwszy akapit w części „Dlaczego w pełni kwalifikowana nazwa hosta” - wymaga zgadywania i wymaga działającego resolvera. Pytanie o jądro jest najbezpieczniejszą i najbardziej niezawodną opcją.
womble
3
@womble - tak długo, jak plik / etc / hosts ma wpis dla machine ( 10.0.0.1 hostname.example.com hostname), a /etc/nsswitch.conf określa lokalną rozdzielczość przed DNS ( hosts: files dns), wtedy lokalny program tłumaczący spełnia działający resolver. Jako taki argument za użyciem nazwy FQDN zamiast nazwy hosta rzadko zawiera wodę. Innym przykładem oprogramowania, które sztywno wymaga hostnamezwrócenia nazwy FQDN, jest pakiet serwera poczty Zimbra.
crashmaxed
@crashmaxed: To kilka dodatkowych wymagań, z których każde może nie być możliwe w danym środowisku lub zostać pomylone. Posiadanie nazwy FQDN w strukturach danych jądra jest znacznie prostsze.
womble
11

Nieco stycznie, badając to pytanie, oszalałem na tyle, aby sprawdzić kod źródłowy „nazwa hosta” i napisać skrypt, aby wydrukować wyniki dochodzenia (Fedora 19). Brakuje tylko „/ etc / hosts”, które moim skromnym zdaniem powinny przede wszystkim trzymać się z daleka od tego wszystkiego.

#!/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"

Dane wyjściowe na maszynie wirtualnej Amazon EC2 z uruchomioną Fedorą 19 , po ręcznym ustawieniu wartości jądra i wypełnieniu /etc/hostname, ale bez żadnych zmian, /etc/hostsmoże wyglądać następująco:

== 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

Odporny sposób na uzyskanie w pełni kwalifikowanej nazwy hosta w perlu to:

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}"
      }
   }
}

i w skrócie byłoby to:

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
}

Notatki

Uwaga 1: HOSTNAME jest zmienną powłoki, którą udostępnia bash („Automatycznie ustawiane na nazwę bieżącego hosta.”), Ale nic nie wskazuje na to, że bash osiągnie tę wartość.

Uwaga 2: Nigdy nie zapomnij / etc / hostname w /boot/initrams-FOO.img ...

David Tonhofer
źródło
4
Przepraszam, jeśli to powinno być oczywiste, ale co to ma wspólnego z ustawieniem nazwy hosta?
Chris S
Zasadniczo notatki, które zrobiłem podczas badania ustawiania nazwy hosta w moich instancjach Fedory 19 EC2. Jeśli chodzi o wynik: 1) Ustaw FQHN w / etc / nazwa hosta 2) Nie dotykaj / etc / hosts 3) Możesz ustawić „nazwę hosta jądra” na FQHN lub na niekwalifikowaną nazwę hosta, jeśli nie jest ustawiona, wartość jest pobierana z / etc / hostname 4) Możesz ustawić „kernel domainname” na nazwę domeny, która jest ładniejsza niż tylko „(none)”.
David Tonhofer
-4

Opcje / etc / hosts działają dobrze.

Ale chcesz się upewnić, że wszystkie odpowiednie pliki zostały zaktualizowane, uruchom narzędzie instalacyjne

Riaan
źródło
Moja dystrybucja nie ma narzędzia „konfiguracji”; jakiej dystrybucji używasz, która ma taką?
nickgrim
czy jakikolwiek system operacyjny oparty na redhat ma narzędzie instalacyjne rhel / centos / fedora, którego używasz?
Riaan
3
Ponieważ pytanie mówi o różnicach między dystrybucjami opartymi na RHEL i Debianie, musimy założyć, że pytający używa obu. W dystrybucjach opartych na Debianie nie ma narzędzia do konfiguracji.
Martijn Heemels,
-4

Hm ... Jeśli chcesz zmienić HOSTNAME i FQDN na hostach z Linuksem, powinieneś rozwiązać 3 kroki (na przykład nowym hostem jest rizzo.ifp.com ):

Krok # 1 Zmień wartość HOST w konfiguracji właściwości NETWORK:

sudo vi /etc/sysconfig/network

Zmień lub dodaj ciąg:

HOSTNAME=rizzo.ifp.com

Krok # 2 Edytuj konfigurację hostów

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

Krok # 3 Uruchom ponownie hosta Dobra robota, po prostu sprawdź nową konfigurację

[rizzo@rizzo]# hostname -f
rizzo.ifp.com
pod
źródło
-4

Kolejność jest nieprawidłowa. To musi być:

1.2.3.4 full.example.com full

Przykład może wyglądać tak:

[External IP] rizzo.example.com rizzo 
Christian Azuero
źródło
4
To pytanie ma już naprawdę wysokiej jakości odpowiedzi. To nie dodaje nic nowego.
Esa Jokinen,