ホスト名の設定:FQDNまたは短縮名?


178

システムのホスト名を設定する「好ましい」方法は、Red Hat / CentOSシステムとDebian / Ubuntuシステムでは根本的に異なることに気付きました。

CentOSのドキュメントRHELデプロイメントガイドには、ホスト名はFQDNである必要があると書かれています

HOSTNAME=<value>、はなど<value>の完全修飾ドメイン名(FQDN)でhostname.example.comある必要がありますが、必要なホスト名であれば何でもかまいません。

RHELインストールガイドは、少しあいまいです。

セットアップは、のいずれかと、このコンピュータのホスト名を指定するように求められます 、完全修飾ドメイン名(FQDN)形式でホスト名、ドメイン名 またはフォーマットで短いホスト名としてホスト名

Debianのリファレンスでは、ホスト名にFQDNを使用しないでください

3.5.5。ホスト名

カーネルはシステムのホスト名を維持します。「/etc/init.d/hostname.sh」にシンボリックリンクされているランレベルSのinitスクリプトは、ブート時のシステムホスト名(hostnameコマンドを使用)を「/ etc / hostname」に保存されている名前に設定します。このファイルには、完全修飾ドメイン名ではなく、システムのホスト名のみを含める必要があります。

IBMから使用する特定の推奨事項を見たことはありませんが、一部のソフトウェアには好みがあるようです。

私の質問:

  • 異機種混在環境では、ベンダーの推奨事項を使用するか、いずれかを選択してすべてのホストで一貫性を保つ方がよいでしょうか?
  • ホスト名がFQDNに設定されているか短い名前に設定されているかに敏感な、どのソフトウェアに遭遇しましたか?

回答:


106

環境全体で一貫したアプローチを選択します。どちらのソリューションも正常に機能し、ほとんどのアプリケーションと互換性があります。ただし、管理性には違いがあります。

HOSTNAME設定として短縮名を/etc/hosts使用し、サーバーのIPの最初の列としてFQDNを設定し、その後に短縮名を続けます。

私は、2つの間の設定を強制または表示する多くのソフトウェアパッケージに遭遇していません。一部のアプリケーション、特にロギングでは、短縮名がよりクリーンであることがわかりました。たぶん、のような内部ドメインを見ることに不運だったかもしれませんserver.northside.chicago.rizzomanufacturing.com。誰がログやシェルプロンプトでそれを見たいですか?

時々、会社の買収や、内部ドメインやサブドメインが変更される再編に関与しています。ロギング、キックスタート、印刷、システム監視などが新しいドメイン名に対応するために完全な再構成を必要としないため、これらの場合に短いホスト名を使用するのが好きです。

内部ドメイン「ifp.com」を持つ「rizzo」という名前のサーバーの一般的なRHEL / CentOSサーバーのセットアップは、次のようになります。

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

7
あなたと同じように、私は短い名前を好みますが、最近、一部のOracleアプリケーションがhostnameFQDNの出力を必要とすることを発見しました。持っているだけで/etc/hostsは十分ではありません。それは私の一貫性を台無しにしました。
ジェームズオゴーマン

3
この例のホスト名の大文字小文字の違いは、ベストプラクティスではありません。ref
teknopaul

2
ならない/etc/sysconfig/networkような行が含まれていますかNETWORKING=yesNETWORKING_IPV6=noHOSTNAME=example.comNISDOMAIN=example
ジャスミンローニュ

@JasmineLognnes右、私はそれを修正しました。ewwhiteが気にしないことを願っています。
クバンチク

1
好みだけではありません。hostname(1)任意のLinuxマシンで参照してください。

39

ほとんどすべてのソフトウェアは、ホスト名を正しく設定することに敏感です。Diggで働いていたときに/etc/hosts、システムのホスト名の概念に影響を与えたように見える無害な変更を行ったため、サイト全体を2時間ダウンさせました。軽く踏む。とはいえ、ここで少し混乱するかもしれません。このHOSTNAME=設定は、Debianベースのディストリビューションが使用する方法と直接同等ではないと思います/etc/hostname

異機種混在環境で私に役立つのは次のとおりです。

  1. 構成管理ソフトウェアの条件を使用して、ベンダー推奨の方法でホスト名を設定します。
  2. 使用hostnameなど、カーネルが使用するホスト名を設定するコマンドを
  3. /etc/hosts

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

この構成はまだ失敗していません。


これは、私が職場で使用するセットアップとほぼ同じです。短縮名は限りドメイン名は、ご使用の環境内の関連する機械のためのDNAの検索パス(/etc/resolv.confの)であるとして問題ないはずです
gWaldo

