บังคับให้ส่งต่อ DNS ไปยังโหมด TCP


9

ฉันได้ตั้งค่า DNS-server บน SLES10 (ปัจจุบันผูก 9.6) บนเซิร์ฟเวอร์หลาย homed เซิร์ฟเวอร์นี้สามารถสอบถามจากเครือข่ายภายในทั้งหมดและส่งคำตอบสำหรับเครือข่ายภายในทั้งหมด เรามี DNS "master" สองโซนแยกกัน แต่ละโซนเหล่านี้มีการให้บริการโดย Windows-DNS-servers ที่เชื่อถือได้จำนวนหนึ่ง

ตอนนี้ linux-server ของฉันเป็นเซิร์ฟเวอร์ DNS รองสำหรับหนึ่งในโซนเหล่านี้ (โซนภายในส่วนตัว) และทำหน้าที่เป็นตัวส่งต่อสำหรับโซนอื่น (โซนภายในสาธารณะ)

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

;; ถูกตัดทอนพยายามใหม่ในโหมด TCP

wireshark-dump เปิดเผยสาเหตุของสิ่งนี้: เคียวรีแรกออกไปในโหมด UDP คำตอบไม่เหมาะกับ UDP (เนื่องจากรายการ longish ของ NS ที่มีสิทธิ์แบบยาว) จากนั้นจะลองใหม่ในโหมด TCP ส่งคำตอบที่ถูกต้อง

ตอนนี้คำถาม: ฉันสามารถกำหนดค่าการผูกของฉันเพื่อสอบถามตัวส่งต่อในโหมด TCP โดยไม่ลองใช้ UDP ก่อนหรือไม่

อัปเดต: ลองใช้ ASCII-art ...

+--------------+   +--------------+   +-----------------+
| W2K8R2 DNS   |   | SLES 10 DNS  |   | W2K8R2 DNS      |
| Zone private +---+ All internal +---+ Zone public     |
| internal 2x  |   |   Zones      |   | internal 30+ x  |
+--------------+   +-+----------+-+   +-----------------+
                     |          |
                  +--+---+   +--+---+
                  |Client|   |Client|
                  +------+   +------+

แผนภาพขนาดเล็กของสิ่งนี้จะมีประโยชน์ - ฉันกำลังพยายามหาเซิร์ฟเวอร์ที่มาจากคำอธิบายของคุณ
Alnitak

ค่อนข้างจะดีกว่าแม้ว่าจะยังไม่ชัดเจนว่าโฮสต์ที่คุณใช้งานhostคำสั่งนี้อยู่ตรงไหนและมีการส่งแบบสอบถามใด
Alnitak

ลูกค้าขอผ่าน SLES10 รายการจากโซนสาธารณะภายใน โซนส่วนตัวภายในไม่ประสบ - เนื่องจากมีรายการ NS เพียง 2 รายการเท่านั้น
นิลส์

และลูกค้าเป็นเพียงตัวแก้ไขสตับธรรมดา?
Alnitak

ขอแนะนำให้คุณเพิ่มminimal-responses: yesการกำหนดค่า BIND ใน SLES 10 ซึ่งอาจลดขนาดการตอบสนอง ในกรณีใด ๆ แบบสอบถามทั่วไปส่วนใหญ่จะไม่เกินขีด จำกัด 512 ไบต์
Alnitak

คำตอบ:


8

ครั้งแรกฉันจะไม่เรียกว่าข้อผิดพลาดเพียงข้อความที่ให้ข้อมูล

ประการที่สองเซิร์ฟเวอร์ DNS จะตอบแบบสอบถาม UDP เสมอ (ผูกอย่างน้อยฉันไม่พบตัวเลือกในการปิดการใช้งาน UDP) และลูกค้าจะเสมอ (?) พยายามส่งแบบสอบถาม UDP ก่อน (เช่นไม่มีตัวเลือกใน resolv.conf เพื่อเปลี่ยน หรือใน JVM) - ถ้ามันพอดีกับแพ็กเก็ต UDP (โดยปกติแล้วการร้องขอ)

หากคุณมีกรณีการใช้งานเฉพาะคุณสามารถระบุการใช้ TCP เช่นในเชลล์สคริปต์ใช้ 'dig + tcp' หรือ 'host -T' สำหรับการแก้ปัญหาและคุณสามารถใช้การเรียกของระบบ 'sethostent / gethostbyname / endhostent' (ดู man หน้า) เพื่อบังคับใช้ TCP ในกรณีอื่น ๆ

