← กลับไปยังบทความทั้งหมด

การเจาะรู UDP (UDP Hole Punching)

สรุปใจความสำคัญ

  • เป็นการเทคนิคการสร้างการเชื่อมต่อแบบ Peer-to-Peer ระหว่างโฮสต์ที่อยู่เบื้องหลัง NAT
  • ต้องใช้เซิร์ฟเวอร์บุคคลที่สาม (STUN server) ในการช่วยแลกเปลี่ยนที่อยู่ IP และพอร์ตภายนอก
  • ไม่สามารถใช้งานได้กับ Symmetric NAT เนื่องจากมีการจำกัดการรับข้อมูลอย่างเข้มงวด
  • จำเป็นต้องมีการส่งแพ็กเก็ต Keep-alive เพื่อป้องกันไม่ให้สถานะพอร์ตใน NAT หมดอายุ

การเจาะรู UDP (UDP Hole Punching) คือเทคนิคที่ใช้ในแอปพลิเคชันที่ต้องมีการทะลุผ่านการแปลที่อยู่เครือข่าย (Network Address Translation หรือ NAT) เพื่อรักษาการไหลของแพ็กเก็ตโปรโตคอล UDP (User Datagram Protocol) ให้สามารถสื่อสารกันได้โดยตรงระหว่างโฮสต์สองเครื่องที่อยู่เบื้องหลัง NAT

โดยปกติแล้ว เทคนิคการทะลุผ่าน NAT (NAT Traversal) จะมีความจำเป็นอย่างยิ่งสำหรับแอปพลิเคชันเครือข่ายแบบไคลเอนต์ถึงไคลเอนต์ (Client-to-Client) บนอินเทอร์เน็ต ซึ่งโฮสต์เชื่อมต่ออยู่ในเครือข่ายส่วนตัว เช่น การใช้งานในระบบ Peer-to-Peer (P2P), การเชื่อมต่อแบบ Direct Client-to-Client (DCC) และการใช้งาน Voice over Internet Protocol (VoIP)

หลักการทำงานของการเจาะรู UDP

การเจาะรู UDP มีวัตถุประสงค์เพื่อสร้างการเชื่อมต่อแบบสองทิศทางระหว่างโฮสต์ในเครือข่ายส่วนตัว โดยใช้โฮสต์บุคคลที่สาม (Third-party host) ที่อยู่บนเครือข่ายสาธารณะเพื่อช่วยในการสร้างสถานะพอร์ต (Port state) ซึ่งจะทำให้โฮสต์ทั้งสองสามารถสื่อสารกันได้โดยตรงในเวลาต่อมา

เนื่องจากสถานะของ UDP มักจะหมดอายุในระยะเวลาอันสั้น (ประมาณหลายสิบวินาทีถึงไม่กี่นาที) และพอร์ต UDP จะถูกปิดลงในกระบวนการนี้ การเจาะรู UDP จึงต้องมีการส่งแพ็กเก็ต Keep-alive เป็นระยะๆ เพื่อต่ออายุตัวนับเวลาในสถานะเครื่องจักร (State machine) ของ NAT

แผนภาพลำดับข้อความของการเจาะรู UDP
แผนภาพแสดงลำดับการส่งข้อความเพื่อสร้างการเชื่อมต่อแบบ UDP Hole Punching ระหว่างโฮสต์ A และ B ผ่านเซิร์ฟเวอร์กลาง S

ขั้นตอนการสร้างการเชื่อมต่อ (Flow)

สมมติให้ A และ B เป็นโฮสต์ที่มีที่อยู่ IP ภายใน (iAddrA และ iAddrB) โดยแต่ละเครื่องอยู่ในเครือข่ายส่วนตัวของตนเอง และมีอุปกรณ์ NAT (NA และ NB) ที่มีที่อยู่ IP ภายนอก (eAddrA และ eAddrB) โดยมี S เป็นเซิร์ฟเวอร์สาธารณะที่มีที่อยู่ IP ที่ทราบแน่ชัด

  1. การเริ่มต้น: A และ B เริ่มการสนทนา UDP กับเซิร์ฟเวอร์ S ทำให้อุปกรณ์ NAT (NA และ NB) สร้างสถานะการแปล UDP และกำหนดหมายเลขพอร์ตภายนอกชั่วคราว (ePortA และ ePortB)
  2. การแลกเปลี่ยนข้อมูล: เซิร์ฟเวอร์ S ตรวจสอบแพ็กเก็ต UDP เพื่อหาพอร์ตต้นทางที่ใช้โดย NA และ NB จากนั้น S จะแจ้งให้ B ทราบถึงค่า eAddrA:ePortA และแจ้งให้ A ทราบถึงค่า eAddrB:ePortB
  3. การเจาะรู: A ส่งแพ็กเก็ตไปยัง eAddrB:ePortB และ B ส่งแพ็กเก็ตไปยัง eAddrA:ePortA (ไม่จำเป็นต้องส่งพร้อมกันหรือตามลำดับที่แน่นอน)
  4. การสร้างตารางการแปล: เมื่อแพ็กเก็ตออกจากเครือข่ายส่วนตัว อุปกรณ์ NAT แต่ละเครื่องจะเพิ่มรายการในตารางการแปล (Translation table) เช่น NA จะสร้างรายการใหม่สำหรับการจราจรจาก A ไปยัง B โดยใช้การแปลเดิมที่เคยใช้กับ S
  5. การสื่อสารโดยตรง: หากรายการในตารางการแปลของ NA ถูกสร้างขึ้นก่อนที่แพ็กเก็ตจาก B จะมาถึง NA จะอนุญาตให้แพ็กเก็ตจาก B ผ่านเข้าไปหา A ได้ ในทำนองเดียวกันกับ NB และ A

