# NAT Gateway with Ubuntu (VM) แบบ Host Route

## Introdution

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

<figure><img src="/files/IuWifOKum5Ss7XqEnbCr" alt=""><figcaption><p>รูปที่ 1 NAT Gateway Diagram</p></figcaption></figure>

#### Preparation :&#x20;

1. ทำการสร้าง VPC Network ชื่อ WAN และกำหนด IP subnet จาก diagram ด้านบน ตัวอย่างกำหนดให้เป็น 10.10.100.0/24
2. ทำการสร้าง VPC Network ชื่อ LAN และกำหนด IP subnet สำหรับให้ VM (instance) ที่ต้องการใช้งาน Internet ผ่าน NAT Gateway ตัวอย่างด้านบนกำหนดให้เป็น 192.168.10.0/24
3. ทำการ associate Externel IP ให้กับขา WAN ของ NAT Gateway รายละเอียดตาม URL : <https://docs-epc.gitbook.io/ncs-documents/networking/networking/managing-external-ip-s>
4. แก้ไข route บน NAT Gateway ให้มี default route ออกไปที่ interface ขา WAN ในตัวอย่างคือ interface eth1 (Note: ต้องทำการแก้ไขใน netplan หรือ file configure เพื่อกรณี reboot VM แล้วค่า configure จะยังคงอยู่)
5. ทำการสร้าง 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>

## ขั้นตอนการดำเนินการมีดังนี้&#x20;

### 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 ดังภาพ

<figure><img src="/files/0XCCvDPYKshwr7nJiI6T" alt=""><figcaption><p>รูปที่ 2 ทำการ disable RPF</p></figcaption></figure>

### 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

<mark style="color:red;">Note : กรณีที่มี interface อื่นให้ทำการเปลี่ยนตามที่ใช้งานจริง</mark>

```
-A FORWARD -i eth0 -o eth1 -j ACCEPT
```

คือการกำหนดให้รับ packet ที่เข้ามาจาก eht0 ก็คือขา LAN  ออกไปยัง eth1 ก็คือขา WAN

<mark style="color:red;">Note : กรณีที่มี interface อื่นให้ทำการเปลี่ยนตามที่ใช้งานจริง</mark>

```
-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

<figure><img src="/files/jZUYAUmzRWfEfcpREu5E" alt=""><figcaption><p>รูปที่ 3 Iptables NAT</p></figcaption></figure>

#### 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`

<figure><img src="/files/RoSm10M05r6c5MjQgaGE" alt=""><figcaption><p>รูปที่ 4 การแก้ไขและตรวจสอบ routing บน NAT Gateway</p></figcaption></figure>

การกำหนดค่า 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&#x20;

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

<figure><img src="/files/fzMSM67MFmEPvSNnOXXQ" alt=""><figcaption><p>รูปที่ 5 ก่อนทำการ configure Host Route</p></figcaption></figure>

ดังนั้น จึงจำเป็นต้องกำหนด 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)

<figure><img src="/files/MxyNJneDQDMnqhxqi3MD" alt=""><figcaption><p>รูปที่ 6 ทำการ configure Host Route</p></figcaption></figure>

### 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 ตามที่กำหนดไว้ ดังภาพ

<figure><img src="/files/eTNxQGar3VczOJhdzxhh" alt=""><figcaption><p>รูปที่ 7 หลังจากทำการกำหนด Host Route</p></figcaption></figure>

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

* 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&#x20;
* ผู้ใช้งานต้องดำเนินการตรวจสอบและแก้ไข configuration, bug และ issue ต่างๆ ด้วยตนเอง
* ผู้ใช้งานต้องดำเนินการด้าน security ต่างๆ ของ Ubuntu (NAT gateway) ด้วยตนเอง&#x20;
* ไม่แนะนำให้ใช้งานกับ production หากต้องการใช้งานบน produciton กรุณาแจ้งติดต่อ sale เพื่อรับคำปรึกษาเพิ่มเติม


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs-epc.gitbook.io/ncs-documents/networking/nat-gateway-with-ubuntu-vm-host-route.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
