มีวิธีการตั้งค่า Avahi เพื่อใช้ "การแก้ไขชื่อ anycast" บน LAN หรือไม่?


9

ขั้นแรกให้พื้นหลังบาง: เรามีห้องปฏิบัติการที่มีเซิร์ฟเวอร์ลินุกซ์โดยเฉพาะที่ทำงานบน LAN แยกต่างหาก เซิร์ฟเวอร์ทั้งหมดใช้ระบบปฏิบัติการเดียวกัน (Debian Linux) และซอฟต์แวร์เซิร์ฟเวอร์ที่เป็นกรรมสิทธิ์เดียวกันและกระบวนการของเซิร์ฟเวอร์สื่อสารกันเพื่อให้ข้อมูลตรงกัน นั่นหมายความว่าเท่าที่ลูกค้ามีความกังวลใด ๆ มันไม่สำคัญว่าเซิร์ฟเวอร์ที่ลูกค้าเชื่อมต่อกับ - เซิร์ฟเวอร์ใด ๆ จะส่งคืนข้อมูลเดียวกันกับที่อื่น ๆ

เซิร์ฟเวอร์ Linux เหล่านี้ทั้งหมดเรียกใช้ avahi-daemon เพื่อเผยแพร่ชื่อโฮสต์ mDNS ด้วยตนเองซึ่งหมายความว่าลูกค้าสามารถป้อนเช่น " http: //linux-server-1.local " ลงในเว็บเบราว์เซอร์ของเขาและเชื่อมต่อกับเซิร์ฟเวอร์ Linux # 1 และอื่น ๆ

ทั้งหมดนี้เป็นสิ่งที่ดีและดียกเว้นว่าหมายความว่าผู้ใช้ที่นั่งอยู่ที่เครื่องไคลเอนต์ (โดยทั่วไปคือแล็ปท็อป Mac หรือ Windows ที่ติดตั้ง Bonjour) ต้องรู้ (หรือเข้าใจ) เซิร์ฟเวอร์ Linux ที่ออนไลน์อยู่และเขาต้อง ตรวจสอบให้แน่ใจว่าเขาเชื่อมต่อกับหนึ่งในนั้น ตัวอย่างเช่นหากเซิร์ฟเวอร์ # 2 ออฟไลน์วันนี้และลูกค้าเข้าสู่ " http: //linux-server-2.local " ในแถบ URL ของเขาเขาจะไม่ได้รับคำตอบ แน่นอนว่าไม่ใช่จุดจบของโลก แต่เป็นเรื่องน่ารำคาญสำหรับผู้ใช้มือใหม่ที่คาดหวังว่าทุกอย่างจะ "แค่ทำงาน" และยังทำให้การพัฒนาสคริปต์ฝั่งไคลเอ็นต์มีความซับซ้อนมากขึ้น (เนื่องจากสคริปต์ฝั่งไคลเอ็นต์ จะต้องรู้วิธีจัดการกับเซิร์ฟเวอร์ออฟไลน์อย่างชัดเจน)

โดยที่ในใจคำถามของฉันคือ: มันเป็นไปได้หรือไม่ที่จะกำหนดค่า Avahi เพื่อเผยแพร่นามแฝงชื่อโฮสต์ mDNS สไตล์ anycast ด้วยเช่นกัน? เป้าหมายคือทุกคนสามารถนั่งลงกับแล็ปท็อปของเขาให้ป้อน " http: //any-linux-server.local " (หรือคล้ายกัน) และเชื่อมต่อกับหนึ่งในเซิร์ฟเวอร์ที่ออนไลน์อยู่ (อีกครั้งมันไม่สำคัญว่าจะใช้เซิร์ฟเวอร์ใด)

โปรดทราบว่าสิ่งนี้จำเป็นต้องทำงานโดยไม่ต้องมีการกำหนดค่าพิเศษของแลปท็อปไคลเอ็นต์เนื่องจากเราไม่สามารถควบคุมได้ (นอกเหนือจากข้อกำหนดที่ติดตั้ง Bonjour)

นอกจากนี้โปรดทราบว่าเราไม่สามารถพึ่งพาการมีเซิร์ฟเวอร์ชื่อหรือพร็อกซีแยกต่างหากหรือต่อหน้าเซิร์ฟเวอร์ Linux ใด ๆ เนื่องจากจะทำให้เกิดข้อผิดพลาดเพียงจุดเดียวซึ่งเราพยายามหลีกเลี่ยง

คำตอบ:


13

Trent Lloyd ที่นี่หนึ่งในผู้แต่งของโครงการ Avahi

ในทางทฤษฎีเป็นไปได้ แต่มันไม่ง่ายที่จะทำ น่าเสียดายที่กลไกเริ่มต้นสำหรับการเผยแพร่ชื่อโฮสต์ใน Avahi นั้นก็เผยแพร่เรคคอร์ด DNS แบบย้อนกลับซึ่งระบุว่าเป็นเอกสิทธิ์ ดังนั้นหากคุณลองและเผยแพร่ 2 ชื่อโฮสต์ที่ชี้ไปที่ IP เดียวกันคุณจะได้รับความขัดแย้งในเรคคอร์ด DNS ย้อนกลับ

เป็นไปได้ที่จะทำเช่นนี้หากคุณใช้ Avahi API เพื่อเผยแพร่ระเบียน A ด้วยตนเองและทำเครื่องหมายเป็นแบบไม่ผูกขาด คุณจะต้องเขียนกระบวนการพื้นหลังเล็ก ๆ สำหรับแต่ละเซิร์ฟเวอร์ใน Python, C หรือคล้ายกัน

การเรียกใช้ API คือ avahi_entry_group_add_record และคุณต้องผ่าน AVAHI_PUBLISH_ALLOW_MULTIPLE ในฟิลด์ค่าสถานะ สิ่งนี้น่าจะใช้ได้

อีกทางเลือกหนึ่งคือใช้การค้นพบบริการตามที่ตั้งใจไว้และให้ลูกค้าแต่ละรายเผยแพร่บริการ HTTP และใช้ปลั๊กอิน Firefox หรือคล้ายกันเพื่อเรียกดูบริการเว็บที่ประกาศ หรือเบราว์เซอร์บริการประเภทอื่น

Bonjour เคยรวมปลั๊กอินสำหรับ Internet Explorer เพื่อทำสิ่งนี้เช่นแถบบุ๊กมาร์กฉันไม่แน่ใจว่ามันยังทำอยู่หรือไม่


2
ฉันได้มันไปทำงานขอบคุณ! ในกรณีที่ใครสนใจฉันได้โพสต์ซอร์สโค้ด C ที่นี่: public.msli.com/lcs/jaf/publish_cnames.c
Jeremy Friesner

ฮึ่ม ที่ดูเหมือนจะไม่ทำงานกับ avahi รุ่นที่ใหม่กว่า :( โปรแกรมพิมพ์ว่ามีการเผยแพร่ชื่อสำเร็จแล้ว แต่จะไม่ปรากฏขึ้นเมื่อเรียกดูจากโฮสต์อื่นบนเครือข่าย
Frederick Nord
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.