Đặt tên máy chủ: FQDN hoặc tên ngắn?


178

Tôi đã nhận thấy rằng phương pháp "ưa thích" để đặt tên máy chủ hệ thống về cơ bản là khác nhau giữa các hệ thống Red Hat / CentOS và Debian / Ubuntu.

Tài liệu CentOShướng dẫn triển khai RHEL cho biết tên máy chủ phải là FQDN :

HOSTNAME=<value>, trong đó <value>phải là Tên miền đủ điều kiện (FQDN), chẳng hạn như hostname.example.com, nhưng có thể là bất kỳ tên máy chủ nào là cần thiết.

Các hướng dẫn cài đặt RHEL là hơi mơ hồ hơn:

Thiết lập nhắc bạn cung cấp tên máy chủ cho máy tính này, dưới dạng tên miền đủ điều kiện (FQDN) ở định dạng hostname.domainname hoặc dưới dạng tên máy chủ ngắn trong tên máy chủ định dạng .

Tham chiếu Debian cho biết tên máy chủ không nên sử dụng FQDN :

3.5.5. Tên máy chủ

Nhân duy trì tên máy chủ hệ thống . Tập lệnh init trong runlevel S được liên kết với " /etc/init.d/hostname.sh " đặt tên máy chủ hệ thống khi khởi động (sử dụng lệnh tên máy chủ ) thành tên được lưu trữ trong " / etc / hostname ". Tệp này chỉ chứa tên máy chủ của hệ thống, không phải là tên miền đủ điều kiện.

Tôi chưa thấy bất kỳ khuyến nghị cụ thể nào từ IBM về việc nên sử dụng, nhưng một số phần mềm dường như có một ưu tiên.

Những câu hỏi của tôi:

  • Trong một môi trường không đồng nhất, tốt hơn là sử dụng đề xuất của nhà cung cấp, hoặc chọn một và nhất quán trên tất cả các máy chủ?
  • Bạn đã gặp phải phần mềm nào nhạy cảm với việc tên máy chủ được đặt thành FQDN hay tên ngắn?

Câu trả lời:


106

Tôi sẽ chọn một cách tiếp cận nhất quán trên toàn bộ môi trường. Cả hai giải pháp đều hoạt động tốt và sẽ vẫn tương thích với hầu hết các ứng dụng. Có một sự khác biệt trong khả năng quản lý, mặc dù.

Tôi sử dụng tên ngắn là cài đặt HOSTNAME và đặt FQDN làm cột đầu tiên /etc/hostscho IP của máy chủ, theo sau là tên ngắn.

Tôi chưa gặp phải nhiều gói phần mềm thực thi hoặc hiển thị tùy chọn giữa hai gói. Tôi thấy tên ngắn gọn để sạch hơn cho một số ứng dụng, cụ thể là đăng nhập. Có lẽ tôi đã không may mắn khi thấy các tên miền nội bộ như thế nào server.northside.chicago.rizzomanufacturing.com. Ai muốn thấy điều đó trong nhật ký hoặc dấu nhắc shell ?

Đôi khi, tôi tham gia vào việc mua lại công ty hoặc tái cấu trúc nơi các tên miền nội bộ và / hoặc tên miền phụ thay đổi. Tôi thích sử dụng tên máy chủ ngắn trong các trường hợp này vì đăng nhập, khởi động, in, giám sát hệ thống, v.v. không cần cấu hình lại đầy đủ để tính toán cho các tên miền mới.

Một thiết lập máy chủ RHEL / CentOS điển hình cho máy chủ có tên "rizzo" với tên miền nội bộ "ifp.com", sẽ trông như sau:

/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
Giống như bạn, tôi thích tên ngắn hơn, tuy nhiên gần đây tôi phát hiện ra rằng một số ứng dụng của Oracle yêu cầu đầu ra hostnamelà FQDN. Chỉ cần có nó /etc/hostslà không đủ tốt. Điều đó gây rối với sự nhất quán của tôi.
James O'Gorman

