NAT กับ PAT และ Port Forwarding ต่างกันอย่างไร ดูจากตาราง NAT
Static NAT แปลง IP แบบหนึ่งต่อหนึ่ง Dynamic NAT ใช้ IP จาก pool ส่วน PAT ให้หลายเครื่องใช้ IP เดียวด้วยการแปลง port และ Port Forwarding คือ Destination NAT
เริ่มต้น8 นาทีในการอ่าน
INSIDE 10.0.0.0/24 NAT OUTSIDE ┌──────────┐ ┌────────────┐ ┌─────────────┐ │ 10.0.0.11│─────────────│ ● │──────────│198.51.100.20│ └──────────┘ │ │ └─────────────┘ │ │ ┌──────────┐ │ NAT / PAT │ ┌─────────────┐ │ 10.0.0.12│─────────────│ │──────────│ 198.51.100.7│ └──────────┘ │ 203.0.113.5│ └─────────────┘ │ │ ┌──────────┐ │ │ │ 10.0.0.20│─────────────│ │ └──────────┘ └────────────┘ PAT src 10.0.0.11:51000 dst 198.51.100.20:443 inside outside type 10.0.0.20:443 <-> 203.0.113.5:8443 static
ในบทความนี้
- NAT คืออะไร
- Static NAT แปลงที่อยู่อย่างไร
- Dynamic NAT ต่างจาก Static NAT ตรงไหน
- PAT ทำให้หลายเครื่องใช้ IP ภายนอกเดียวกันได้อย่างไร
- Port forwarding คือ NAT แบบไหน
- ตาราง NAT สร้างขึ้นเมื่อไร และอยู่นานแค่ไหน
- เครื่องข้างในเปิดเว็บผ่าน IP ภายนอกของตัวเองได้หรือไม่
- บน firewall ต้องเขียน security policy ด้วย IP ก่อนหรือหลัง NAT
- NAT กันการโจมตีจากข้างนอกได้หรือไม่
NAT (Network Address Translation) คือการแก้ IP address ใน header ของแพ็กเก็ตตอนวิ่งผ่านอุปกรณ์ที่อยู่ระหว่างสองเครือข่าย Static NAT จับคู่ IP ข้างในกับ IP ข้างนอกแบบหนึ่งต่อหนึ่งตายตัว Dynamic NAT ยืม IP ข้างนอกจาก pool มาใช้ชั่วคราว PAT แปลงทั้ง IP และ port ทำให้หลายเครื่องใช้ IP ข้างนอกตัวเดียวกันได้ ส่วน port forwarding คือการแปลงปลายทาง (destination NAT) ของ port หนึ่งบน IP ข้างนอก ให้ไปถึงเครื่องข้างใน
วิธีที่เห็นความต่างได้ชัดที่สุดคือดูตาราง NAT ครับ บทความนี้ใช้เครือข่ายตัวอย่างเดียวตลอด ข้างในเป็น 10.0.0.0/24 จากช่วง private ใน RFC 1918 ข้างนอกใช้ 203.0.113.0/24 และ 198.51.100.0/24 ซึ่งเป็นช่วงที่ RFC 5737 กันไว้ให้ใช้ในเอกสาร ไม่ใช่ IP ของใครจริง
INSIDE 10.0.0.0/24 NAT OUTSIDE ┌──────────┐ ┌────────────┐ ┌─────────────┐ │ 10.0.0.11│─────────────│ ● │──────────│198.51.100.20│ └──────────┘ │ │ └─────────────┘ │ │ ┌──────────┐ │ NAT / PAT │ ┌─────────────┐ │ 10.0.0.12│─────────────│ │──────────│ 198.51.100.7│ └──────────┘ │ 203.0.113.5│ └─────────────┘ │ │ ┌──────────┐ │ │ │ 10.0.0.20│─────────────│ │ └──────────┘ └────────────┘ PAT src 10.0.0.11:51000 dst 198.51.100.20:443 inside outside type 10.0.0.20:443 <-> 203.0.113.5:8443 static
NAT คืออะไร
NAT คือการแปลงที่อยู่ใน IP header ให้แพ็กเก็ตที่ออกจากเครือข่ายหนึ่งไปอีกเครือข่ายหนึ่งถูก route ได้ถูกต้อง RFC 2663 (สิงหาคม พ.ศ. 2542) ซึ่งเป็นเอกสารรวมศัพท์ของ NAT อธิบายว่า NAT router อยู่ที่ขอบระหว่างสอง address realm และแปลงที่อยู่ใน IP header เมื่อแพ็กเก็ตออกจาก realm หนึ่งไปอีก realm
เหตุผลที่ใช้กันทั่วไปคือ IP ช่วง RFC 1918 อย่าง 10.0.0.0/8, 172.16.0.0/12 และ 192.168.0.0/16 ใช้ได้แค่ภายในเครือข่าย ส่งออกอินเทอร์เน็ตตรง ๆ ไม่ได้ ต้องแปลงเป็น IP ที่ route ได้ก่อน
RFC 2663 แบ่ง NAT ตามทิศทางของ session ด้วย แบบ traditional NAT ให้ session เริ่มจากข้างในออกไปข้างนอกเท่านั้น ส่วน bi-directional NAT ให้เริ่มได้ทั้งสองทาง
Static NAT แปลงที่อยู่อย่างไร
Static NAT จับคู่ IP ข้างในหนึ่งตัวกับ IP ข้างนอกหนึ่งตัวไว้ตลอด RFC 2663 เรียกว่า static address assignment คือ mapping แบบหนึ่งต่อหนึ่งตลอดอายุการทำงานของ NAT
| ข้างใน | ข้างนอก | อยู่นานเท่าไร |
|---|---|---|
| 10.0.0.20 | 203.0.113.20 | ตลอด จนกว่าจะแก้ config |
แพ็กเก็ตที่ 10.0.0.20 ส่งออก จะถูกเปลี่ยน source เป็น 203.0.113.20 และแพ็กเก็ตที่ส่งมาหา 203.0.113.20 จะถูกเปลี่ยน destination เป็น 10.0.0.20 port ไม่ถูกแตะ ใน PAN-OS แบบนี้คือ source NAT ชนิด Static IP ที่แปลง source IP แบบหนึ่งต่อหนึ่งและไม่เปลี่ยน source port เอกสารยกตัวอย่างการใช้งานว่าเป็น server ข้างในที่ต้องเปิดให้อินเทอร์เน็ตเข้าถึง
ข้อเสียคือใช้ IP ข้างนอกหนึ่งตัวต่อหนึ่งเครื่อง
Dynamic NAT ต่างจาก Static NAT ตรงไหน
Dynamic NAT ยังเป็นหนึ่งต่อหนึ่ง แต่ไม่ได้จองไว้ถาวร NAT หยิบ IP ว่างจาก pool มาให้เมื่อเครื่องข้างในเริ่ม session และ คืน binding เมื่อ session สุดท้ายที่ใช้ IP นั้นจบ RFC 2663 เรียกการแปลงเฉพาะ IP แบบนี้ว่า Basic NAT ซึ่งแปลง source IP และ checksum ที่เกี่ยวข้องของแพ็กเก็ตขาออก
ตัวอย่าง pool 203.0.113.10 ถึง 203.0.113.11 มีสอง IP:
| เวลา | ข้างใน | ข้างนอกที่ได้ |
|---|---|---|
| 09:00 | 10.0.0.11 | 203.0.113.10 |
| 09:01 | 10.0.0.12 | 203.0.113.11 |
| 09:02 | 10.0.0.13 | ไม่มี IP ว่าง |
เครื่องที่สามคือปัญหาของ dynamic NAT ใน PAN-OS ชนิด Dynamic IP ถ้า IP ใน pool ถูกใช้หมด connection ใหม่ที่ต้องแปลงที่อยู่จะถูก drop โดยค่าเริ่มต้น เอกสารจึงบอกว่าขนาด pool ควรเท่ากับจำนวนเครื่องข้างในที่ต้องแปลง หรือเปิด fallback ไปใช้ DIPP
PAT ทำให้หลายเครื่องใช้ IP ภายนอกเดียวกันได้อย่างไร
PAT แปลง port ด้วย ไม่ใช่แค่ IP ครับ แต่ละ session จึงได้คู่ IP:port ข้างนอกที่ไม่ซ้ำกัน แม้ IP จะเป็นตัวเดียวกัน RFC 2663 เรียกวิธีนี้ว่า NAPT (Network Address Port Translation) ซึ่งแปลง transport identifier เช่น TCP/UDP port และ ICMP query ID ด้วย ทำให้หลายเครื่องใช้ IP ภายนอกตัวเดียวร่วมกันได้ PAN-OS เรียกว่า Dynamic IP and Port (DIPP) และบอกว่า บางครั้งเรียกว่า interface-based NAT หรือ NAPT
สมมติสองเครื่องข้างในบังเอิญใช้ source port เดียวกัน คือ 51000 เพื่อต่อไป server เดียวกันที่ 198.51.100.20:443 ตาราง NAT จะเป็นแบบนี้
| ข้างใน | ข้างนอก | ปลายทาง |
|---|---|---|
| 10.0.0.11:51000 | 203.0.113.5:40001 | 198.51.100.20:443 |
| 10.0.0.12:51000 | 203.0.113.5:40002 | 198.51.100.20:443 |
server เห็น connection สองเส้นมาจาก 203.0.113.5 คนละ port เมื่อ server ตอบกลับไปที่ 203.0.113.5:40002 NAT ดูตารางแล้วเปลี่ยน destination กลับเป็น 10.0.0.12:51000 ตามที่ RFC 2663 อธิบายว่าแพ็กเก็ตขาเข้าจะถูกแปลง destination IP, destination port และ checksum
RFC 3022 อธิบายว่ารูปแบบนี้ตรงกับความต้องการของสำนักงานขนาดเล็กและบ้านส่วนใหญ่ ที่ได้ IP จากผู้ให้บริการมาแค่ตัวเดียว และ RFC 2663 บอกว่าบ่อยครั้ง IP ของ interface ฝั่งนอกของ NAPT router เองถูกใช้เป็น IP ที่แปลงไป บน Linux แบบนี้คือ masquerade ใน nftables ซึ่งเป็น SNAT แบบพิเศษที่ใช้ IP ของ interface ขาออกโดยอัตโนมัติ manpage ของ nftables บอกว่าเหมาะกับ gateway ที่ IP สาธารณะเปลี่ยนได้
nft add table nat
nft 'add chain nat postrouting { type nat hook postrouting priority 100 ; }'
nft add rule nat postrouting ip saddr 10.0.0.0/24 oif "eth0" snat to 203.0.113.5
# หรือถ้า IP ของ eth0 เปลี่ยนได้
nft add rule nat postrouting ip saddr 10.0.0.0/24 oif "eth0" masquerade
Port forwarding คือ NAT แบบไหน
Port forwarding คือ destination NAT ที่จับคู่ port หนึ่งบน IP ข้างนอกไว้กับเครื่องข้างในแบบ static ครับ RFC 3022 พูดถึงเรื่องนี้ไว้ตั้งแต่ปี พ.ศ. 2544 ว่า NAPT ขยายให้รับ connection ขาเข้าได้ ด้วยการ map เครื่องข้างในไว้แบบ static ต่อแต่ละ port ของบริการบน IP ที่จดทะเบียน และถ้าไม่ได้ map ไว้ session ขาเข้าทั้งหมดจะถือว่าส่งมาหาตัว NAT router เอง
ตัวอย่าง: ต้องการให้คนข้างนอกเข้า https://203.0.113.5:8443 แล้วไปถึง web server 10.0.0.20 ที่ port 443
| ข้างนอก | ข้างใน | ชนิด |
|---|---|---|
| 203.0.113.5:8443 | 10.0.0.20:443 | static, ตั้งไว้ล่วงหน้า |
แพ็กเก็ตจาก 198.51.100.7:52000 ที่ส่งไป 203.0.113.5:8443 จะถูกเปลี่ยน destination เป็น 10.0.0.20:443 ส่วน source ยังเป็น 198.51.100.7:52000 เหมือนเดิม web server จึงเห็น IP จริงของ client
ใน PAN-OS เอกสาร destination NAT บอกว่า destination NAT แปลง destination address เป็นอีก address เช่น public เป็น private และมี option ให้ทำ port forwarding หรือ port translation ใน nftables เขียนเป็น dnat ใน chain prerouting โดยระบุ address และ port ปลายทางได้ตามรูปแบบ ADDR_SPEC :PORT_SPEC ใน manpage:
nft 'add chain nat prerouting { type nat hook prerouting priority -100; }'
nft add rule nat prerouting iif "eth0" tcp dport 8443 dnat to 10.0.0.20:443
ตาราง NAT สร้างขึ้นเมื่อไร และอยู่นานแค่ไหน
แถวแบบ dynamic สร้างจากแพ็กเก็ตแรกของ flow และหายไปเมื่อ session จบหรือหมดเวลา ส่วนแถว static อยู่ตลอด nftables อธิบายไว้ตรง ๆ ว่าแพ็กเก็ตแรกของ flow ใช้หา rule ที่ match และสร้าง NAT binding ส่วนแพ็กเก็ตต่อ ๆ ไปไม่ต้องหา rule อีก NAT ใช้ binding ที่มีอยู่แปลงต่อเลย
สำหรับ TCP RFC 2663 บอกว่าจุดจบของ session ดูจาก FIN ที่ถูก ACK ทั้งสองฝั่ง หรือ RST (หัวข้อ 2.6) ส่วน UDP ไม่มีสัญญาณจบ จึงใช้ timer RFC 4787 (มกราคม พ.ศ. 2550) กำหนดว่า UDP mapping timer ต้องไม่หมดอายุภายในสองนาที ยกเว้นบาง port ในช่วง 0 ถึง 1023 และแนะนำค่าเริ่มต้นห้านาทีขึ้นไป
RFC 4787 ยังแยกพฤติกรรมของ NAT เป็นสองเรื่องที่ต่างกัน:
- Mapping คือจะใช้ IP:port ข้างนอกเดิมซ้ำเมื่อไร ถ้าเป็น endpoint-independent mapping NAT ใช้ mapping เดิมกับแพ็กเก็ตจาก IP:port ข้างในเดียวกัน ไม่ว่าปลายทางจะเป็นใคร และ RFC บังคับว่า NAT MUST มีพฤติกรรมแบบนี้ (REQ-1)
- Filtering คือจะรับแพ็กเก็ตจากข้างนอกที่ส่งมาที่ mapping นั้นหรือไม่ เช่น แบบ address and port-dependent filtering รับเฉพาะแพ็กเก็ตจาก IP:port ที่เครื่องข้างในเคยส่งไปหาก่อน
เครื่องข้างในเปิดเว็บผ่าน IP ภายนอกของตัวเองได้หรือไม่
ได้ ถ้า NAT รองรับ hairpinning ครับ ตัวอย่างคือเครื่อง 10.0.0.11 พิมพ์ https://203.0.113.5:8443 ซึ่งเป็น port forward ของ server ข้างในเอง แพ็กเก็ตวิ่งไปที่ NAT แล้วต้องถูกส่งวกกลับเข้าไปหา 10.0.0.20
RFC 4787 อธิบายว่า hairpinning ทำให้สองเครื่องที่อยู่ข้างใน NAT คุยกันได้ แม้จะใช้ IP:port ภายนอกของกันและกัน และกำหนดว่า NAT MUST รองรับ hairpinning (REQ-9) โดยแพ็กเก็ตที่วกกลับต้องมี source เป็น IP:port ภายนอก ใน PAN-OS เรื่องนี้ตั้งเป็น Destination U-Turn NAT คือ destination NAT rule ที่ source zone เป็น zone ข้างใน และแปลง IP สาธารณะของ server เป็น IP ข้างใน เพื่อให้ firewall ส่ง request ไปที่ interface ของ zone ที่ server อยู่ แทนที่จะส่งออกไปข้างนอก
บน firewall ต้องเขียน security policy ด้วย IP ก่อนหรือหลัง NAT
ขึ้นกับ vendor ครับ และเป็นจุดที่ตั้งผิดกันบ่อย ใน PAN-OS firewall จะดู NAT rule ก่อน แล้วประเมิน security policy ด้วย source และ destination address เดิม (pre-NAT) แต่ใช้ zone หลัง NAT (post-NAT) และการแปลงที่อยู่จริงเกิดตอนแพ็กเก็ตออกจาก firewall
กับตัวอย่าง port forward ข้างบน security rule ใน PAN-OS จึงต้องมี destination address เป็น 203.0.113.5 (pre-NAT) แต่ destination zone เป็น zone ของ 10.0.0.20 (post-NAT) ไม่ใช่ 10.0.0.20 ใน zone ข้างนอก
อีกเรื่องคือ NAT rule ใน PAN-OS ถูกประเมินจากบนลงล่าง เมื่อ match rule หนึ่งแล้วจะไม่ไปดู rule อื่น rule ที่เจาะจงกว่าจึงต้องอยู่บน
NAT กันการโจมตีจากข้างนอกได้หรือไม่
ไม่ได้ในตัวมันเองครับ สิ่งที่กันแพ็กเก็ตขาเข้าคือกฎ filtering หรือ security policy ไม่ใช่การแปลงที่อยู่ RFC 4787 เขียนไว้ว่าการเลือก mapping แบบไหน ไม่ทำให้คุณสมบัติด้าน security ของ NAT ต่างกัน คุณสมบัติด้าน security ถูกกำหนดโดยการเลือกว่าจะให้แพ็กเก็ตไหนเข้าและไม่ให้แพ็กเก็ตไหนเข้า ซึ่งเป็นหน้าที่ของ filtering
ผลที่เห็นได้ชัดคือ port forwarding ทุกตัวเปิดเครื่องข้างในให้ทั้งอินเทอร์เน็ตเข้าถึง ใน PAN-OS เอกสารเตือนว่า ต้องตั้ง security policy rule ให้อนุญาตทราฟฟิกที่ผ่าน NAT ด้วย ผมจึงแนะนำให้ถือว่า port forward หนึ่งตัวคือ rule ขาเข้าหนึ่งตัวที่ต้องมีเจ้าของ เหตุผล และวันที่ทบทวน
สรุปสั้น ๆ:
| แปลงอะไร | ข้างใน : ข้างนอก | ใครเริ่ม session | |
|---|---|---|---|
| Static NAT | IP | 1 : 1 ตายตัว | ทั้งสองทาง |
| Dynamic NAT | IP | 1 : 1 จาก pool | ข้างใน |
| PAT (NAPT) | IP และ port | หลาย : 1 | ข้างใน |
| Port forwarding | destination IP และ port ของ port ที่ตั้งไว้ | 1 port : 1 เครื่อง | ข้างนอก |
แหล่งอ้างอิง
- RFC 2663: IP Network Address Translator (NAT) Terminology and Considerations
- RFC 3022: Traditional IP Network Address Translator (Traditional NAT)
- RFC 4787: NAT Behavioral Requirements for Unicast UDP
- RFC 1918: Address Allocation for Private Internets
- RFC 5737: IPv4 Address Blocks Reserved for Documentation
- PAN-OS: Source NAT
- PAN-OS: Destination NAT
- PAN-OS: Destination U-Turn NAT
- PAN-OS: NAT policy rules
- nftables wiki: Performing Network Address Translation (NAT)
- nftables manpage
อ่านต่อ
บทความที่เกี่ยวข้อง
ความปลอดภัยเครือข่าย
SSL Decryption บน Firewall ทำงานอย่างไร และอะไรไม่ควรถอดรหัส
Forward Proxy และ Inbound Inspection ทำงานทีละขั้นอย่างไร ทำไม client ต้องเชื่อ CA ของ Firewall อะไรถอดรหัสไม่ได้ อะไรไม่ควรถอด และ TLS 1.3
ขั้นสูง10 นาที
- SSL Decryption
- TLS Inspection
- Firewalls
- PAN-OS
- FortiGate
- Cisco Secure Firewall
- TLS 1.3
ความปลอดภัยเครือข่าย
Packet Flow ใน PAN-OS ทีละขั้น ทำไม Security Policy ถูกตรวจซ้ำ
ลำดับ 6 ขั้นของ Packet Flow ใน PAN-OS ตั้งแต่ Ingress, Session Lookup, App-ID ถึง Egress และเหตุผลที่ Security Policy อาจถูกตรวจถึงสามครั้งใน Session เดียว
ปานกลาง6 นาที
- Palo Alto
- PAN-OS
- Firewalls
ความปลอดภัยเครือข่าย
รีวิว Firewall Rule อย่างไร และ Rule แบบไหนควรลบ
Checklist รีวิว firewall rule ทีละข้อ ทั้ง rule ที่ถูกบัง rule ซ้ำ any-any ไม่มี hit หมดอายุ และไม่มีเจ้าของ พร้อมวิธีลบอย่างปลอดภัย อิง NIST SP 800-41
ปานกลาง7 นาที
- Firewall
- Firewall Rules
- Rule Review
- Hit Count
- Shadowed Rules
- NIST SP 800-41
- PAN-OS
- FortiGate