Vraag De hostnaam instellen: FQDN of korte naam?


Ik heb gemerkt dat de "voorkeursmethode" voor het instellen van de hostnaam van het systeem fundamenteel verschilt tussen Red Hat / CentOS en Debian / Ubuntu-systemen.

CentOS-documentatie en de RHEL-implementatiegids zeg de hostnaam zou de FQDN moeten zijn:

HOSTNAME=<value>, waar <value> moet het Fully Qualified Domain zijn   Naam (FQDN), zoals hostname.example.com, maar kan wat dan ook zijn   hostnaam is noodzakelijk.

De RHEL installatiehandleiding is iets meer dubbelzinnig:

Setup vraagt ​​u om een ​​hostnaam voor deze computer op te geven, als een    volledig gekwalificeerde domein naam (FQDN) in het formaat hostnaam.domeinnaam   of als een korte hostnaam in het formaat hostname.

De Debian-referentie zegt de hostnaam zou de FQDN niet moeten gebruiken:

3.5.5. De hostnaam

De kernel onderhoudt het systeem hostname. Het init-script op runlevel   S met de aanduiding ''/etc/init.d/hostname.sh"stelt het systeem in   hostnaam tijdens het opstarten (met behulp van de hostname opdracht) naar de opgeslagen naam   in "/ Etc / hostnaam". Dit bestand zou moeten bevatten enkel en alleen de systeemhostnaam,   geen volledig gekwalificeerde domeinnaam.

Ik heb geen specifieke aanbevelingen van IBM gezien over welke te gebruiken, maar wat software lijkt een voorkeur te hebben.

Mijn vragen:

  • Is het in een heterogene omgeving beter om de leveranciersaanbeveling te gebruiken, of er een te kiezen en consistent te zijn tussen alle hosts?
  • Welke software is u tegengekomen die gevoelig is voor het feit of de hostnaam is ingesteld op de FQDN of de korte naam?

164
2017-11-17 13:07


oorsprong




antwoorden:


Ik zou kiezen voor een consistente aanpak in de hele omgeving. Beide oplossingen werken prima en blijven compatibel met de meeste toepassingen. Er is echter een verschil in beheersbaarheid.

Ik gebruik de korte naam als de HOSTNAME-instelling en stel de FQDN in als de eerste kolom in /etc/hosts voor het IP-adres van de server, gevolgd door de korte naam.

Ik ben niet veel softwarepakketten tegengekomen die een voorkeur tussen beide afdwingen of weergeven. Ik vind de korte naam schoner voor sommige toepassingen, met name logboekregistratie. Misschien heb ik pech gehad bij het zien van interne domeinen zoals server.northside.chicago.rizzomanufacturing.com. Wie wil dat zien in de logs of een shell prompt?

Soms ben ik betrokken bij bedrijfsaankoop of herstructurering waar interne domeinen en / of subdomeinen veranderen. Ik gebruik graag de korte hostnaam in deze gevallen omdat loggen, kickstarten, afdrukken, systeemmonitoring enz. Geen volledige herconfiguratie nodig hebben om rekening te houden met de nieuwe domeinnamen.

Een typische RHEL / CentOS-serverconfiguratie voor een server met de naam "rizzo" met intern domein "ifp.com", ziet er als volgt uit:

/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'

96
2017-11-17 13:20



Net als jij, geef ik de voorkeur aan de korte naam, maar ik heb onlangs ontdekt dat sommige Oracle-applicaties de uitvoer vereisen hostname om de FQDN te zijn. Ik heb het gewoon binnen /etc/hosts is niet goed genoeg Dat klopte met mijn consistentie. - James O'Gorman
Het verschil in hoofdlettergebruik van de hostnamen in dit voorbeeld is zeker geen best practice ref: tools.ietf.org/search/rfc1178 - teknopaul
moet niet /etc/sysconfig/network bevatten regels zoals: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example ? - Jasmine Lognnes
@JasmineLognnes Klopt, ik heb het gecorrigeerd. Ik hoop dat het ewwhite niet erg vindt. - kubanczyk
Het gaat niet alleen om de voorkeur. Zien hostname(1) op elke Linux-machine.


Vrijwel alle software is gevoelig voor het correct instellen van de hostnaam. Toen ik bij Digg aan het werk was, bracht ik de hele site ooit 2 uur lang naar beneden vanwege een schijnbaar onschuldige verandering in /etc/hostsdie van invloed is op het begrip 'hostnaam' van het systeem. Loop voorzichtig. Dat gezegd hebbende, kun je hier enigszins in de war raken. Ik denk niet dat het HOSTNAME= instelling is direct gelijk aan hoe Debian-gebaseerde distributies gebruiken /etc/hostname.

Wat voor mij werkt in een heterogene omgeving is:

  1. Stel de hostnaam in op een door de leverancier aanbevolen manier, met behulp van een voorwaarde in uw configuratiebeheersoftware.
  2. Gebruik de hostname commando om de hostnaam in te stellen gebruikt door de kernel, etc.
  3. In /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Deze configuratie heeft me nog niet gefaald.


36
2017-11-21 18:48



Dit is vrijwel de setup die ik op het werk gebruik. De korte naam zou in orde moeten zijn zolang de domeinnaam zich in het DNA-zoekpad bevindt (/etc/resolv.conf) voor de relevante machines in uw omgeving - gWaldo
adviseer je specifiek een IP-adres van een lokaal netwerk in plaats van een openbaar IP-adres? - code_monk


