pengembangan-web-mp-pd.com

Mengatur nama host: FQDN atau nama pendek?

Saya telah memperhatikan bahwa metode "pilihan" pengaturan nama host sistem pada dasarnya berbeda antara sistem Red Hat/CentOS dan Debian/Ubuntu.

Dokumentasi CentOS dan panduan penerapan RHEL katakan nama host harus menjadi FQDN:

HOSTNAME=<value>, di mana <value> haruslah Nama Domain yang Sepenuhnya Memenuhi Syarat (FQDN), seperti hostname.example.com, tetapi dapat berupa nama host apa pun yang diperlukan.

The panduan pemasangan RHEL sedikit lebih ambigu:

Setup meminta Anda untuk memberikan nama Host untuk komputer ini, baik sebagai nama domain yang memenuhi syarat (FQDN) dalam format hostname.domainname atau sebagai Nama Host pendek dalam format nama host.

Referensi Debian mengatakan nama host tidak boleh menggunakan FQDN:

3.5.5. Nama inang

Kernel memelihara nama host sistem . Skrip init di runlevel S yang disinkronkan dengan "/etc/init.d/hostname.sh " mengatur nama host sistem pada saat boot (menggunakan nama host perintah) ke nama yang disimpan di "/etc/hostname " . File ini harus mengandung hanya nama host sistem, bukan nama domain yang sepenuhnya memenuhi syarat.

Saya belum melihat rekomendasi khusus dari IBM tentang yang harus digunakan, tetapi beberapa perangkat lunak tampaknya memiliki preferensi.

Pertanyaan saya:

  • Dalam lingkungan yang heterogen, apakah lebih baik menggunakan rekomendasi vendor, atau memilih satu dan konsisten di semua host?
  • Perangkat lunak apa yang Anda temui yang sensitif terhadap apakah nama host diatur ke FQDN atau nama pendek?
187
Cakemox

Saya akan memilih pendekatan yang konsisten di seluruh lingkungan. Kedua solusi berfungsi dengan baik dan akan tetap kompatibel dengan sebagian besar aplikasi. Namun, ada perbedaan dalam pengelolaan.

Saya menggunakan nama pendek sebagai pengaturan HOSTNAME, dan menetapkan FQDN sebagai kolom pertama di /etc/hosts untuk IP server, diikuti dengan nama pendek.

Saya belum menemukan banyak paket perangkat lunak yang menegakkan atau menampilkan preferensi di antara keduanya. Saya menemukan nama pendek lebih bersih untuk beberapa aplikasi, khususnya pencatatan. Mungkin saya kurang beruntung dalam melihat domain internal seperti server.northside.chicago.rizzomanufacturing.com. Siapa yang ingin melihatnya di log atau Shell Prompt?

Terkadang, saya terlibat dalam akuisisi atau restrukturisasi perusahaan tempat domain internal dan/atau subdomain berubah. Saya suka menggunakan nama host pendek dalam kasus ini karena pencatatan, kickstart, pencetakan, pemantauan sistem, dll. Tidak perlu konfigurasi ulang penuh untuk memperhitungkan nama domain baru.

Pengaturan server RHEL/CentOS untuk server bernama "rizzo" dengan domain internal "ifp.com", akan terlihat seperti:

/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

-

[[email protected] ~]# 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'
110
ewwhite

Hampir semua perangkat lunak sensitif untuk mengatur hostname dengan benar. Ketika saya bekerja di Digg, saya pernah menjatuhkan seluruh situs selama 2 jam karena membuat perubahan yang tampaknya tidak bersalah dalam /etc/hosts yang memengaruhi gagasan sistem tentang nama host. Tapak dengan ringan. Yang mengatakan, Anda mungkin sedikit bingung di sini. Saya tidak berpikir HOSTNAME= pengaturan secara langsung setara dengan bagaimana distribusi berbasis Debian menggunakan /etc/hostname.

Apa yang bekerja untuk saya di lingkungan yang heterogen adalah:

  1. Tetapkan nama host dengan cara yang disarankan vendor, menggunakan persyaratan dalam perangkat lunak manajemen konfigurasi Anda.
  2. Gunakan perintah hostname untuk mengatur nama host yang digunakan oleh kernel, dll.
  3. Di /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Konfigurasi ini belum mengecewakan saya.

39
Paul Lathrop

Anda tentu tidak akan kesulitan menemukan referensi online yang akan memberitahu Anda untuk melakukannya dengan cara tertentu. Namun bagi saya tampaknya memiliki nama pendek sebagai nama host, dan memiliki nama yang sepenuhnya memenuhi syarat di/etc/hosts tentu jauh lebih lazim. Sepertinya cara yang lebih masuk akal, karena layanan yang membutuhkan nama yang memenuhi syarat dapat diadaptasi untuk menelepon hostname --fqdn sebagai gantinya.

Saya hanya menemukan satu perangkat lunak baru-baru ini yang secara kaku membutuhkan fqdn untuk dikembalikan oleh hostname, yang merupakan Ganeti. Mereka mendokumentasikan ini di sini . Saya tidak melihat alasan mereka tidak bisa beradaptasi dengan hostname --fqdn Namun.

36
stew

Agak aneh, saat meneliti pertanyaan ini, saya sudah cukup gila untuk memeriksa kode sumber "hostname" dan menulis naskah untuk mencetak hasil investigasi (Fedora 19). Apa yang hilang adalah melihat "/ etc/hosts", yang menurut pendapat saya yang sederhana harus dijauhkan dari semua ini di tempat pertama.

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

Output pada Amazon EC2 VM menjalankan Fedora 19, setelah secara manual mengatur nilai-nilai kernel dan mengisi /etc/hostname, tetapi tanpa perubahan ke /etc/hosts lalu mungkin seperti ini:

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

Cara tangguh untuk mendapatkan nama host yang sepenuhnya memenuhi syarat di Perl kemudian adalah:

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

dan dalam bash itu akan menjadi:

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
}

Catatan

Catatan 1: HOSTNAME adalah variabel Shell yang disediakan bash ("Diatur secara otomatis ke nama Host saat ini.") Tetapi tidak ada indikasi tentang bash yang tiba pada nilai itu.

Catatan 2: Jangan pernah lupa/etc/hostname di /boot/initrams-FOO.img ...

13
David Tonhofer