การค้นหา DNS ล้มเหลวเช่น "ping" แต่ทำงานกับ "host"


35

ฉันใช้ pfSense 2.0rc3 และฉันตั้งค่าเป็นผู้ส่งต่อ DNS และเปิดใช้งาน "ลงทะเบียน DHCP เช่าในผู้ส่งต่อ DNS" และสิ่งที่ฉันเข้าใจคือการตั้งค่าที่เหมาะสมทั้งหมดเพื่อรับเซิร์ฟเวอร์ DNS สำหรับการค้นหาในเครื่อง

มันทำงานได้ตามที่คาดหวังกับ Linux และโดยเฉพาะอย่างยิ่งฉันสามารถเรียกใช้host abcและping abc(และแอปพลิเคชันอื่น ๆ ) และพวกเขาทั้งหมดทำงานตามที่คาดไว้

อย่างไรก็ตามใน Mac OS X Lion 10.7 ไม่ทำงานอย่างที่คาดไว้ โดยเฉพาะการค้นหาด้วยhostคำสั่งที่ดูเหมือนจะใช้งานได้เช่น

$ ping abc
ping: cannot resolve abc: Unknown host

$ host abc
abc.local has address 192.168.1.128

$ ping abc.local
ping: cannot resolve abc.local: Unknown host

$ host abc.local
abc.local has address 192.168.1.128

ทำไมการค้นหาabcทำงานเมื่อใช้hostคำสั่ง แต่ล้มเหลวด้วยping(และแอปพลิเคชันอื่น ๆ )

ขอบคุณที่อ่าน.


ฉันลงเอยด้วยสถานการณ์เดียวกันนี้ใน Yosemite ใหม่ (10.10) MBP หลังจากค้นหาและกำหนดค่ามาก ๆ นี่คือคำตอบที่ใช้ได้: apple.stackexchange.com/a/152892สำหรับบันทึกที่ไม่มี --AlwaysAppendSearch การกำหนดค่าโดเมน
Stan Kurdziel

คำตอบ:


26

ทำไมพวกเขาถึงเปลี่ยนแปลงสิ่งนี้ฉันไม่รู้ แต่มันทำให้ฉันคลั่งไปพักหนึ่ง

ฉันไม่รู้ว่าทำไมสิ่งต่าง ๆ ถึงทำงานกับโฮสต์ได้ แต่ไม่ใช่ ping แต่ฉันคิดว่ามันเกี่ยวข้องกับธรรมชาติของอรรถประโยชน์ทั้งสองนี้ Ping เป็นยูทิลิตี้การวินิจฉัยที่ใช้งานง่าย (แม้ว่าจะมีประโยชน์มาก) สำหรับการทิ้งแพ็กเก็ตบนสายที่ควรจะสะท้อนกลับมาหาคุณ ฟังก์ชันการค้นหาชื่อโฮสต์เป็นเพียงผลข้างเคียงของงานและส่งมอบให้กับตัวแก้ไขแบบเรียกซ้ำของระบบ (ฉันเชื่อว่า - ฉันยังไม่ได้ตรวจสอบโดยการตรวจสอบไลบรารีที่เชื่อมโยงหรือสิ่งอื่นใด) งานหลักของโฮสต์คือการแก้ปัญหาชื่อ DNS ดังนั้นจึงใช้ตัวแก้ไขแบบเรียกซ้ำ

ตัวแก้ปัญหาแบบเรียกซ้ำของ Apple คือ mDNSResponder ด้วยเหตุผลบางอย่างรุ่นของ mDNSR การตอบกลับใน Lion ต้องใช้ตัวเลือกบรรทัดคำสั่ง "-AlwaysAppendSearchDomains" เพื่อให้ทำงานเหมือนใน Snow Leopard (อย่างน้อย)

นี่เป็นวิธีที่รวดเร็วในการแก้ไข:

sudo sed -i .orig '/ProgramArguments/,/<\/array>/ {
s/\(<string>-launchd<\/string>\)/\1\
                <string>-AlwaysAppendSearchDomains<\/string>/
}' /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

(ควรมีอักขระแท็บสองตัวที่จุดเริ่มต้นของบรรทัดที่สองถึงครั้งสุดท้ายด้านบน แต่ฉันไม่สามารถหาวิธีที่จะให้ตัวแก้ไขเล็ก ๆ นี้แทรกแท็บได้ดังนั้นฉันจึงเพิ่มช่องว่าง 16 ช่องทั้งสองควรทำงาน แต่แท็บ พอดีกับระยะห่างของไฟล์ต้นฉบับดีกว่า)

