Pertanyaan Mengatur nama host: FQDN atau nama pendek?


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

Dokumentasi CentOS dan Panduan penyebaran RHEL katakan nama host harus menjadi FQDN:

HOSTNAME=<value>, dimana <value> harus menjadi Domain Sepenuhnya Berkualitas   Nama (FQDN), seperti hostname.example.com, tapi bisa apa saja   nama host diperlukan.

Itu Panduan pemasangan RHEL sedikit lebih ambigu:

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

Referensi Debian kata nama host tidak boleh menggunakan FQDN:

3.5.5. Nama host

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

Saya belum melihat rekomendasi khusus dari IBM yang akan 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 peka terhadap apakah nama host disetel ke FQDN atau nama pendek?

164
2017-11-17 13:07






Jawaban:


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 hal pengelolaan.

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

Saya belum menemukan banyak paket perangkat lunak yang menegakkan atau menampilkan preferensi di antara keduanya. Saya menemukan nama pendek untuk menjadi lebih bersih untuk beberapa aplikasi, khususnya penebangan. Mungkin aku tidak beruntung melihat domain internal seperti server.northside.chicago.rizzomanufacturing.com. Siapa yang ingin melihat itu di log atau shell prompt?

Terkadang, saya terlibat dalam akuisisi atau restrukturisasi perusahaan di mana domain internal dan / atau subdomain berubah. Saya suka menggunakan nama host pendek dalam kasus-kasus ini karena logging, kickstarts, pencetakan, pemantauan sistem, dll tidak perlu rekonfigurasi 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'

96
2017-11-17 13:20



Seperti Anda, saya lebih suka nama pendek, namun saya menemukan baru-baru ini bahwa beberapa aplikasi Oracle memerlukan output hostname menjadi FQDN. Masuk saja /etc/hosts tidak cukup bagus. Itu mengacaukan konsistensi saya. - James O'Gorman
Perbedaan kapitalisasi hostname dalam contoh ini tentu saja bukan praktik terbaik ref: tools.ietf.org/search/rfc1178 - teknopaul
Tidak seharusnya /etc/sysconfig/network mengandung garis seperti: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example ? - Jasmine Lognnes
@ MelatiLognnes Benar, saya sudah mengoreksinya. Saya harap ewwhite tidak keberatan. - kubanczyk
Ini bukan hanya tentang preferensi. Lihat hostname(1) pada semua mesin Linux.


Hampir semua perangkat lunak sensitif untuk mengatur nama host dengan benar. Ketika saya bekerja di Digg saya pernah membawa seluruh situs turun selama 2 jam karena membuat perubahan yang tampaknya tidak bersalah /etc/hostsyang mempengaruhi gagasan sistem hostname. Tap dengan ringan. Bisa dikatakan, Anda mungkin sedikit bingung di sini. Saya tidak berpikir itu HOSTNAME= pengaturan secara langsung setara dengan bagaimana distribusi berbasis Debian digunakan /etc/hostname.

Apa yang berhasil bagi saya dalam lingkungan yang heterogen adalah:

  1. Atur nama host dengan cara yang direkomendasikan vendor, menggunakan kondisional dalam perangkat lunak manajemen konfigurasi Anda.
  2. Menggunakan hostname perintah 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.


36
2017-11-21 18:48



Ini cukup banyak pengaturan yang saya gunakan di tempat kerja. Nama pendek harus baik-baik saja selama nama domain ada di jalur pencarian DNA (/etc/resolv.conf) untuk mesin yang relevan di lingkungan Anda - gWaldo
Anda secara khusus merekomendasikan IP jaringan lokal sebagai lawan dari IP publik? - code_monk


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

Saya baru saja menemukan satu perangkat lunak baru-baru ini yang secara kaku membutuhkan fqdn untuk dikembalikan hostname, yang merupakan ganeti. Mereka mendokumentasikan ini sini. Saya tidak melihat alasan apa pun yang tidak bisa mereka adaptasikan hostname --fqdn, bagaimanapun.


29
2017-12-15 14:45



Bonus untuk memberikan contoh! Terima kasih. - Cakemox
"Saya tidak melihat alasan mereka tidak bisa beradaptasi hostname --fqdn"dijawab di paragraf pertama di bawah" Mengapa nama host yang memenuhi syarat "- memerlukan tebakan, dan memerlukan penyelesai yang berfungsi. Meminta kernel adalah opsi yang paling aman dan paling dapat diandalkan. - womble♦
@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) kemudian memiliki resolver yang berfungsi dipenuhi oleh file host lokal. Dengan demikian argumen untuk menggunakan FQDN dan bukannya nama host jarang menampung air. Juga, contoh lain dari perangkat lunak yang secara kaku membutuhkan hostname untuk mengembalikan FQDN adalah paket server surat Zimbra. - crashmaxed
@crashmaxed: Itu beberapa persyaratan tambahan, yang mana mungkin tidak dimungkinkan di lingkungan tertentu atau disalahartikan oleh kesalahan. Memiliki FQDN dalam struktur data kernel jauh lebih sederhana. - womble♦


Agak tangensial, saat 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 pada "/ etc / hosts", yang menurut pendapat saya harus disimpan habis-habisan 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 /etc/hosts mungkin kemudian menjadi 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 memenuhi syarat dalam perl 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 di 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 ("Secara otomatis diatur ke nama host saat ini.") Tetapi tidak ada indikasi tentang bash tiba pada nilai tersebut.

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


10
2017-10-03 11:39



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 contoh Fedora 19 EC2 saya. Adapun hasilnya: 1) Atur FQHN di / etc / hostname 2) Jangan sentuh / etc / hosts 3) Anda dapat mengatur 'hostname kernel' baik ke 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


Opsi / etc / hosts berfungsi dengan baik.

Tetapi Anda ingin memastikan bahwa semua file yang tepat diperbarui menjalankan mempersiapkan alat


-4
2017-11-25 11:56



Distribusi saya tidak memiliki alat "penyetelan"; distribusi mana yang Anda gunakan yang memilikinya? - nickgrim
OS berbasis redhat mana saja yang memiliki alat setup rhel / centos / fedora whar OS yang Anda gunakan? - Riaan
Karena pertanyaan berbicara tentang perbedaan antara distro berbasis RHEL dan Debian, kita harus mengasumsikan bahwa penanya menggunakan keduanya. Tidak ada alat 'setup' pada distro berbasis Debian. - Martijn Heemels


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 di konfigurasi properti JARINGAN:

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, periksa saja konfigurasi baru

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

-4
2017-12-22 10:56





Pesanannya tidak benar. Itu harus:

1.2.3.4 full.example.com full

Jadi contohnya bisa seperti ini:

[External IP] rizzo.example.com rizzo 

-4
2018-04-05 07:23



Pertanyaan ini sudah benar-benar memiliki jawaban yang berkualitas. Ini tidak menambahkan sesuatu yang baru. - Esa Jokinen