3
Sự khác biệt về cách viết hoa của tên máy chủ trong ví dụ này chắc chắn không phải là một cách thực hành tốt nhất: tools.ietf.org/search/rfc1178
teknopaul 17/214

2
Không nên /etc/sysconfig/networkchứa những dòng như: NETWORKING=yes, NETWORKING_IPV6=no, HOSTNAME=example.com, NISDOMAIN=example?
Jasmine Lognnes

@JasmineLognnes Đúng, tôi đã sửa nó. Tôi hy vọng ewwhite không phiền.
kubanchot

1
Nó không chỉ là về sở thích. Xem hostname(1)trên bất kỳ máy Linux nào.

39

Khá nhiều phần mềm rất nhạy cảm với việc đặt chính xác tên máy chủ. Trong khi tôi làm việc tại Digg, tôi đã từng đưa toàn bộ trang web xuống trong 2 giờ do thực hiện một thay đổi dường như vô hại trong /etc/hostsđó đã ảnh hưởng đến khái niệm tên máy chủ của hệ thống. Bước đi nhẹ nhàng. Điều đó nói rằng, bạn có thể hơi bối rối ở đây. Tôi không nghĩ rằng HOSTNAME=cài đặt tương đương trực tiếp với cách sử dụng các bản phân phối dựa trên Debian /etc/hostname.

Những gì làm việc cho tôi trong một môi trường không đồng nhất là:

  1. Đặt tên máy chủ theo cách được nhà cung cấp khuyến nghị, sử dụng một điều kiện trong phần mềm quản lý cấu hình của bạn.
  2. Sử dụng hostnamelệnh để đặt tên máy chủ được sử dụng bởi kernel, v.v.
  3. Trong /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

Cấu hình này vẫn chưa làm tôi thất bại.


Đây là khá nhiều thiết lập tôi sử dụng tại nơi làm việc. Tên viết tắt sẽ ổn miễn là tên miền nằm trong đường dẫn tìm kiếm DNA (/etc/resolv.conf) cho các máy có liên quan trong môi trường của bạn
gWaldo

Bạn có đề nghị cụ thể một IP mạng cục bộ thay vì IP công cộng không?
code_monk

34

Bạn chắc chắn sẽ không gặp vấn đề gì khi tìm tài liệu tham khảo trực tuyến, điều này sẽ cho bạn biết chắc chắn làm theo cách này hay cách khác. Tuy nhiên, đối với tôi, có một tên ngắn là tên máy chủ và có tên đủ điều kiện trong / etc / hosts chắc chắn là phổ biến hơn nhiều. Có vẻ như là cách hợp lý hơn, vì khi đó các dịch vụ cần một tên đủ điều kiện có thể được điều chỉnh để gọi hostname --fqdnthay thế.

Gần đây tôi chỉ bắt gặp một phần mềm mà yêu cầu phải trả lại một fqd hostname, đó là ganeti. Họ tài liệu này ở đây . hostname --fqdnTuy nhiên, tôi không thấy bất kỳ lý do nào họ không thể thích nghi .


"Tôi không thấy bất kỳ lý do nào mà họ không thể thích nghi hostname --fqdn" được trả lời trong đoạn đầu tiên trong phần "Tại sao tên máy chủ đủ điều kiện" - nó yêu cầu phỏng đoán và yêu cầu một trình giải quyết làm việc. Hỏi kernel là lựa chọn an toàn và đáng tin cậy nhất.
womble

3
@womble - Miễn là tệp / etc / hosts có một mục nhập cho máy ( 10.0.0.1 hostname.example.com hostname) và /etc/nsswitch.conf chỉ định độ phân giải cục bộ trước DNS ( hosts: files dns) sau đó có trình phân giải hoạt động được thực hiện bởi tệp máy chủ cục bộ. Do đó, đối số cho việc sử dụng FQDN thay vì tên máy chủ hiếm khi giữ nước. Ngoài ra, một ví dụ khác về phần mềm yêu cầu hostnametrả lại FQDN một cách cứng nhắc là gói máy chủ thư Zimbra.
sụp đổ