パブリックIPではなくローカルネットワークIPを具体的に推奨していますか?
code_monk

34

あなたは確かにオンラインで参照を見つけることに問題はありません。ただし、ホスト名として短い名前を使用し、/ etc / hostsに完全修飾名を使用する方が確実に普及しているようです。完全修飾名を必要とするサービスは、hostname --fqdn代わりに呼び出すように適合させることができるため、より賢明な方法のようです。

最近、fqdnを厳密に返す必要があるソフトウェアが1つしかhostname見つかりませんでした。これはganetiでした。彼らはこれをここに記録しますhostname --fqdnただし、彼らがに適応できない理由は見当たりません。


「彼らが適応できない理由がわからないhostname --fqdn」は、「完全修飾ホスト名」の最初の段落で回答されています。推測が必要であり、リゾルバが必要です。カーネルへの問い合わせは、最も安全で信頼性の高いオプションです。
ウォンブル

3
@womble-/ etc / hostsファイルにマシンのエントリ(10.0.0.1 hostname.example.com hostname)があり、/etc/ nsswitch.confがDNS(hosts: files dns)の前にローカル解決を指定している場合は、ローカルホストファイルによってリゾルバが機能します。そのため、ホスト名の代わりにFQDNを使用するための引数に水が含まれることはめったにありません。また、hostnameFQDN を厳密に返す必要があるソフトウェアの別の例は、Zimbraメールサーバーパッケージです。
クラッシュマックス14

@crashmaxed:それはいくつかの追加の要件であり、そのいずれも特定の環境では不可能であるか、誤って間違っている可能性があります。カーネルデータ構造にFQDNを含める方がはるかに簡単です。
ウォンブル

11

やや接線的ですが、この質問を調査している間、私は「ホスト名」のソースコードを確認し、調査結果を出力するスクリプトを書くことに夢中になりました(Fedora 19)。欠けているのは、「/ etc / hosts」を見ることです。これは、私の控えめな意見では、そもそもこのすべてを地獄から守るべきです。

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

カーネル値を手動で設定してfillを実行した後、Fedora 19を実行しているAmazon EC2 VMの出力は、/etc/hostname変更なし/etc/hostsで次のようになります。

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

perlで完全修飾ホスト名を取得する復元力のある方法は次のとおりです。

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

そして、bashでは次のようになります:

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
}

ノート

注1:HOSTNAMEはbashが提供するシェル変数です(「現在のホストの名前に自動的に設定されます。」)が、bashがその値に到達したことを示すものはありません。

注2:/boot/initrams-FOO.imgの/ etc / hostnameを決して忘れないでください...


4
これが明らかな場合は申し訳ありませんが、これはホスト名の設定と何が関係していますか?
クリスS

基本的に、Fedora 19 EC2インスタンスのホスト名の設定を調査中に作成したメモです。結果に関して:1)/ etc / hostnameでFQHNを設定します2)/ etc / hostsに触れないでください/ etc / hostname 4)「カーネルドメイン名」をドメイン名に設定できます。これは「(なし)」よりも優れています。
デビッドトンホーファー

-4

/ etc / hostsオプションはうまく機能します。

ただし、すべての適切なファイルが更新されていることを確認して、セットアップツールを実行する必要があります。


私のディストリビューションには「セットアップ」ツールがありません。どのディストリビューションを使用していますか?
ニックグリム

RedhatベースのOSにはセットアップツールrhel / centos / fedora whar OSがありますか?
リアーン

3
この質問ではRHELベースのディストリビューションとDebianベースのディストリビューションの違いについて説明しているため、askerは両方を使用していると想定する必要があります。Debianベースのディストリビューションには「セットアップ」ツールはありません。
マーティンヒーメルス

-4

Hm ... Linuxホストで、HOSTNAMEとFQDNを変更する場合は、3つの手順を解決する必要があります(たとえば、新しいホストはrizzo.ifp.comです)。

ステップ#1 NETWORKプロパティ設定のHOST値を変更します。

sudo vi /etc/sysconfig/network

文字列を変更または追加します。

HOSTNAME=rizzo.ifp.com

ステップ#2ホスト設定の編集

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

ステップ#3ホストを再起動します

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

-4

順序は正しくありません。次のようにする必要があります。

1.2.3.4 full.example.com full

したがって、例は次のようになります。

[External IP] rizzo.example.com rizzo 

4
この質問にはすでに質の高い回答があります。これは新しいものを追加しません。
エサヨキネン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.