- บทความอธิบายวิธีที่ Linux ทำการแปลงที่อยู่เครือข่าย (NAT) สำหรับคำสั่ง
ping ที่ใช้ Internet Control Message Protocol (ICMP)
- ผู้เขียนได้สำรวจโค้ดเครือข่ายของ Linux เพื่อทำความเข้าใจกลไกการทำงานของ NAT กับแพ็กเก็ต ICMP ซึ่งไม่มีฟิลด์พอร์ต
- ผู้เขียนตั้งค่าสภาพแวดล้อมทดลองโดยใช้ network namespace เพื่อจำลองอุปกรณ์หลายตัวบนเครื่อง Linux เพียงเครื่องเดียว และใช้คำสั่ง
ping เพื่อทดสอบกระบวนการ NAT
- การทดลองประกอบด้วยการสร้างไคลเอนต์สองตัวที่เชื่อมต่อกับบริดจ์ พร้อมเชื่อมต่อกล่อง NAT และเซิร์ฟเวอร์ รวมถึงการตั้งค่า routing และ NAT
- ผู้เขียนดักจับแพ็กเก็ต ICMP ใน network namespace ของไคลเอนต์และเซิร์ฟเวอร์ และวิเคราะห์ข้อมูลแพ็กเก็ต
- ผู้เขียนพบว่าแต่ละไคลเอนต์มีฟิลด์ "id" ต่างกัน ทำให้กล่อง NAT สามารถแยกแยะได้ว่าแพ็กเก็ตตอบกลับควรถูกส่งต่อไปยังไคลเอนต์ตัวใด
- ผู้เขียนศึกษาซอร์สโค้ดของ Linux และ RFC 792 ซึ่งกำหนดโปรโตคอล ICMP เพื่อทำความเข้าใจว่า ID ถูกเลือกอย่างไร
- ผู้เขียนพบว่าคำสั่ง
ping จะสุ่มเลือก identifier และหากโปรเซส ping สองตัวจากโฮสต์ต่างกันเลือก ID เดียวกัน Linux kernel จะสุ่มพอร์ตว่างหนึ่งพอร์ตขึ้นมา และใช้พอร์ตนั้นเป็น ID ของแพ็กเก็ต ICMP
- ผู้เขียนใช้เครื่องมือชื่อ
bpftrace เพื่อติดตามฟังก์ชันของ kernel และตรวจสอบความเข้าใจเกี่ยวกับโค้ด netfilter
- บทสรุปของบทความคือ Linux ทำ NAT ให้
ping โดยสร้างการเชื่อมต่อสำหรับแต่ละไคลเอนต์ เขียนทับ source IP address และ/หรือฟิลด์ ICMP id ในแพ็กเก็ตขาออก จากนั้นจึงย้อนการแก้ไขเหล่านี้ในแพ็กเก็ตตอบกลับ
- บทความให้คำอธิบายแบบละเอียดทีละขั้นตอนของกระบวนการ เพื่อให้วิศวกรซอฟต์แวร์ระดับเริ่มต้นที่มีพื้นฐานด้านเทคนิคสามารถเข้าถึงได้
1 ความคิดเห็น
ความคิดเห็นบน Hacker News