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

จดการจัดวางไว้ก่อนเริ่มเก็บหลักฐาน

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

Observation pointWhat it can proveWhat it cannot proveHow to read it
client kernelwhich source address it would use for that resolveranything a device in between rewroteip route get against the resolver address
forwarderthat it sent an upstream query, and from which sourcewhat the client originally asked forits own log and its cache state
translating devicethat a source was rewritten, and to whatwhether the query was legitimateNAT policy and its counters
receiving resolverthe address that actually arrivedwhich client behind that address askeda scoped capture on port 53

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

ตรวจสอบว่ากระบวนการใดเป็นผู้ส่งคำขอจริง

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

ss -tunp 'dport = :53'
dig @10.20.30.53 host.corp.example +noall +answer
ip route get 10.20.30.53

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

เก็บชื่อทดสอบไว้ภายใน เพราะชื่อภายในที่ส่งไปยังรีโซลเวอร์สาธารณะไม่ได้พิสูจน์อะไรเกี่ยวกับเส้นทางภายใน และยังเผยแพร่ชื่อที่คุณไม่จำเป็นต้องเผยแพร่ เบราว์เซอร์ที่เปิด DNS แบบปลอดภัยจะไม่ปรากฏในรายการซ็อกเก็ตนั้นเลย และการไม่มีอยู่นั้นเองคือคำตอบ

ฟอร์เวิร์ดเดอร์ส่งคำขอที่สองแยกต่างหาก

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

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

อ่านแหล่งที่มาที่รีโซลเวอร์ผู้รับ

การสังเกตเดียวที่ชี้ขาดเรื่องนี้เกิดขึ้นฝั่งเซิร์ฟเวอร์ สิ่งใดก็ตามที่อนุมานจากรายการอินเทอร์เฟซของไคลเอนต์ยังคงเป็นสมมติฐานจนกว่ารีโซลเวอร์จะรายงานว่าอะไรมาถึงจริง

tcpdump -ni any port 53 and host 10.20.30.53

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

เขียนข้อค้นพบเป็นเส้นทาง ไม่ใช่ที่อยู่

บันทึกไคลเอนต์ รีโซลเวอร์ ฟอร์เวิร์ดเดอร์ใด ๆ แหล่งที่สังเกตได้ในแต่ละฮอป และนโยบายที่กำกับมัน บันทึกเช่นนั้นตอบคำถามในอนาคตส่วนใหญ่ได้โดยไม่ต้องดักจับอีก วาดเป็นลูกโซ่ เพราะรายการที่อยู่ซ่อนว่าฮอปใดให้กำเนิดสิ่งใด

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

บทความที่เกี่ยวข้อง