@crashmaxed: Đó là một số yêu cầu bổ sung, bất kỳ yêu cầu nào trong số đó có thể không thực hiện được trong một môi trường nhất định hoặc bị nhầm lẫn. Có FQDN trong cấu trúc dữ liệu kernel đơn giản hơn nhiều.
womble

11

Một cách tiếp tuyến, trong khi nghiên cứu câu hỏi này, tôi đã phát điên đến mức phải kiểm tra mã nguồn của "tên máy chủ" và viết một kịch bản để in kết quả điều tra (Fedora 19). Điều còn thiếu là một cái nhìn vào "/ etc / hosts", theo quan điểm khiêm tốn của tôi, nên tránh xa tất cả những điều này ngay từ đầu.

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

Đầu ra trên máy ảo Amazon EC2 chạy Fedora 19 , sau khi cài đặt thủ công các giá trị kernel và điền /etc/hostname, nhưng không có thay đổi nào /etc/hostscó thể như sau:

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

Cách linh hoạt để có được tên máy chủ đủ điều kiện trong perl sau đó sẽ là:

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

và trong bash nó sẽ là:

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
}

Ghi chú

Lưu ý 1: HOSTNAME là biến shell mà bash cung cấp ("Tự động đặt thành tên của máy chủ hiện tại.") Nhưng không có dấu hiệu nào cho thấy bash đến giá trị đó.

Lưu ý 2: Không bao giờ quên / etc / tên máy chủ trong /boot/initrams-FOO.img ...


4
Xin lỗi nếu điều này là hiển nhiên, nhưng bất kỳ điều này có liên quan gì đến việc đặt tên máy chủ?
Chris S

Về cơ bản các ghi chú tôi đã thực hiện trong khi nghiên cứu đặt tên máy chủ trên các phiên bản Fedora 19 EC2 của mình. Về kết quả: 1) Đặt FQHN trong / etc / hostname 2) Không chạm / etc / hosts 3) Bạn có thể đặt 'tên máy chủ hạt nhân' thành FQHN hoặc tên máy chủ không đủ tiêu chuẩn, nếu bỏ đặt giá trị được lấy từ / etc / hostname 4) Bạn có thể đặt 'tên miền kernel' thành tên miền, đẹp hơn chỉ là '(none)'.
David Tonhofer

-4

Các tùy chọn / etc / hosts hoạt động tốt.

Nhưng bạn muốn đảm bảo rằng tất cả các tệp thích hợp được cập nhật hãy chạy công cụ thiết lập


Phân phối của tôi không có công cụ "thiết lập"; bạn đang sử dụng bản phân phối nào?
nickgrim

Bất kỳ hệ điều hành dựa trên redhat nào cũng có công cụ thiết lập rrc / centos / fedora mà bạn đang sử dụng?
Riaan

3
Vì câu hỏi nói về sự khác biệt giữa các bản phân phối dựa trên cơ sở dữ liệu và dựa trên Debian, nên chúng tôi phải cho rằng người hỏi sử dụng cả hai. Không có công cụ 'thiết lập' trên các bản phát hành dựa trên Debian.
Martijn Heemels

-4

Hừm ... Trong các máy chủ linux, nếu bạn muốn thay đổi HOSTNAME và FQDN, bạn nên giải quyết 3 bước (ví dụ: máy chủ mới là rizzo.ifp.com ):

Bước # 1 Thay đổi giá trị HOST trong cấu hình thuộc tính NETWORK:

sudo vi /etc/sysconfig/network

Thay đổi hoặc thêm chuỗi:

HOSTNAME=rizzo.ifp.com

Bước # 2 Chỉnh sửa cấu hình máy chủ của bạn

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

Bước # 3 Khởi động lại máy chủ của bạn Tốt lắm, chỉ cần kiểm tra cấu hình mới

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

-4

Thứ tự không đúng. Nó phải là:

1.2.3.4 full.example.com full

Vì vậy, ví dụ có thể như thế này:

[External IP] rizzo.example.com rizzo 

4
Câu hỏi này đã thực sự có câu trả lời chất lượng. Điều này không thêm bất cứ điều gì mới.
Esa Jokinen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.