ข้อจำกัดและประสิทธิภาพ

การเจาะรู UDP ไม่สามารถใช้งานได้ในทุกสถานการณ์หรือกับ NAT ทุกประเภท เนื่องจากลักษณะการทำงานของ NAT ไม่ได้เป็นมาตรฐานเดียวกัน

  • Symmetric NAT: เทคนิคนี้จะไม่ทำงานกับอุปกรณ์ Symmetric NAT (หรือ Bi-directional NAT) ซึ่งมักพบในเครือข่ายองค์กรขนาดใหญ่ เนื่องจาก Symmetric NAT จะจำกัดการรับข้อมูลจากเซิร์ฟเวอร์ STUN ที่ทราบเท่านั้น ทำให้การจับคู่พอร์ตที่เซิร์ฟเวอร์เห็นไม่สามารถนำไปใช้สื่อสารกับโฮสต์อื่นได้
  • Restricted Cone NAT: ในกรณีนี้ แพ็กเก็ตแรกจากโฮสต์ปลายทางจะถูกบล็อก แต่หลังจากที่ NAT มีบันทึกว่ามีการส่งแพ็กเก็ตไปยังเครื่องปลายทางนั้นแล้ว NAT จะอนุญาตให้แพ็กเก็ตที่ส่งมาจาก IP และพอร์ตนั้นผ่านเข้ามาได้

นอกจากนี้ เทคนิคนี้ยังถูกนำไปประยุกต์ใช้กับ TCP แม้ว่าจะประสบความสำเร็จน้อยกว่า เนื่องจากกระแสการเชื่อมต่อของ TCP ถูกควบคุมโดยระบบปฏิบัติการของโฮสต์ ไม่ใช่แอปพลิเคชัน และมีการสุ่มหมายเลขลำดับ (Sequence numbers) ทำให้อุปกรณ์ NAT ที่มีการตรวจสอบหมายเลขลำดับจะมองว่าแพ็กเก็ตดังกล่าวไม่ได้เกี่ยวข้องกับการเชื่อมต่อที่มีอยู่และทำการทิ้งแพ็กเก็ตนั้นไป

เครื่องมือที่เกี่ยวข้อง

โฮสต์ในเครือข่ายส่วนตัวมักใช้เครื่องมือดังต่อไปนี้เพื่อระบุที่อยู่สาธารณะของ NAT:

  • STUN (Session Traversal Utilities for NAT): ใช้เพื่อค้นหาที่อยู่ IP สาธารณะและพอร์ตที่ NAT กำหนดให้
  • ICE (Interactive Connectivity Establishment): กรอบการทำงานที่ใช้ STUN และ TURN เพื่อค้นหาเส้นทางการเชื่อมต่อที่ดีที่สุดระหว่างสองโฮสต์

คำถามที่พบบ่อย

UDP Hole Punching คืออะไร?

คือเทคนิคที่ช่วยให้คอมพิวเตอร์สองเครื่องที่อยู่เบื้องหลัง NAT (Network Address Translation) สามารถสื่อสารกันได้โดยตรงผ่านโปรโตคอล UDP โดยไม่ต้องผ่านเซิร์ฟเวอร์กลางตลอดเวลา

ทำไมต้องใช้เซิร์ฟเวอร์กลางในการเจาะรู UDP?

เพราะโฮสต์ที่อยู่เบื้องหลัง NAT จะไม่ทราบที่อยู่ IP สาธารณะและพอร์ตภายนอกของตนเอง จึงต้องใช้เซิร์ฟเวอร์สาธารณะ (เช่น STUN server) เพื่อช่วยบอกที่อยู่ดังกล่าวและแลกเปลี่ยนข้อมูลกับอีกฝ่าย

UDP Hole Punching ใช้งานได้กับ NAT ทุกประเภทหรือไม่?

UDP Hole Punching ไม่สามารถใช้งานได้กับ Symmetric NAT ซึ่งมักพบในเครือข่ายบริษัทขนาดใหญ่ เนื่องจาก NAT ประเภทนี้จะเปลี่ยนพอร์ตภายนอกทุกครั้งที่มีการเชื่อมต่อกับปลายทางที่ต่างกัน

จะเกิดอะไรขึ้นถ้าไม่มีการส่งแพ็กเก็ต Keep-alive?

หากไม่มีการส่งแพ็กเก็ต Keep-alive สถานะการเชื่อมต่อในตารางการแปลของ NAT จะหมดอายุและพอร์ตจะถูกปิดลง ทำให้การสื่อสารระหว่างโฮสต์ทั้งสองขาดหายไป