สิ่งนี้จะเพิ่มอาร์กิวเมนต์ "-AlwaysAppendSearchDomains" ลงในไฟล์ plist เริ่มต้น mDNSResponder (และบันทึกสำเนาสำรอง) แต่เนื่องจากถูกควบคุมโดย launchd ระบบจะต้องบอกให้รีสตาร์ท mDNSResponder

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

ตอนนี้ถ้าคุณตรวจสอบกระบวนการ mDNSR ที่กำลังรันอยู่คุณควรเห็นว่ามันกำลังทำงานอยู่พร้อมกับอาร์กิวเมนต์ใหม่ของคุณ:

ps auxww | grep mDNSResponder

(Props ถึงhttp://www.makingitscale.com/2011/fix-for-broken-search-domain-resolution-in-osx-lion.htmlและhttp://kavassalis.com/2011/07/wtf-bug -in-os-x-10-7 /ที่ฉันพบคำตอบสำหรับปัญหานี้)


การแก้ไขนี้ใช้งานได้กับ Mountain Lion (10.8) ฉันเพิ่งนำไปใช้กับแล็ปท็อปของฉัน
Sigsegv

เย็น! ดีใจที่ฉันสามารถช่วย
Sigsegv

1
FYI: สิ่งนี้ใช้ไม่ได้กับโยเซมิตี หากคุณต้องการ AlwaysAppendSearchDomains บน Yosemite ให้ลอง: apple.stackexchange.com/a/157017/65787นั่นไม่ได้แก้ปัญหา. local สำหรับฉันใน Yosemite แต่นี่เป็น =) apple.stackexchange.com/a/152892
Stan Kurdziel

ไม่ได้ทำงานใน El Captain และวิธีที่ง่ายกว่าในการทำsudo defaults write /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist ProgramArguments -array-add "–AlwaysAppendSearchDomains"
Dmitry Verkhoturov

9

จากหน้าโฮสต์ (1) หน้าคน:

ประกาศของ Mac OS X

คำสั่งโฮสต์ไม่ใช้ชื่อโฮสต์และการแก้ไขที่อยู่หรือกลไกการกำหนดเส้นทางการสืบค้น DNS ที่ใช้โดยกระบวนการอื่น ๆ ที่ทำงานบน Mac OS X ผลลัพธ์ของการสอบถามชื่อหรือที่อยู่ที่พิมพ์โดยโฮสต์อาจแตกต่างจากกระบวนการอื่น ๆ ที่ใช้ Mac กลไกการจำแนกชื่อพื้นเมืองและที่อยู่ OS X ผลลัพธ์ของการสืบค้น DNS อาจแตกต่างจากแบบสอบถามที่ใช้ไลบรารีการกำหนดเส้นทาง Mac OS X DNS

น่าเสียดายที่ไม่มีข้อมูลว่าคำสั่ง host แก้ไขชื่อโฮสต์ได้อย่างไร พฤติกรรมนี้ทำให้ไม่มีประโยชน์สำหรับการดีบัก IMHO


6

ประวัติพื้นฐาน ... nslookup คือคำสั่ง แต่มันมีการใช้งานของมันเองทั้งหมดเป็นกิจวัตรของตัวแก้ไข สิ่งที่เริ่มเกิดขึ้นคือตัวแก้ไขระบบบนแพลตฟอร์มต่างๆทำงานแตกต่างจาก nslookup บางครั้งสิ่งนี้จะให้ผลลัพธ์ที่แตกต่างกันบ้าง

คำสั่งโฮสต์และ dig ถูกสร้างเป็น "rewrite" สำหรับ nslookup พวกเขาเชื่อมโยงแบบคงที่ในฟังก์ชั่นการแก้ไขระบบ ตัวแก้ไขระบบคือชุดของฟังก์ชั่นในไลบรารี C มาตรฐานของระบบคล้าย UNIX หรือ UNIX (บน Mac OS X ฟังก์ชั่นเหล่านี้เป็นส่วนหนึ่งของไลบรารี netdb) ด้วยการทำเช่นนี้คำสั่งโฮสต์และ dig จะทำงานในลักษณะเดียวกับที่ตัวแก้ไขระบบทำกับระบบปฏิบัติการใด ๆ ก็ตามที่พวกเขาสร้างขึ้นมา แต่พวกเขาไม่ต้องพึ่งพามัน ด้วยวิธีนี้พวกเขาเป็นเครื่องมือวินิจฉัยที่ยอดเยี่ยมในกรณีที่ตัวแก้ไขระบบทำงานผิดปกติ

หมายเหตุ: โฮสต์และขุดทั้งสองอ่านรายชื่อ nameserver จาก /etc/resolv.conf เว้นแต่พวกเขาจะได้รับ nameserver เฉพาะเพื่อพูดคุย เฉพาะคำสั่ง host เท่านั้นที่ใช้รายการค้นหาในไฟล์ /etc/resolv.conf ขุดไม่ได้ซึ่งเป็นเหตุผลว่าทำไมต้องให้ขุด FQDN เพื่อแก้ไขอะไร ทั้งสองคำสั่งมีความเพียงพอในตัวเองอย่างเต็มที่; เช่นไฟล์ /etc/resolv.conf เป็นสิ่งเดียวที่ไม่ได้อยู่ในไฟล์ไบนารีที่พวกเขาใช้

mDNSresponder คือ Bonjour ฉันไม่ได้ขุดลึกเกินไป แต่ฉันสงสัยว่าการตั้งค่าคอนฟิกนี้ไม่ได้แก้ไขสิ่งนี้หรืออย่างน้อยก็ไม่ใช่โดยตรง ฉันเพิ่งพบปัญหาเดียวกันนี้ใน Mac OS X 10.9.1 และเพียงแค่รีสตาร์ท mDNSresponder ซ่อมแซมมันให้ฉัน ฉันไม่เคยเห็นปัญหานี้มาก่อนในวันที่ 10.5 -> 10.8 / 10.9 ในระบบอื่น ๆ นอกจากนี้แอปพลิเคชัน GUI ไม่ได้รับผลกระทบจากมันมันเป็นเพียงเครื่องมือบรรทัดคำสั่งเช่น ping และ ssh ที่แตก

ถ้าฉันหาเวลาขุดผ่านห้องสมุดอีกสักหน่อยฉันจะดูว่าฉันสามารถหาคำอธิบายที่สมบูรณ์มากขึ้นได้ไหม


4

ฉันได้รวบรวมเชลล์สคริปต์เพื่อทำการแก้ไขอัตโนมัติ (และโปรแกรมถอนการติดตั้งหากคุณต้องการในภายหลัง) ที่นี่:

https://github.com/michthom/AlwaysAppendSearchDomains

นี่คือการมอบให้กับผู้ใช้ทางเทคนิคน้อยกว่าที่ทำงานที่อาจอายจากการแก้ไขไฟล์ระบบด้วยตนเอง


4

. local ถูกสงวนไว้สำหรับ multicast mDNS และเซิร์ฟเวอร์ DNS ในเครือข่ายเดียวกันโดยใช้. local อาจเป็นปัญหาได้


1
ฉันชอบคำอธิบายเพิ่มเติมที่นี่หรือลิงก์ไปยังเอกสารบางอย่าง ขอบคุณสำหรับอาหารอันโอชะ!
bmike

3

โฮสต์กำลังต่อท้าย. local คำต่อท้าย dns ปิงไม่ได้ หากคุณพบว่ามีปัญหานี้คุณสามารถเพิ่ม. local เป็นคำต่อท้ายเริ่มต้นในการตั้งค่าระบบเครือข่ายและระบบจะเพิ่มสิ่งนั้นเมื่อพยายามแก้ไขชื่อโฮสต์


มันเป็นจุดที่ดีและขอโทษผมไม่ได้พูดดังนั้นในคำถาม แต่ping abc.localไม่ทำงานอย่างใดอย่างหนึ่ง ( แต่host abc.localไม่) ฉันแก้ไขคำถามแล้ว pfSense จะเพิ่มโดเมนท้องถิ่นโดยอัตโนมัติเป็นโดเมนการค้นหาเมื่อส่งสัญญาเช่า DHCP ออกมาเพื่อไม่ให้เกิดปัญหา
Brian M. Hunt

ว้าว - แปลก จะเกิดอะไรขึ้นหากคุณผ่านการรับรองตามท้องถิ่นอย่างเต็มที่ ? ping abc.local.
bmike

1
ผลลัพธ์เดียวกัน เห็นได้ชัดว่ามีสองกลไกการค้นหาใน Mac ทำไมพวกเขาต่างกันยากที่จะจินตนาการ
Brian M. Hunt

ฉันไม่คิดว่าคำตอบนี้ใช้ได้กับโยเซมิตีและระบบปฏิบัติการรุ่นใหม่อื่น ๆ บางทีเราอาจจะได้รับการตอบที่ดีกว่าจะไป ?
bmike

