NAT Gateway with Ubuntu (VM)

Introdution

เอกสารประกอบฉบับนี้ เกี่ยวข้องกับการใช้ ubuntu ทำ NAT (Network Address Transition) เพื่อให้ Instance ซึ่งอยู่ใน VPC network (LAN) ที่ไม่มี public IP สามารถเข้าใช้งาน internet ได้ ดังภาพ

จากภาพ จะเห็นว่า VM NAT ต้องใช้ public IP (external IP) เพื่อเชื่อมต่อไปยังภายนอก ขณะที่ Client ไม่จำเป็นต้องมี Public IP ก็สามารถที่เชื่อมต่อกับภายนอกได้ ขั้นตอนการเชื่อมต่อ มีดังนี้

1. Disable RPF บน Virtual Network

หลังจากทำ host route จะต้อง disable "Reverse Path Forwarding" บน virtual network ที่ต้องการใช้งาน NAT gateway ซึ่งสามารถดำเนินการบน virtaul network ได้ โดยเลือก Network & Security > VPC Network > เลือก virtual network ที่ใช้งานสำหรับ WAN (External IPs) และ virtual network ต้องการใช้งาน NAT Gateway ดังภาพ

2. Config NAT Gateway บน Ubuntu VM

2.1. Configure IP Forwarding

เมื่อ create instance แล้ว ให้ config "net.ipv4.ip_forward=1" เพื่อให้ Instance ทำหน้าที่เสมือน router และ forward packet ไปยัง Internet ได้

sysctl -w net.ipv4.ip_forward=1 

2.2. install Iptables บน Instance (Ubuntu VM)

sudo apt-get install iptables

หลังจาก install service iptables และ create folder แล้ว ให้ create file เพื่อ config rule ของ iptables สำหรับ NAT

mkdir iptables
cd iptables
touch rules.v4

เพิ่ม config เข้าไปที่ file "rules.v4" ดังนี้

*nat
:PREROUTING ACCEPT [45:3011]
:INPUT ACCEPT [1:84]
:OUTPUT ACCEPT [1:84]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT

*filter
:INPUT ACCEPT [1:84]
:FORWARD ACCEPT [42:2397]
:OUTPUT ACCEPT [58:6344]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT

จากตัวอย่าง กำหนด Interface ที่ต้องการ NAT ออกที่ eth0 จากนั้น นำ config บน file rules.v4 ไปที่ Iptables ได้โดย

Note : การกำหนด interface eth0 จำเป็นต้องแก้ไขให้เป็น WAN ที่ตรงกับบน Ubuntu ที่ใช้ทำเป็น NAT Gateway

/sbin/iptables-restore < /etc/iptables/rules.v4

Verify config ด้วย command ต่อไปนี้

iptables -t nat -nvL

ผลลัพธ์จะเป็นไปตามภาพที่ 3

3. Config Host Route บน VPC Networks

โดยทั่วไป หลังจากสร้าง instance บน route แล้ว tables จะถูกกำหนด default route ที่มี nexthop เป็น xxx.xxx.xxx.1 (default gateway ที่สร้างจากระบบ) ตามภาพที่ 4

0.0.0.0/0 via 10.11.22.1 จะทำให้ instance ที่สร้างขึ้นใหม่ หรือ host ที่ต้องการใช้งาน Internet ผ่าน NAT ถูกส่ง packet ออกไปผิดทาง (Nexthop) ทำให้ไม่สามารถใช้งาน NAT ออก internet ได้

ดังนั้น จึงจำเป็นต้องกำหนด host route บน VPC Network ที่ต้องการใช้งาน NAT Gateway โดยเลือก VPC Network ที่ต้องการ จากนั้นกำหนด default route ให้ไปออกยัง intreface LAN (IP address) ของ Ubuntu ที่ทำหน้าที่เป็น NAT Gateway อยู่ เมื่อสร้าง instance ใหม่ใน VPC Network จะได้รับ defualt route ที่มี Nexthop เป็น IP interface ของ Ubuntu (NAT Gateway)

ภาพด้านล่าง เป็นตัวอย่าง IP ของ Ubuntu ที่มี Interface (LAN) เป็น NAT Gateway คือ 10.11.22.3/24

4. Testing instance to Internet ผ่าน NAT Gateway

สร้าง instance ที่มีเฉพาะ private IP สำหรับทดสอบออก internet ตามภาพที่ 6 จะเห็นว่า เมื่อ create instance ภายใน VPC network ที่กำหนด host route เมื่อ start instance ขึ้นมา จะได้รับ default route ให้ nexthop ไปที่ Ubuntu (NAT Gatewy) คือ 10.11.22.3 ตามที่กำหนดไว้ ดังภาพ

สิ่งที่ควรทราบและข้อจำกัด (Consideration and Limitation) :

  • Bandwidth ที่ใช้งาน internet ได้ ขึ้นอยู่กับ instance (Ubuntu) ที่สร้างตาม flavor ที่เลือก สามารถอ่านละเอียดเพิ่มเติมได้ที่ https://nipa.cloud/th/pricing/nipa-space/instance

  • VPC network ที่ใช้งาน NAT gateway จะไม่สามารถเชื่อมต่อกับ VPC network อื่น ที่เชื่อมต่อกับ logical router ได้ หากต้องการให้สามารถเชื่อมต่อกันได้ ต้องเพิ่ม destination route (host route) ของ VPC network ของทั้ง 2 VPC network ซึ่งคล้ายกับการทำ static route

  • ผู้ใช้งานต้องดำเนินการตรวจสอบและแก้ไข configuration, bug และ issue ต่างๆ ด้วยตนเอง

  • ผู้ใช้งานต้องดำเนินการด้าน security ต่างๆ ของ Ubuntu (NAT gateway) ด้วยตนเอง

  • ไม่แนะนำให้ใช้งานกับ production หากต้องการใช้งานบน produciton กรุณาแจ้งติดต่อ sale เพื่อรับคำปรึกษาเพิ่มเติม

Last updated