Network Address Translation คืออะไร? แล้วใช้ทำไม?

ในระบบ internet ที่เราใช้งานอยู่ในปัจจุบัน ทำงานอยู่บนมาตรฐาน TCP/IP โดยใน TCP/IP layer ที่ 3 หรือ Network layer  ทำหน้าที่หลักคือ addressing (ระบุตัวตนของ client) และ routing (นำส่งข้อมูลไปให้ปลายทาง) ในส่วนของ addressing มีส่วนหลักคือ IP Address ถ้าเราไม่มี IP Address แล้วเราก็จะไม่สามารถรู้ได้ว่าใครเป็นคนส่งข้อมูลนี้ให้กับใคร เมื่อตอน TCP/IP ถูกสร้างขึ้นมา IP Address ถูกกำหนดเป็นเลขฐาน 2 ขนาด 8 bits จำนวน 4 ชุด ที่แต่ล่ะชุด คั่นด้วย . อย่างเช่น 14.234.0.1 ซึ่งเราเรียกว่า IPv4 โดยจะมี address ได้ทั้งหมดประมาณ 4.3 พันล้าน address (เลข 2^8 จำนวน 4 ชุดก็คือ 2^32)

แต่เมื่อเวลาผ่านไป มีจำนวนผู้ใช้งานมากขึ้นเรื่อยๆ ทำให้ขนาดของ IPv4 นั้นไม่เพียงพอกับคนทั้งโลก พอมาถึงจุดนี้เราจะทำอย่างไรล่ะ ในเมื่อจำนวน address มันมีไม่พอ แต่ถ้าไม่มี address เราก็จะไม่สามารถคุยกับคนบน internet ได้ NAT หรือ Network Address Translation จึงเกิดขึ้นมา เพื่อช่วยให้โลกของ internet ยังดำเนินต่อไปไดั ซึ่งผลพวงนี้ลากยาวมาจนถึงมาตรฐานใหม่อย่าง IPv6 ด้วย ทั้งที่ IPv6 มีขนาด address มากกว่า IPv4 หลายเท่าตัว (IPv6 มี 128 bits เทียบกับ IPv4 ที่ 32 bits) ซึ่งมันพร้อมพร้อมที่จะมาแทน IPv4 มาหลายนานปี แต่ในเมื่อ NAT มันยังทำให้ IPv4 ใช้ได้ต่อไป เราก็เลยยังไม่เห็นการใช้ IPv6 แบบเต็มรูปแบบสักที

แล้วมันคืออะไรนะ

NAT ถูกสร้างขึ้นมาเพื่อประหยัดการใช้ IP Address ถ้าเราลองคิดดูว่าถ้าทุกคนต้องใช้ internet โดยทุกคนบนโลกจะต้องไม่มีเลข IP Address ที่ซ้ำกัน ไม่ว่าจะทำอย่างไรก็ไม่สามารถมีผู้ใช้เกิน 4.3 พันล้านผู้ใช้ได้ ดังนั้นจึงมีการแบ่ง IP Address ออกเป็น 2 แบบคือ

  1. Private IP address  ใช้สำหรับภายในสถานที่หนึ่ง อย่างเช่น บ้าน โรงเรียนหรือองค์กร โดยเราจะใช้อยู่แค่ภายในเท่านั้น ดังนั้นหลายๆ องค์กรก็สามารถที่จะใช้ private IP address เดียวกันได้ โดยไม่มีปัญหา เนื่องจากว่าเราใช้กันแค่ในภายในองค์กรเท่านั้น
  2. Public IP address ใช้เพื่อการติดต่อสื่อสารกันใน internet โดยทุกๆ คนในระบบ internet จะต้องมี address ที่ไม่เหมือนกัน เพื่อที่ข้อมูลจะถูกส่งไปให้ผู้รับที่ถูกต้อง (ลองนึกภาพว่าคน 2 คนมีชื่อและที่อยู่เหมือนกัน ไปรษณีก็คงส่งของไม่ถูกเหมือนกัน)  โดย public IP address ก็จะอยู่ในช่วงที่ไม่ใช่ private ip address

แล้วถ้าเครื่องที่มี Private IP ต้องการจะออกไปท่องโลกหล่ะ ? นี่แหละคือหน้าที่ของ NAT หรือ Network Address Translation โดย NAT จะทำหน้าที่แปลง Private IP ให้เป็น Public IP เพื่อที่จะออกไปสู่ internet ได้ โดยปกติแล้ว NAT จะอยู่ที่เดียวกับ Gateway ก่อนที่ข้อมูลจะถูกส่งออกไปยัง internet เพื่อที่จะคอยทำหน้าที่แปลง IP Address ก่อนจะส่งออกไป

