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

Preparation :
ทำการสร้าง VPC Network ชื่อ WAN และกำหนด IP subnet จาก diagram ด้านบน ตัวอย่างกำหนดให้เป็น 10.10.100.0/24
ทำการสร้าง VPC Network ชื่อ LAN และกำหนด IP subnet สำหรับให้ VM (instance) ที่ต้องการใช้งาน Internet ผ่าน NAT Gateway ตัวอย่างด้านบนกำหนดให้เป็น 192.168.10.0/24
ทำการ associate Externel IP ให้กับขา WAN ของ NAT Gateway รายละเอียดตาม URL : https://docs-epc.gitbook.io/ncs-documents/networking/networking/managing-external-ip-s
แก้ไข route บน NAT Gateway ให้มี default route ออกไปที่ interface ขา WAN ในตัวอย่างคือ interface eth1 (Note: ต้องทำการแก้ไขใน netplan หรือ file configure เพื่อกรณี reboot VM แล้วค่า configure จะยังคงอยู่)
ทำการสร้าง VM สำหรับ NAT Gateway โดยตอนสร้างให้เลือกสร้างภายใต้ VPC Network เป็น WAN ตามข้อ 1. ก่อน และเมื่อสร้างเสร็จ ให้ทำการเพิ่ม port ที่ของ LAN โดยเลือก VPC Network ตามที่กำหนดในข้อ 2. รายละเอียดการเพิ่ม port สามารถทำได้ตาม URL : https://docs-epc.gitbook.io/ncs-documents/networking/networking/managing-vpc-network-s/create-port
ขั้นตอนการดำเนินการมีดังนี้
1. Disable RPF บน Virtual Network
หลังจากทำ host route จะต้อง disable "Reverse Path Forwarding (RPF)" บน virtual network ที่ต้องการใช้งาน NAT gateway ซึ่งสามารถดำเนินการบน virtaul network ได้ โดยเลือก Network & Security > VPC Network > เลือก VPC Network ที่ใช้งานสำหรับ WAN (External IPs) และ VPC Network ต้องการใช้งานผ่าน LAN (Internal IP) ที่ต้องการใช้งาน Internet ดังภาพ

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
sysctl -p
2.2. install Iptables และ iptables-persistent บน Instance (Ubuntu VM) ที่ต้องการทำเป็น NAT
sudo apt update -y
sudo apt-get install iptables iptables-persistent
หลังจากนั้นทำเพิ่ม config เข้าไปที่ file "/etc/iptables/rules.v4" ดังนี้
*nat
:PREROUTING ACCEPT [45:3011]
:INPUT ACCEPT [1:84]
:OUTPUT ACCEPT [1:84]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth1 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [1:84]
:FORWARD ACCEPT [42:2397]
:OUTPUT ACCEPT [58:6344]
-A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o eth1 -j ACCEPT
COMMIT
จากตัวอย่าง interface eth0 คือขา LAN และ eht1 คือขา WAN โดยมีรายละเอียดคำสั่งดังนี้
-A POSTROUTING -o eth1 -j MASQUERADE
คือการกำหนดให้ทำ Source Network Address Translation (SNAT) ออกไปยัง interface WAN ตามตัวอย่างด้านบนคือ eth1
Note : กรณีที่มี interface อื่นให้ทำการเปลี่ยนตามที่ใช้งานจริง
-A FORWARD -i eth0 -o eth1 -j ACCEPT
คือการกำหนดให้รับ packet ที่เข้ามาจาก eht0 ก็คือขา LAN ออกไปยัง eth1 ก็คือขา WAN
Note : กรณีที่มี interface อื่นให้ทำการเปลี่ยนตามที่ใช้งานจริง
-A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
คือการกำหนดให้ยอมรับ packet ที่มีการ initail packet จาก client ที่มาจากขา LAN ซึ่งก็คือ state RELATED และ ESTABLISHED เท่านั้น
จากนั้น ทำการ apply config จาก file rules.v4 ไปที่ Iptables ได้โดยใช้ command ตามด้านล่าง
/sbin/iptables-restore < /etc/iptables/rules.v4
Verify config ด้วย command ต่อไปนี้
iptables -t nat -nvL
ผลลัพธ์จะเป็นไปตามภาพที่ 3 Iptables NAT

2.3. ทำการตรวจสอบและแก้ไข routing บน NAT Gateway
เมื่อ VM มี interface 2 interface เราจะพบว่าบน VM NAT Gateway มี default route อยู่ทั้ง 2 ขาคือ LAN (eth0) และ WAN (eth1) ซึ่งเราต้องทำการลบ default route ที่กำหนดไว้บนขา LAN ออก โดยมีตัวอย่างตามรูปด้านล่าง เราจะทำการลบ default via 192.168.10.1 dev eth0 ออก เพื่อให้มี default route ออกแค่ทางขา WAN ก็คือ default via 10.10.100.1 dev eth1
คำสั่งในการลบ route แบบชั่วคราวคือ
ip route delete default via 192.168.10.1

การกำหนดค่า routing แบบถาวร ให้เราทำการกำหนดใน netplan โดยกำหนที่ "/etc/netplan/50-cloud-init.yaml" ตามตัวอย่างด้านล่าง
network:
version: 2
ethernets:
eth0:
dhcp4: false
match:
macaddress: 02:5b:20:0e:92:ef
set-name: eth0
addresses:
- 192.168.10.4/24
eth1:
dhcp4: false
match:
macaddress: 02:1e:64:25:0e:9f
set-name: eth1
addresses:
- 10.10.100.3/24
routes:
- to: 0.0.0.0/0
via: 10.10.100.1
หลังจากทำการกำหนด netplan แล้ว ให้ทำการ apply configuration เพื่อให้ทำงานตามที่กำหนด โดยใช้ command ดังนี้
netplan apply
3. Config Host Route บน VPC Networks
โดยทั่วไป หลังจากสร้าง instance บน VPC network แล้วจะมี route tables ที่จะถูกกำหนด default route ไปยัง nexthop xxx.xxx.xxx.1 (default gateway ที่สร้างจากระบบ) ตามภาพที่ 4
0.0.0.0/0 via 192.168.10.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 คือ 192.168.10.4 (IP address ของ LAN บน NAT Gateway)

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
Was this helpful?