มีคำเตือนเอกสารประกอบว่าไฟล์ / etc / hosts จะใช้ในโหมดผู้ใช้คนเดียวเท่านั้น ไม่จริง. ฉันป้องกันการเข้าถึงคนร้ายจำนวนมากโดยไม่ตั้งใจโดยใส่ชื่อพวกเขาไว้ใน / etc / hosts กำหนดเส้นทางไปที่ 127.0.0.1 ฉันไม่คิดว่าเรื่องนี้สำหรับคำถามนี้ ฉันยังตั้งข้อสังเกตว่า OS X เปลี่ยนบ่อย resolv.conf ของฉันดังนั้นฉันจึงตั้งค่างาน cron เพื่อกู้คืนเป็นสิ่งที่ฉันต้องการทุกสิบนาที
WGroleau

2

ในกรณีที่คุณพยายามทั้งหมดข้างต้นและไม่มีอะไรทำงานแล้วคุณสามารถเพิ่มของเซิร์ฟเวอร์และเส้นทางการค้นหาเพื่อSystem Preferences>Network>Advance(bottom right of the window)>DNS tab ป้อนคำอธิบายรูปภาพที่นี่

อัปเดต/etc/resolv.confและ ping นี้ควรใช้งานได้แล้ว การอัปเดตพา ธ การค้นหาโดยการแก้ไข/etc/resolv.conf ใช้งานไม่ได้ แต่มันทำด้วยเหตุผลบางประการ

UPDATE:

การแก้ไข/etc/resolv.confไม่ทำงานเนื่องจากระบบปฏิบัติการจะเขียนไฟล์ตามการตั้งค่าบานหน้าต่าง System Preference


1
"การแก้ไข /etc/resolv.conf ใช้งานไม่ได้จริง ๆ " เพราะระบบปฏิบัติการเขียนใหม่โดยอ้างอิงจากบานหน้าต่าง pref
WGroleau

1
นี่เป็นกลอุบายของฉันในทางตรงกันข้ามกับคำตอบที่ยอมรับได้
Artem Pyanykh

1

ฉันขาดชื่อเสียงเพียงพอที่จะแสดงความคิดเห็นในโพสต์มอนต์ปีเตอร์สัน การรีสตาร์ท mDNSresponder ทำงานได้ดีสำหรับฉันบน Mac OS X 10.7 (Lion) ไม่เหมือนกับ Lamont Peterson ปัญหานี้ทำให้เกิดปัญหากับแอปพลิเคชั่น GUI เดียวสำหรับฉัน - Safari ไม่สามารถแก้ไขชื่อโฮสต์สาธารณะหรือส่วนตัวได้ นี่คือขั้นตอนเฉพาะที่ฉันทำและสงสัยว่า Lamont Peterson ก็ทำเช่นกัน:

sudo launchctl unload /System/Library/LaunchDaemons/com.apple.mDNSresponder.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSresponder.plist

unloadปิดลง mDNSResponder และloadเริ่มต้นขึ้นอีกครั้ง

วิธีนี้แก้ไขปัญหาได้ทันที ไม่ต้องบูตเครื่องใหม่

คุณสามารถตรวจสอบว่ามันได้เริ่มต้นใหม่เรียบร้อยแล้วโดยใช้listคำสั่ง:

$ sudo launchctl list | grep '^PID\|mDNSResponder'
PID     Status  Label
708     -       com.apple.mDNSResponder
-       0       com.apple.mDNSResponderHelper

สถานะของ Process ID (PID) หมายความว่ากำลังทำงานอยู่ 708จะแตกต่างกันไปตามที่ได้รับมอบหมายจากระบบปฏิบัติการ หากสถานะแสดงบางอย่างนอกเหนือจากเครื่องหมายขีดกลางหรือศูนย์แสดงว่ามีบางอย่างผิดปกติ

ฉันไม่ทราบวิธีการmDNSResponderHelperโต้ตอบกับmDNSResponder; ฉันต้องรีสตาร์ทmDNSResponderเท่านั้น



0

โปรดทราบว่าชื่อ OSX อาจไม่ได้มาตรฐานดังนั้นเพื่อความสมบูรณ์:

  • FQDN เป็น pingable
  • ชื่อในไฟล์ "โฮสต์" เป็น pingable

ชื่อ Mac ไม่ทั่วไป: ต้องแก้ไขสองวิธี: a) เปลี่ยนช่องว่างเป็น "-" b) เพิ่ม. local

ตัวอย่างเช่น Mac ของฉัน: MacBook Pro ของ ingconti

จะ pingable ได้ที่: ingcontis-MacBook-Pro.local

และเปิดการตั้งค่าคุณสามารถดู:

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.