วันพฤหัสบดีที่ 15 ธันวาคม พ.ศ. 2554

NAT [STUN/TURN/ICE]

มาขอจด note กันลืม เรื่อง NAT traversal หน่อย [How to deal with final users / End-to-end tunnel ]

1. Nat มี 4 ประเภท แบบ fix/no fix port, fix/no fix IP ถ้าเป็นแบบที่ fix ทั้งหมด จะเรียกว่า symmetric nat ซึ่งจัดการยากที่สุด

1.1 Full cone => เหมือนกับทำ dynamic port forward เวลาส่งออก iAddr:iPort จะ map กับ eAddr:ePort แล้วส่งไปหา hAddr:hPort จากนั้น hAny:hAny สามารถส่งเข้ามาได้ iAddr:iPort ได้ แม้ว่าจะไม่เคยได้รับการติดต่อมาก่อน

1.2 Restrict cone => iAddr:iPort ส่ง packet ออกไปยังเครื่องใด ๆ ด้วย eAddr:ePort เช่น ส่งไปหา hAddr:hPort แล้ว hAddr:hAny สามารถส่งเข้ามาได้ iAddr:iPort ได้
( เวลา internal ส่งออก ไม่ว่าปลายทางเป็นเครื่องเครื่องไหน ใช้ eAddr:ePort แต่เครื่องนอก hAddr:hAny สามารถส่งกลับมาได้ ก็ต่อเมื่อเคยได้รับ packet จาก internal ก่อน)

1.3 Port Restrict cone => iAddr:iPort ส่ง packet ออกไปยังเครื่องใด ๆ ด้วย eAddr:ePort เช่น ส่งไปหา hAddr:hPort แล้ว hAddr:hPort สามารถส่งเข้ามาได้ iAddr:iPort ได้
( เวลา internal ส่งออก ไม่ว่าปลายทางเป็นเครื่องเครื่องไหน ใช้ eAddr:ePort แต่เครื่องนอก hAddr:hPort สามารถส่งกลับมาได้ ก็ต่อเมื่อเคยได้รับ packet จาก internal ก่อน)

1.4 Symmetric cone => iAddr:iPort ส่ง packet ออกไปยังเครื่องนอก ด้วยการ map port ที่ต่างกัน ไม่เหมือน 3 อันที่กล่าวมา คือ ไม่ว่าปลายทางเครื่องไหน ใช้ eAddr:ePort เสมอ แต่แบบ Symmetric จะ map port ใหม่ สำหรับ เครื่องปลายใหม่ ส่วนเวลาตอบกลับ hAddr:hPort สามารถส่งกลับมาได้ ก็ต่อเมื่อเคยได้รับ packet จาก internal ก่อนเท่านั้น


2. ใช้ application layer gateway / session border controller มาช่วยจัดการ (อ่านแล้วยัง งง ๆ ว่าตกลงมันต่างกันยังไงวะ) แต่ มัน deploy ยาก และ ไม่ scalability + more delays

3. Stun เข้ามาแก้ปัญหาเรื่อง nat แบบที่ไม่ใช่ symmetric โดยการใช้ เทคนิค UDP hole punching (จะใช้ tcp ก็ได้ แต่ไม่ค่อยนิยม และ ทำโอกาสสำเร็จมีน้อยกว่า) คือ ให้ client หลัง nat คุยกับ stun server ก่อน เป็นการเจาะรู เพื่อให้ ผู้ติดต่ออีกฝ่าย สามารถเข้าถึง client คนนี้ ผ่านทาง รู ที่เจาะไว้ โดยอาศัยข้อมูลจาก stun server กรณีนี้ ถ้าเป็น full cone ก็ติดต่อได้เลย หลังจาก เจาะรูแล้ว แต่ถ้าเป็น แบบ (port) restrict cone พอเจารูเสร็จ ทั้งคู่ จะต้องติดต่ออีกฝ่าย คนที่รับข้อมูลก่อน NAT จะ drop packet ทิ้ง เพราะถือว่าไม่เคยได้รับการติดต่อ ส่วนอีกคนที่ได้รับข้อมูลทีหลัง NAT จะปล่อยผ่าน เพราะถือว่า เคยส่งไปหาก่อน ทีนี้ก็จะสามารถติดต่อกันได้

4. กรณีที่อยู่หลัง nat ที่เป็น symmetric ทั้งคู่ ก็คล้าย ๆ กัน แต่ relay server จะต้อง forward packet ทุกอย่างไปให้ผู้ที่ติดต่อทั้ง 2 ฝ่าย (เพราะถ้าเปลี่ยน destination ตัว nat มันจะ map port ใหม่ เราเลยต้องมี relay ไว้ส่งต่อ packet) เราเรียกว่า TURN นั่นเอง = Stun + Relay extentions

5. ICE = STUN + TURNS , ICE เป็น protocol ที่คอยมาตรวจสอบว่า จำเป็นต้องใช้ Turn ด้วยหรือเปล่า แล้วก็จัดตั้งการสื่อสารขึ้นมา

แต่สุดท้ายหลักการก็เหมือนกัน ก็คือเจาะรู เข้า nat ไว้ก่อน แล้วก็ส่ง หมายเลข port ที่ใช้ในการติดต่อ ถ้ามัน restrict ทั้ง IP และ port เมื่อส่งหากันครั้งแรก package จะโดน drop ที่ฝั่งผู้รับที่ได้รับข้อมูลก่อน (เพราะมัน restrict) แต่พอ ฟังผู้รับส่งมาให้ผู้ส่ง คราวนี้จะไม่ drop ที่ฝ่ายส่งครั้งแรก เนื่องจาก ฝ่ายส่งได้เคยส่งข้อมูลหาไปแล้ว

อธิบายไว้ละเอียดที่นี่

ไม่มีความคิดเห็น: