سؤال إعداد اسم المضيف: FQDN أو الاسم المختصر؟


لقد لاحظت أن الطريقة "المفضلة" الخاصة بتعيين اسم مضيف النظام تختلف اختلافًا جوهريًا بين أنظمة Red Hat / CentOS و Debian / Ubuntu.

وثائق CentOS و ال دليل نشر RHEL قل اسم المضيف يجب أن يكون FQDN:

HOSTNAME=<value>، أين <value> يجب أن يكون النطاق المؤهل بالكامل   الاسم (FQDN) ، مثل hostname.example.com، ولكن يمكن أن يكون أيا كان   اسم المضيف ضروري.

ال دليل تثبيت RHEL أكثر غموضا قليلا:

يطالبك برنامج الإعداد بتوفير اسم مضيف لهذا الكمبيوتر ، إما باسم    اسم المجال المؤهل بالكامل (FQDN) في الشكل hostname.domainname   أو كاسم مضيف قصير في الشكل اسم المضيف.

مرجع دبيان يقول اسم المضيف يجب عدم استخدام FQDN:

3.5.5. اسم المضيف

يحافظ النواة على النظام اسم المضيف. البرنامج النصي init في مستوى التشغيل   S والتي ترتبط بـ "/etc/init.d/hostname.sh"يحدد النظام   اسم المضيف في وقت التمهيد (باستخدام اسم المضيف الأمر) إلى الاسم المخزن   في "/ الخ / المضيف". يجب أن يحتوي هذا الملف فقط اسم مضيف النظام ،   ليس اسم نطاق مؤهل بالكامل.

لم أر أي توصيات محددة من آي بي إم حول استخدامها ، ولكن بعض البرامج يبدو أن لديها تفضيل.

أسئلتي:

  • في بيئة غير متجانسة ، هل من الأفضل استخدام توصية البائع ، أو اختيار واحد وتكون متسقة عبر جميع المضيفين؟
  • ما هي البرامج التي صادفتها والتي تكون حساسة لما إذا كان اسم المضيف مضبوطًا على FQDN أو الاسم المختصر؟

164
2017-11-17 13:07


الأصل




الأجوبة:


سأختار نهجًا متسقًا عبر البيئة بالكامل. كلا الحلول تعمل بشكل جيد وستظل متوافقة مع معظم التطبيقات. هناك فرق في سهولة الإدارة ، مع ذلك.

أذهب بالاسم القصير كإعداد HOSTNAME ، وقمت بتعيين FQDN كعمود أول في /etc/hosts لخادم IP ، متبوعًا بالاسم القصير.

لم أواجه العديد من حزم البرامج التي تفرض أو تعرض تفضيلاً بين الاثنين. أجد الاسم القصير أنظف لبعض التطبيقات ، على وجه التحديد تسجيل. ربما كنت غير محظوظ في رؤية المجالات الداخلية مثل server.northside.chicago.rizzomanufacturing.com. من يريد أن يرى ذلك في السجلات أو مطالبة قذيفة؟

في بعض الأحيان ، أشارك في عمليات استحواذ أو إعادة هيكلة الشركة حيث تتغير النطاقات الداخلية و / أو النطاقات الفرعية. أحب استخدام اسم المضيف القصير في هذه الحالات لأن التسجيل ، وبدء التشغيل ، والطباعة ، ومراقبة الأنظمة ، وما إلى ذلك ، لا تحتاج إلى إعادة تشكيل كاملة لحساب أسماء النطاقات الجديدة.

سيظهر إعداد خادم RHEL / CentOS نموذجيًا لخادم يسمى "rizzo" مع المجال الداخلي "ifp.com" ، كما يلي:

/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



مثلك ، أنا أفضل الاسم القصير ، لكنني اكتشفت مؤخرًا أن بعض تطبيقات Oracle تتطلب إخراج hostname ليكون FQDN. مجرد وجود في /etc/hosts ليس جيد بما فيه الكفاية هذا عابث مع اتساقي. - James O'Gorman
لا يعد الاختلاف في رسملة أسماء المضيفين في هذا المثال بالتأكيد مرجعًا لأفضل الممارسات: tools.ietf.org/search/rfc1178 - teknopaul
لا ينبغي /etc/sysconfig/network تحتوي على خطوط مثل: NETWORKING=yes، NETWORKING_IPV6=no، HOSTNAME=example.com، NISDOMAIN=example ؟ - Jasmine Lognnes
JasmineLognnes الحق ، لقد قمت بتصحيحه. آمل ewwhite لا مانع. - kubanczyk
الأمر لا يتعلق فقط بالأفضلية. نرى hostname(1) على أي جهاز لينكس.


إلى حد كبير جميع البرامج حساسة لتحديد اسم المضيف بشكل صحيح. بينما كنت أعمل في Digg I أحضر الموقع بأكمله لمدة ساعتين بسبب إجراء تغيير بريء على ما يبدو /etc/hostsالتي أثرت على مفهوم النظام الخاص باسم المضيف. سحق ببطء. ومع ذلك ، قد تكون مرتبكًا قليلاً هنا. لا اعتقد ان HOSTNAME= الإعداد مكافئ بشكل مباشر لكيفية استخدام توزيعات دبيان /etc/hostname.

ما يناسبني في بيئة غير متجانسة هو:

  1. عيّن اسم المضيف بالطريقة التي يوصي بها المورِّد باستخدام أمر مشروط في برنامج إدارة التهيئة.
  2. استخدم ال hostname الأمر لتعيين اسم المضيف المستخدم من قبل النواة ، إلخ.
  3. في /etc/hosts:

    127.0.0.1    localhost
    10.0.0.1     hostname.example.com     hostname
    

لم يفشل هذا التكوين لي حتى الآن.


36
2017-11-21 18:48



هذا إلى حد كبير الإعداد الذي أستخدمه في العمل. يجب أن يكون الاسم المختصر جيدًا طالما أن اسم النطاق موجود في مسار بحث DNA (/etc/resolv.conf) للأجهزة ذات الصلة في بيئتك - gWaldo
هل توصي على وجه التحديد بشبكة IP محلية بدلاً من واحدة عامة؟ - code_monk


بالتأكيد لن يكون لديك مشكلة في العثور على المراجع عبر الإنترنت والتي ستخبرك بالتأكيد أن تفعل ذلك بطريقة أو بأخرى. يبدو لي مع ذلك أن وجود اسم قصير باسم المضيف ، والحصول على اسم مؤهل بالكامل في / etc / hosts هو بالتأكيد أكثر انتشارًا. يبدو مثل الطريقة الأكثر منطقية ، حيث يمكن تكييف الخدمات التي تحتاج إلى اسم مؤهل بالكامل للاتصال hostname --fqdn في حين أن.

لقد صادفت برنامجًا واحدًا فقط مؤخرًا والذي يتطلب بشدة إعادة عرض رقم fqdn بواسطة hostnameوالذي كان ganeti. يوثقون هذا هنا. لا أرى أي سبب يمنعهم من التكيف معه hostname --fqdn، ومع ذلك.


29
2017-12-15 14:45



مكافأة لتقديم مثال! شكر. - Cakemox
"لا أرى أي سبب لا يمكنهم التكيف معه hostname --fqdn"تمت الإجابة عليه في الفقرة الأولى تحت عنوان" لماذا اسم المضيف المؤهل تمامًا "- يتطلب الأمر تخمينًا ، ويتطلب حلًا عمليًا ، حيث يُعد طرح النواة الخيار الأكثر أمانًا والأكثر موثوقية. - womble♦
@ womble - طالما أن الملف / etc / hosts به إدخال للجهاز (10.0.0.1 hostname.example.com hostname) و /etc/nsswitch.conf تحدد الدقة المحلية قبل DNS (hosts: files dns) بعد أن يتم الوفاء بمحلل عمل بواسطة ملف المضيف المحلي. على هذا النحو ، نادراً ما تحمل المياه المستخدمة في استخدام FQDN بدلاً من اسم مضيف. أيضا ، مثال آخر على البرامج التي تتطلب بجد hostname لإرجاع FQDN هي حزمة خادم بريد Zimbra. - crashmaxed
crashmaxed: هذا العديد من المتطلبات الإضافية ، أي منها قد لا يكون ممكنًا في بيئة معيّنة أو ثمل عن طريق الخطأ. وجود FQDN في بنيات بيانات kernel هو أبسط من ذلك بكثير. - womble♦


إلى حدٍ ما ، أثناء البحث في هذا السؤال ، كنت أفعل ما يكفي من الجنون لفحص الكود المصدري لـ "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"

الإخراج على الأمازون EC2 VM يعمل فيدورا 19، بعد تحديد قيم النواة يدويًا وتعبئتها /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}"
      }
   }
}

وفي باش سيكون:

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 هو متغير shell يوفره bash ("تم التعيين تلقائيًا إلى اسم المضيف الحالي.") ولكن لا يوجد أي مؤشر حول وصول bash إلى تلك القيمة.

ملاحظة 2: لن ننسى أبدًا / etc / hostname in /boot/initrams-FOO.img ...


10
2017-10-03 11:39



عذرًا إذا كان يجب أن يكون هذا واضحًا ، ولكن ما علاقة أي من هذه الأمور بإعداد اسم المضيف؟ - Chris S
تلاحظ أساسا أنا قدمت أثناء البحث في وضع اسم المضيف على بلدي حالات EC1 فيدورا 19. بالنسبة للنتيجة: 1) قم بتعيين FQHN في / etc / hostname 2) لا تلمس / etc / hosts 3) يمكنك تعيين "اسم مضيف kernel" إما إلى FQHN أو اسم مضيف غير مؤهل ، إذا لم يتم ضبط القيمة من / etc / hostname 4) يمكنك تعيين "اسم النطاق kernel" على اسم النطاق ، وهو أمر أجمل من "(بلا)". - David Tonhofer


تعمل خيارات / etc / hosts بشكل جيد.

ولكنك تريد التأكد من أن يتم تحديث جميع الملفات المناسبة تشغيل اقامة أداة


-4
2017-11-25 11:56



لا يحتوي توزيعي على أداة "إعداد" ؛ ما التوزيع الذي تستخدمه لديه واحد؟ - nickgrim
أي نظام تشغيل قائم على redhat لديه أداة الإعداد rhel / centos / fedora whar OS التي تستخدمها؟ - Riaan
وبما أن المسألة تتحدث عن الاختلافات بين توزيعات RHEL القائمة على ديبيان ومقرها دبي ، فيجب أن نفترض أن المستخدم يستخدمها. لا توجد أداة "إعداد" على توزيعات ديبيان. - Martijn Heemels


جلالة الملك ... في المضيفين لينكس ، إذا كنت تريد تغيير HOSTNAME و FQDN ، يجب عليك حل 3 خطوات (على سبيل المثال ، مضيف جديد هو rizzo.ifp.com):

الخطوة 1 تغيير قيمة 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
2017-12-22 10:56





الترتيب غير صحيح. يجب أن يكون:

1.2.3.4 full.example.com full

لذلك يمكن أن يعجبك المثال:

[External IP] rizzo.example.com rizzo 

-4
2018-04-05 07:23



هذا السؤال لديه بالفعل أجوبة نوعية. هذا لا يضيف أي شيء جديد. - Esa Jokinen