แล้วมันทำงานยังไง

สมมติว่า Laptop A ที่มีแต่ private IP ต้องการส่ง request ไปที่ Web Server ที่มี IP เป็น 1.1.1.1 ข้อมูล packet ที่ Laptop A สร้างขึ้นมาก็จะมี IP address และ port ของผู้ส่งเป็น 192.168.1.5 และ 5555 โดยจะส่งไปยังผู้รับที่ 1.1.1.1 กับ 80

Packet นี้ก็จะถูกส่งจาก Laptop A ไปยัง Router เมื่อ Router เห็นว่า packet นี้ต้องการออกไปยัง network ภายนอก มันก็จะทำการ NAT โดยจดบันทึกไว้ใน NAT table ว่า packet นี้มาจาก internal IP และ port อะไร ต้องการจะไปที่ปลายทาง IP และ port อะไร รวมไปถึงว่า external IP และ port ที่จะนำไปแปลงให้กับ packet นี้เป็นอะไร ตามตัวอย่างนี้ NAT ได้ทำการใช้ IP address 2.2.2.2 กับ port 1111 สำหรับการแปลง packet ดังกล่าวนี้ โดย external IP จะนำมาจาก public IP ของ NAT ที่มีอยู่ ส่วน port นั้นสามารถ random ขึ้นมาได้เลย

ส่วนใหญ่แล้ว NAT จะมี external IP แค่อันเดียว โดยใช้การจำเลข port ไว้ว่า client ไหนใช้ port อะไรอยู่ เพื่อที่ web server ตอบกลับมาจะได้รู้ว่า packet นี้จะต้องนำไปส่งให้กับ client ไหน ซึ่งรู้ได้จากการดู NAT table ที่จดไว้ การทำงานแบบนี้เรียกว่า PAT หรือ Port Address Translation

NAT ยังสามารถทำงานได้อีกหลายแบบอย่างเช่น การ map internal IP กับ external IP แบบ 1 ต่อ 1 หรือว่าจะเลือก external IP จาก pool ขึ้นมาแบบสุ่มๆ ก็ได้ แต่แบบที่นิยมใช้มากที่สุดและประหยัด IP มากที่สุดก็คือ PAT

จะเห็นได้ว่าเมื่อ packet ผ่าน NAT ไปแล้ว IP และ port ของผู้ส่งจะถูกเปลี่ยนเป็นของ NAT แทน เนื่องจากเราไม่สามารถใช้ private IP กับ external network ได้

เมื่อ web server ได้รับ packet แล้ว ก็ทำการตอบกลับมาตาม IP address และ port ของ packet ที่มันได้รับมา ซึ่งก็คือ External IP และ port ของ NAT จะเห็นได้ว่า web server ไม่ได้รับรู้ถึง internal network ของ Laptop A เลย เนื่องจาก packet ที่ web server ได้รับนั้น ถูก NAT หรือ translate เรียบร้อยแล้ว

เมื่อ packet ที่ถูกตอบกลับมาจาก web server มาถึง NAT ก็จะทำการเช็คจาก NAT table ว่า packet นี้ถูกส่งเข้ามาที่ external IP และ port อะไร โดยในตัวอย่างนี้เป็น 2.2.2.2 และ 1111 NAT ก็จะรู้ได้ว่า packet นี้จะต้องถูกส่งต่อให้กับ 192.168.1.5 ที่ port 5555

การส่งต่อ packet หรือ forwarding นั้นมีการทำงานได้อีก 4 แบบ ซึ่งผมจะเขียนอธิบายทั้ง 4 แบบนั้นในบทความต่อไป

NAT ก็จะทำการเปลี่ยน destination ของ packet นี้ให้เป็น 192.168.1.5 และ port 5555 ตามที่จดไว้ใน NAT table และส่งให้กับ Laptop A ต่อไป

เพียงเท่านี้ Laptop A ก็จะได้รับ response จาก web server โดยที่ Laptop A ไม่จำเป็นต้องมี public หรือ external IP address เลย การทำงานทุกอย่างถูก NAT เพื่อประหยัดจำนวน IP address ที่แจกจ่ายให้กับองค์กร สำนักงานและบ้านเรือน และเราสามารถมี client กี่ตัวก็ได้ที่อยู่ใน private network โดยที่สุดแล้ว NAT ต้องการแค่ 1 public IP address เท่านั้น