Mengatur nama host: FQDN atau nama pendek?

178

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 penyebaran RHEL mengatakan bahwa nama host haruslah FQDN :

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

The RHEL panduan menginstal 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 bahwa nama host tidak boleh menggunakan FQDN :

3.5.5. Nama inang

Kernel mempertahankan nama host sistem . Skrip init di runlevel S yang disinkronkan dengan " /etc/init.d/hostname.sh " menetapkan nama host sistem saat boot (menggunakan perintah hostname ) ke nama yang disimpan dalam " / etc / hostname ". File ini hanya boleh berisi 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?
Cakemox
sumber

Jawaban:

106

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 mengatur FQDN sebagai kolom pertama /etc/hostsuntuk 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 melihat itu di log atau prompt shell ?

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

-

[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'
putih
sumber
7
Seperti Anda, saya lebih suka nama pendeknya, namun saya baru-baru ini menemukan bahwa beberapa aplikasi Oracle memerlukan output hostnamemenjadi FQDN. Hanya memilikinya /etc/hoststidak cukup baik. Itu mengacaukan konsistensi saya.
James O'Gorman
3
Perbedaan kapitalisasi nama host dalam contoh ini jelas bukan praktik terbaik ref: tools.ietf.org/search/rfc1178
teknopaul
2
Sebaiknya tidak /etc/sysconfig/networkmengandung baris seperti: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example?
Jasmine Lognnes
@JasmineLognnes Benar, saya sudah memperbaikinya. Saya harap putih tidak keberatan.
kubanczyk
1
Ini bukan hanya tentang preferensi. Lihat hostname(1)di mesin Linux apa pun.
39

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

Apa yang bekerja untuk saya di lingkungan yang heterogen adalah:

  1. Tetapkan nama host dengan cara yang disarankan vendor, menggunakan persyaratan pada perangkat lunak manajemen konfigurasi Anda.
  2. Gunakan hostnameperintah 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.

Paul Lathrop
sumber
Ini cukup banyak pengaturan yang saya gunakan di tempat kerja. Nama pendek harus baik-baik saja asalkan nama domain ada di jalur pencarian DNA (/etc/resolv.conf) untuk mesin yang relevan di lingkungan Anda
gWaldo
apakah Anda secara khusus merekomendasikan IP jaringan lokal dan bukan IP publik?
code_monk
34

Anda tentu tidak akan kesulitan menemukan referensi online yang akan memberitahu Anda untuk melakukannya dengan satu atau lain cara. 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 --fqdnsaja.

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

rebus
sumber
"Saya tidak melihat alasan mereka tidak dapat beradaptasi dengan hostname --fqdn" dijawab dalam paragraf pertama di bawah "Mengapa nama host yang sepenuhnya memenuhi syarat" - itu membutuhkan menebak, dan membutuhkan resolver yang berfungsi. Meminta kernel adalah opsi paling aman dan paling dapat diandalkan.
womble
3
@womble - Selama file / etc / hosts memiliki entri untuk mesin ( 10.0.0.1 hostname.example.com hostname) dan /etc/nsswitch.conf menentukan resolusi lokal sebelum DNS ( hosts: files dns) maka resolver yang berfungsi dipenuhi oleh file host lokal. Karena itu argumen untuk menggunakan FQDN sebagai ganti hostname jarang mengandung air. Juga, contoh lain dari perangkat lunak yang secara kaku mengharuskan hostnameuntuk mengembalikan FQDN adalah paket server surat Zimbra.
crashmaxed
@ crashmaxed: Itu beberapa persyaratan tambahan, yang salah satunya mungkin tidak dapat dilakukan dalam lingkungan tertentu atau dikacaukan oleh kesalahan. Memiliki FQDN dalam struktur data kernel jauh lebih sederhana.
womble
11

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

#!/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 VM Amazon EC2 yang menjalankan Fedora 19 , setelah secara manual mengatur nilai-nilai dan pengisian kernel /etc/hostname, tetapi tanpa perubahan /etc/hostsmungkin akan 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 oleh bash ("Secara otomatis disetel 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 ...

David Tonhofer
sumber
4
Maaf jika ini harus jelas, tetapi apa hubungannya dengan pengaturan nama host?
Chris S
Pada dasarnya catatan yang saya buat saat meneliti pengaturan nama host pada instance Fedora 19 EC2 saya. Adapun hasilnya: 1) Atur FQHN di / etc / hostname 2) Jangan sentuh / etc / hosts 3) Anda dapat mengatur 'hostname kernel' menjadi FQHN atau nama host yang tidak memenuhi syarat, jika tidak disetel nilainya diambil dari / etc / hostname 4) Anda dapat mengatur 'nama domain kernel' ke nama domain, yang lebih bagus daripada hanya '(tidak ada)'.
David Tonhofer
-4

Opsi / etc / hosts bekerja dengan baik.

Tetapi Anda ingin memastikan bahwa semua file yang tepat diperbarui, jalankan alat pengaturan

Riaan
sumber
Distribusi saya tidak memiliki alat "setup"; distribusi mana yang Anda gunakan yang memiliki satu?
jamaah
OS apa redhat memiliki alat pengaturan rhel / centos / fedora OS yang Anda gunakan?
Riaan
3
Karena pertanyaan tersebut berbicara tentang perbedaan antara distro berbasis RHEL dan distro berbasis Debian, kita harus menganggap penanya menggunakan keduanya. Tidak ada alat 'setup' pada distro berbasis Debian.
Martijn Heemels
-4

Hm ... Di host linux, jika Anda ingin mengubah HOSTNAME dan FQDN, Anda harus menyelesaikan 3 langkah (misalnya, host baru adalah rizzo.ifp.com ):

Langkah # 1 Ubah nilai HOST dalam konfigurasi properti NETWORK:

sudo vi /etc/sysconfig/network

Ubah atau tambahkan string:

HOSTNAME=rizzo.ifp.com

Langkah # 2 Edit konfigurasi host Anda

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

Langkah # 3 Reboot host Anda Bagus sekali, cukup periksa konfigurasi baru

[rizzo@rizzo]# hostname -f
rizzo.ifp.com
sub
sumber
-4

Perintahnya tidak benar. Itu harus:

1.2.3.4 full.example.com full

Jadi contohnya bisa seperti ini:

[External IP] rizzo.example.com rizzo 
Christian Azuero
sumber
4
Pertanyaan ini sudah memiliki jawaban yang benar-benar berkualitas. Ini tidak menambahkan sesuatu yang baru.
Esa Jokinen