ตามคำขอ DNS ทีละฮอปเพื่อหาแหล่งต้นทางที่แท้จริง
ที่อยู่รีโซลเวอร์ที่ถูกผลักลงไปให้ไคลเอนต์ไม่ได้กำหนดว่าฮอปใดที่รีโซลเวอร์จะเห็น ให้ตามไคลเอนต์ ฟอร์เวิร์ดเดอร์ และเซิร์ฟเวอร์ที่รับ แล้วจดเส้นทางไว้
การให้ที่อยู่รีโซลเวอร์แก่ไคลเอนต์กำหนดว่าคำขอจะถูกส่งไปที่ไหน ไม่ได้กำหนดว่ารีโซลเวอร์จะเห็นแหล่งใด การกำหนดเส้นทาง การส่งต่อ และการแปลงที่อยู่ต่างมีบทบาทสลับกันระหว่างปลายทั้งสองข้าง คู่มือสำหรับคำถามเรื่องแหล่งที่มาจะตามคำขอทีละฮอปและบันทึกว่าผู้สังเกตแต่ละจุดเห็นอะไรจริง ลำดับมีความสำคัญ เพราะข้อสรุปที่ตั้งไว้ก่อนการสังเกตเป็นเพียงการเดาที่จัดรูปแบบดีกว่าเดิม
จดการจัดวางไว้ก่อนเริ่มเก็บหลักฐาน
มีสี่จุดที่บอกอะไรบางอย่างเกี่ยวกับแหล่งของ DNS ได้ และไม่ใช่ทุกจุดที่บอกเหมือนกัน เคอร์เนลของไคลเอนต์รู้ว่าจะใช้แหล่งใด ฟอร์เวิร์ดเดอร์รู้ว่าส่งอะไรขึ้นไปด้านบน อุปกรณ์ที่แปลงรู้ว่าตนเขียนอะไรใหม่ และรีโซลเวอร์ที่รับรู้ว่าอะไรมาถึง จดว่าคุณเข้าถึงจุดใดได้จริงก่อนจะเก็บอะไรสักอย่าง
| Observation point | What it can prove | What it cannot prove | How to read it |
|---|---|---|---|
| client kernel | which source address it would use for that resolver | anything a device in between rewrote | ip route get against the resolver address |
| forwarder | that it sent an upstream query, and from which source | what the client originally asked for | its own log and its cache state |
| translating device | that a source was rewritten, and to what | whether the query was legitimate | NAT policy and its counters |
| receiving resolver | the address that actually arrived | which client behind that address asked | a 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
ดักจับบนโฮสต์ของรีโซลเวอร์ ให้การดักจับสั้นและจำกัดขอบเขต และเก็บไว้ในที่ที่นโยบายอนุญาต หากแหล่งที่สังเกตได้เป็นที่อยู่ที่ถูกแปลง คำถามถัดไปคืออุปกรณ์ใดทำการแปลง และนโยบายของอุปกรณ์นั้นใช่สิ่งที่ตั้งใจไว้หรือไม่ การดักจับตอบว่าอะไรมาถึง แต่ไม่อธิบายว่าทำไมนโยบายจึงอนุญาต ระบุผู้สังเกตและฮอปในบันทึก เพราะข้อสรุปเรื่องความเป็นส่วนตัวเกี่ยวกับเกตเวย์เป็นข้อสรุปเกี่ยวกับฮอปนั้น ไม่ใช่ทั้งเส้นทาง
เขียนข้อค้นพบเป็นเส้นทาง ไม่ใช่ที่อยู่
บันทึกไคลเอนต์ รีโซลเวอร์ ฟอร์เวิร์ดเดอร์ใด ๆ แหล่งที่สังเกตได้ในแต่ละฮอป และนโยบายที่กำกับมัน บันทึกเช่นนั้นตอบคำถามในอนาคตส่วนใหญ่ได้โดยไม่ต้องดักจับอีก วาดเป็นลูกโซ่ เพราะรายการที่อยู่ซ่อนว่าฮอปใดให้กำเนิดสิ่งใด
แนบวันที่ เวอร์ชันไคลเอนต์ และการแก้ไขการตั้งค่าไว้กับภาพ เพื่อให้ผู้อ่านภายหลังบอกได้ว่ายังใช้ได้อยู่หรือไม่ แยกแหล่งของการรับส่งออกจากทุกสิ่งอื่นที่บริการประมวลผล เพราะการเห็นที่อยู่เกตเวย์ไม่ได้บอกอะไรเกี่ยวกับสิ่งที่ถูกเก็บไว้อื่น ๆ ตำแหน่งของรีโซลเวอร์ก็ไม่ได้บอกว่าไคลเอนต์ใดเป็นผู้ถาม การแยกข้อสรุปเหล่านี้ไว้จากกันคือสิ่งที่ทำให้ข้อสรุปทนต่อการตรวจทาน