2 คะแนน โดย GN⁺ 2023-09-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • บทความอธิบายวิธีที่ 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 ความคิดเห็น

 
GN⁺ 2023-09-11
ความคิดเห็นบน Hacker News
  • บทความเกี่ยวกับวิธีที่ Linux NAT จัดการคำขอ ping
  • เซิร์ฟเวอร์ส่งแพ็กเก็ต ICMP echo request แบบคงที่ไปยังที่อยู่คงที่ และคาดว่าแพ็กเก็ตนี้จะไม่ถูกส่งกลับมา
  • เมื่อไคลเอนต์พยายามเชื่อมต่อ ไคลเอนต์จะส่งแพ็กเก็ต ICMP time exceeded ไปยังเซิร์ฟเวอร์ โดยมีแพ็กเก็ตคงที่ "ต้นฉบับ" ที่เซิร์ฟเวอร์เคยส่งแนบมาด้วย
  • ไคลเอนต์ทำตัวเสมือนเป็น hop บนอินเทอร์เน็ต เพื่อแจ้งเซิร์ฟเวอร์ว่าแพ็กเก็ตต้นฉบับไม่สามารถถูกส่งต่อได้
  • อุปกรณ์ NAT จะส่งต่อ ICMP time exceeded ไปยังเซิร์ฟเวอร์ที่อยู่หลัง NAT พร้อมทั้งรวม IP header ทั้งหมดของไคลเอนต์ไว้ด้วย ทำให้เซิร์ฟเวอร์ทราบที่อยู่ IP ของไคลเอนต์ได้
  • เมื่อมีการส่ง ping จากเครือข่ายภายในไปยังอุปกรณ์บนอินเทอร์เน็ต เราเตอร์ที่ทำ NAT จะเขียนซ้ำ source address ของ ping ให้เป็น public IP address และเขียนซ้ำฟิลด์ ID ของแพ็กเก็ต ICMP ให้เป็นค่าที่ไม่ซ้ำกัน
  • เราเตอร์ใช้ค่า ID ที่ไม่ซ้ำกันนี้เพื่อส่งคำตอบกลับไปยังอุปกรณ์ที่ถูกต้องในเครือข่ายภายใน
  • โพสต์ยังมีข้อมูลอ้างอิงเกี่ยวกับเครื่องมือชื่อ Netfilter ที่ใช้สำหรับแก้ไขแพ็กเก็ต, network address translation และ packet filtering
  • บทความนี้ได้รับคำชมว่าเจาะลึกการวิเคราะห์ในทุกชั้นของ abstraction จนถึงระดับ source code
  • เนื่องจาก ICMP ไม่มีพอร์ต NAT จึงไม่ต้องจัดการปัญหาการส่ง ICMP echo reply กลับไปยังพอร์ตที่ถูกต้อง
  • ICMP echo request มี ID ซึ่งทำหน้าที่แทบจะเหมือนกับหมายเลข source port
  • การจัดการ NAT สำหรับ ICMP echo จึงต้องรีแมป ID ไปกลับทั้งสองทิศทาง คล้ายกับที่ UDP รีแมป source port
  • ผู้ใช้บางคนแสดงความไม่พอใจต่อการลิงก์ไปยังบรรทัดโค้ดเฉพาะในบล็อกโพสต์ เพราะโค้ดอาจเปลี่ยนไปตามเวลา
  • ผู้ใช้บางคนวิจารณ์ว่า NAT เป็น abstraction ที่ไม่ดี และเรียกร้องให้ยุติการใช้ IPv4
  • มีการคาดเดาถึงความเป็นไปได้ในการใช้ ping ผ่าน UDP เพื่อส่งข้อความสั้น ๆ สำหรับเครือข่ายแบบ peer-to-peer โดยไม่ต้องมีเซิร์ฟเวอร์กลาง
  • สรุปได้ว่าบทความอธิบายว่าแพ็กเก็ต ICMP มีฟิลด์ ID และ Netfilter จัดการแพ็กเก็ต ICMP เป็น "กรณีพิเศษ"