U zult zeker geen probleem hebben om online referenties te vinden die u zullen vertellen om het zeker op een of andere manier te doen. Het lijkt me echter dat het hebben van een korte naam als de hostnaam en de volledig gekwalificeerde naam in / etc / hosts zeker veel vaker voorkomt. Het lijkt de verstandigere manier, omdat dan diensten die een volledig gekwalificeerde naam nodig hebben kunnen worden aangepast om te bellen hostname --fqdn in plaats daarvan.

Ik ben recentelijk maar één stukje software tegengekomen dat een fqdn vereist om geretourneerd te worden hostname, wat ganeti was. Ze documenteren dit hier. Ik zie geen reden waarom ze zich niet kunnen aanpassen hostname --fqdnechter.


29
2017-12-15 14:45



Bonus voor het geven van een voorbeeld! Bedankt. - Cakemox
"Ik zie geen enkele reden waarom ze zich niet kunnen aanpassen hostname --fqdn"wordt beantwoord in de eerste alinea onder" Waarom een ​​volledig gekwalificeerde hostnaam "- het vereist giswerk en vereist een werkende resolver. Het vragen van de kernel is de veiligste en meest betrouwbare optie. - womble♦
@womble - Zolang het bestand / etc / hosts een vermelding voor de machine heeft (10.0.0.1 hostname.example.com hostname) en /etc/nsswitch.conf specificeert de lokale resolutie voor DNS (hosts: files dns) dan wordt een werkende resolver uitgevoerd door het lokale hosts-bestand. Als zodanig bevat dat argument voor het gebruik van een FQDN in plaats van een hostnaam zelden water. Ook een ander voorbeeld van software die rigide vereist hostname om een ​​FQDN terug te sturen is het Zimbra mailserverpakket. - crashmaxed
@crashmaxed: Dat zijn verschillende extra vereisten, die mogelijk niet in een bepaalde omgeving mogelijk zijn of per ongeluk zijn verknoeid. Het hebben van de FQDN in de kerneldatastructuren is veel eenvoudiger. - womble♦


Enigszins tangentieel, tijdens het onderzoeken van deze vraag, ben ik gek genoeg gegaan om de broncode van "hostname" te controleren en een script te schrijven om onderzoeksresultaten af ​​te drukken (Fedora 19). Wat ontbreekt is een blik op "/ etc / hosts", die naar mijn bescheiden mening in de eerste plaats uit dit alles moet worden gehouden.

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

De uitvoer op een Amazon EC2 VM met Fedora 19, na het handmatig instellen van de kernelwaarden en het vullen /etc/hostname, maar zonder wijzigingen aan /etc/hosts kan dan zo zijn:

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

De veerkrachtige manier om de volledig gekwalificeerde hostnaam in perl te krijgen, zou dan zijn:

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

en in bash zou het zijn:

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
}

Notes 

Opmerking 1: HOSTNAME is een shell-variabele die bash biedt ("Automatisch ingesteld op de naam van de huidige host.") Maar er is geen indicatie dat bash op die waarde komt.

Opmerking 2: vergeet / etc / hostname in /boot/initrams-FOO.img ...


10
2017-10-03 11:39



Sorry als dit duidelijk zou moeten zijn, maar wat heeft dit te maken met het instellen van de hostnaam? - Chris S
Kort gezegd notities die ik maakte tijdens het onderzoeken van het instellen van de hostnaam op mijn Fedora 19 EC2-instanties. Wat het resultaat betreft: 1) Stel FQHN in / etc / hostname 2) Raak / etc / hosts niet aan 3) U kunt de 'kernelhostnaam' instellen op de FQHN of de niet-gekwalificeerde hostnaam, als de waarde wordt uitgeschakeld van / etc / hostname 4) Je kunt de 'kerneldomeinnaam' instellen op de domeinnaam, wat leuker is dan alleen '(geen)'. - David Tonhofer


De / etc / hosts-opties werken goed.

Maar als u zeker wilt weten dat alle juiste bestanden zijn bijgewerkt, voert u de opstelling gereedschap


-4
2017-11-25 11:56



Mijn distributie heeft geen "setup" -hulpprogramma; welke distributie gebruikt u die heeft die? - nickgrim
elk op redhat gebaseerd OS heeft de setup-tool rhel / centos / fedora whar OS gebruik je? - Riaan
Omdat de vraag spreekt over verschillen tussen RHEL-gebaseerde en op Debian gebaseerde distributies, moeten we aannemen dat de vrager beide gebruikt. Er is geen 'setup'-tool op Debian-gebaseerde distributies. - Martijn Heemels


Hm ... In de linux-hosts, als je HOSTNAME en FQDN wilt wijzigen, zou je 3 stappen moeten oplossen (bijvoorbeeld, nieuwe host is rizzo.ifp.com):

Stap 1 HOST-waarde wijzigen in de configuratie-eigenschappen van NETWORK:

sudo vi /etc/sysconfig/network

Wijzig of voeg een tekenreeks toe:

HOSTNAME=rizzo.ifp.com

Stap 2 Bewerk je hosts-configuratie

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

Stap 3 Start je host opnieuw op Goed gedaan, controleer gewoon de nieuwe configuratie

[rizzo@rizzo]# hostname -f
rizzo.ifp.com

-4
2017-12-22 10:56





De volgorde klopt niet. Het moet zo zijn:

1.2.3.4 full.example.com full

Dus het voorbeeld kan dit leuk vinden:

[External IP] rizzo.example.com rizzo 

-4
2018-04-05 07:23



Deze vraag heeft al hele goede antwoorden. Dit voegt niets nieuws toe. - Esa Jokinen