หากคุณต้องการลองและบล็อก UDP ตัวเลือกเดียวที่ฉันเห็นคือกฎ iptable แต่ฉันไม่แน่ใจว่าการตั้งค่านั้นจะใช้งานได้ ฉันคาดว่าการแก้ไข DNS จะล้มเหลว


มีประสิทธิภาพการใช้งานในนามในนามของการรู้เบื้องต้นว่าแบบสอบถาม UDP จะล้มเหลวและลองผ่าน TCP ก่อน ดู RFC 5966 สำหรับการสนทนาบางอย่าง
Alnitak

@ Alnitak และฉันต้องการได้รับประโยชน์นั้น
นิลส์

1
@Nils ดังนั้นเราต้องคิดออกว่าทำไม EDNS เห็นได้ชัดว่าไม่ทำงาน ...
Alnitak

ฉันไม่มีกรณีใช้งานพิเศษ - ลูกค้าจะใช้ไลบรารีตัวแก้ไขของพวกเขา - แต่คำขอแต่ละคำตอบแต่ละคำตอบจะผ่านเครือข่ายสองครั้ง - ฉันไม่ชอบมัน
นิลส์

@ ไม่มีปัญหาคือลูกค้าตัดสินใจใช้ UDP / TCP แต่เซิร์ฟเวอร์รู้ขนาดของคำตอบ
Dan Andreatta

4

เซิร์ฟเวอร์ BIND ของคุณควรใช้ EDNS (ดู RFC 2671) เพื่ออนุญาตให้แพ็กเก็ต UDP ยาวกว่า 512 ไบต์

options {
    edns-udp-size 4096;
    max-udp-size 4096;
};

สิ่งนี้จะทำให้ชุด NS ขนาดใหญ่ของคุณถูกเรียกคืนผ่าน UDP โดยไม่ต้องใช้โอเวอร์เฮดของการเชื่อมต่อ TCP สำหรับการสืบค้นขนาดเล็กอื่น ๆ

โปรดทราบว่าสิ่งเหล่านี้เป็นค่าเริ่มต้นจริง ๆ หากไม่ได้ใช้ EDNS อาจมีบางอย่างกำลังบล็อกหรือเซิร์ฟเวอร์ที่รับตัวเลือก EDNS ไม่สนับสนุน

นอกจากนี้โปรดทราบว่าhostไม่รองรับ EDNS เป็นไปได้อย่างสมบูรณ์แบบที่ผู้ส่งของคุณ -> เซิร์ฟเวอร์สอบถามได้ใช้ EDNS อยู่แล้วและคุณไม่สามารถเห็นมันเมื่อคุณลองกับลูกค้าในพื้นที่ของคุณ

ลองแทนการใช้dig +bufsize=4096 @server hostname Ahost


ใครควรใช้สิ่งนี้ เป็นไปได้ทั้งเซิร์ฟเวอร์และผู้ส่งต่อของฉันจากโซน "สาธารณะภายใน"
นิลส์

ความรู้สึกของการส่งรายการที่สมบูรณ์ของ NS ในคำตอบคืออะไร?
นิลส์

@ ไม่มีโปรโตคอล DNS ต้องการให้ชุดรายการทั้งหมดที่ตรงกับ tuple (QNAME, QTYPE และ QCLASS) เดียวกันนั้นไม่สามารถแยกออกได้ (aka "RRset")
Alnitak

คุณช่วยบอกฉันถึง RFC เกี่ยวกับ RRset นี้ได้ไหม
นิลส์

1
โฮสต์ Actaully ใช้ไลบรารีตัวแก้ไขมาตรฐานและบนเวิร์กสเตชันของฉันรองรับ EDNS0 ในการทดสอบว่าคำขอระบุ EDNS0 หรือไม่ให้เรียกใช้ 'tcpdump -x port 53' และเลขฐานสิบหกควรมี (ไปทางท้ายสุดในส่วนเพิ่มเติม) ลำดับ 0029 1000 0000 8000 0000 ซึ่งเป็นตัวแทนไบนารีของ OPT RR
Dan Andreatta
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.