호스트 이름 설정 : FQDN 또는 짧은 이름?


178

시스템 호스트 이름을 설정하는 "선호"방법이 Red Hat / CentOS와 Debian / Ubuntu 시스템간에 근본적으로 다르다는 것을 알았습니다.

CentOS 설명서RHEL 배포 가이드에 따르면 호스트 이름 은 FQDN이어야합니다 .

HOSTNAME=<value>, 여기서 <value>FQDN (정규화 된 도메인 이름) hostname.example.com이어야하지만 호스트 이름이 필요한 모든 것이 될 수 있습니다.

RHEL 설치 가이드는 약간 더 모호 :

설치 프로그램은이 같은 중,이 컴퓨터의 호스트 이름을 입력하라는 메시지가 정규화 된 도메인 이름 의 형식에서 (FQDN) 하며 hostname.domainname 또는 형식의 짧은 호스트 이름으로 호스트 이름 .

데비안 참조에 따르면 호스트 이름 은 FQDN을 사용해서는 안됩니다 .

3.5.5. 호스트 이름

커널은 시스템 호스트 이름을 유지합니다 . " /etc/init.d/hostname.sh "로 심볼릭 링크 된 실행 레벨 S의 init 스크립트는 부팅시 시스템 호스트 이름 ( hostname 명령 사용)을 " / etc / hostname "에 저장된 이름으로 설정합니다 . 이 파일에는 정규화 된 도메인 이름이 아닌 시스템 호스트 이름 포함해야합니다 .

사용할 IBM에 대한 특정 권장 사항을 보지 못했지만 일부 소프트웨어 는 선호하는 것 같습니다.

내 질문 :

  • 이기종 환경에서 공급 업체 권장 사항을 사용하거나 하나를 선택하고 모든 호스트에서 일관성을 유지하는 것이 더 낫습니까?
  • 호스트 이름이 FQDN 또는 짧은 이름으로 설정되어 있는지 여부에 민감한 소프트웨어는 무엇입니까?

답변:


106

전체 환경에서 일관된 접근 방식을 선택합니다. 두 솔루션 모두 제대로 작동하며 대부분의 응용 프로그램과 호환됩니다. 그러나 관리 효율성에는 차이가 있습니다.

짧은 이름을 HOSTNAME 설정으로 사용하고 FQDN을 /etc/hosts서버 IP 의 첫 번째 열로 설정 한 다음 짧은 이름을 설정합니다.

둘 사이에 기본 설정을 적용하거나 표시하는 소프트웨어 패키지가 많지 않았습니다. 일부 응용 프로그램, 특히 로깅에 대해서는 짧은 이름이 더 깨끗합니다. 어쩌면 나는 같은 내부 도메인을 보는 데 운이 없었을 것 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는 충분하지 않습니다. 그것은 내 일관성으로 엉망이되었습니다.
James O'Gorman

3
이 예제에서 호스트 이름의 대문자 차이는 반드시 모범 사례는 아닙니다. tools.ietf.org/search/rfc1178
teknopaul

2
/etc/sysconfig/network같은 행을 포함 : NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example?
Jasmine Lognnes 2014

@JasmineLognnes 맞습니다. 수정했습니다. ewwhite가 신경 쓰지 않기를 바랍니다.
kubanczyk

1
단지 선호에 관한 것이 아닙니다. hostname(1)모든 Linux 시스템에서 참조하십시오 .

39

거의 모든 소프트웨어가 호스트 이름을 올바르게 설정하는 데 민감합니다. Digg에서 일하는 동안 /etc/hosts시스템의 호스트 이름 개념에 영향을 미치는 무해한 변경으로 인해 전체 사이트를 2 시간 동안 중단했습니다 . 가볍게 밟습니다. 즉, 여기에 약간 혼란 스러울 수 있습니다. 이 HOSTNAME=설정이 데비안 기반 배포판이 사용하는 방식과 직접적으로 동일 하다고 생각하지 않습니다 /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대신 호출하도록 조정할 수 있으므로보다 합리적인 방법 인 것 같습니다 .

나는 최근에 하나의 소프트웨어 hostname를 발견했습니다. 그들은 이것을 여기에 문서화합니다 . hostname --fqdn그러나에 적응할 수없는 이유는 없습니다 .


"적응할 수없는 이유는 없습니다 hostname --fqdn"는 첫 번째 단락의 "정규화 된 호스트 이름 인 이유"아래에 답변되어 있습니다. 추측이 필요하고 해결 프로그램이 필요합니다. 커널을 요청하는 것이 가장 안전하고 신뢰할 수있는 옵션입니다.
womble

3
@womble-/ etc / hosts 파일에 시스템 항목 ( 10.0.0.1 hostname.example.com hostname)이 있고 /etc/nsswitch.conf가 DNS ( hosts: files dns) 보다 먼저 로컬 확인을 지정한 경우 로컬 호스트 파일이 작동하는 리졸버를 갖도록합니다. 따라서 호스트 이름 대신 FQDN을 사용한다는 주장에는 물이 거의 포함되지 않습니다. 또한 hostnameFQDN을 반환 해야하는 소프트웨어의 다른 예로 Zimbra 메일 서버 패키지가 있습니다.
crashmaxed

@ crashmaxed : 그것은 몇 가지 추가 요구 사항이며, 주어진 환경에서 불가능하거나 실수로 망쳐 놓을 수 있습니다. 커널 데이터 구조에 FQDN을 사용하는 것이 훨씬 간단합니다.
womble

11

이 질문을 조사하는 동안 "hostname"의 소스 코드를 확인하고 조사 결과를 인쇄하는 스크립트를 작성하기에 충분히 열중했습니다 (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"

커널 값을 수동으로 설정하고 채운 후 /etc/hostname변경 사항없이 Fedora 19를 실행하는 Amazon EC2 VM의 출력/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
이것이 분명해야한다면 미안하지만 호스트 이름 설정과 관련이 있습니까?
Chris S

기본적으로 Fedora 19 EC2 인스턴스에서 호스트 이름 설정을 조사하는 동안 작성한 메모입니다. 결과 : 1) / etc / hostname에 FQHN을 설정하십시오. 2) / etc / hosts를 만지지 마십시오. 3) 설정되지 않은 값을 가져 오면 'kernel hostname'을 FQHN 또는 규정되지 않은 호스트 이름으로 설정할 수 있습니다. / etc / hostname 4) 'kernel domainname'을 '(none)'보다 좋은 domainname으로 설정할 수 있습니다.
David Tonhofer

-4

/ etc / hosts 옵션이 잘 작동합니다.

그러나 모든 적절한 파일이 업데이트되도록 설정 도구를 실행하고 싶습니다.


배포판에 "설정"도구가 없습니다. 어느 배포판을 사용하고 있습니까?
nickgrim

모든 redhat 기반 OS에는 rhel / centos / fedora whar OS 설정 도구가 있습니까?
Riaan

3
질문은 RHEL 기반 배포판과 Debian 기반 배포판의 차이점에 대해 이야기하므로 asker가 두 가지를 모두 사용한다고 가정해야합니다. 데비안 기반 배포판에는 '설정'도구가 없습니다.
Martijn Heemels

-4

흠 ... 리눅스 호스트에서 HOSTNAME과 FQDN을 변경하려면 3 단계를 해결해야합니다 (예 : 새 호스트는 rizzo.ifp.com ).

1 단계 NETWORK properties 설정에서 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
이 질문은 이미 정말 좋은 답변입니다. 이것은 새로운 것을 추가하지 않습니다.
Esa Jokinen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.