Concept 核心概念
定義
NAT (Network Address Translation) 是一種將封包標頭中的「來源 IP」或「目的 IP」進行替換的技術,主要用來解決 IPv4 位址不足及隱藏內部網路結構的問題。
生活化比喻:公司總機與收發室
想像 FortiGate 就是一間大公司的「總機兼收發室」:
SNAT (寄信出去)
就像員工(內網 IP)要寄信給客戶。信件經過收發室時,管理員會把寄件人改成「公司總部地址」(公網 IP),而不是寫員工家裡的私人地址。
DNAT / VIP (電話進來)
就像客戶要打電話找特定部門。客戶撥打的是公司的「代表號」(公網 IP),總機小姐根據分機表,將電話轉接給內部的「業務部經理」(伺服器私有 IP)。
Mechanism 運作原理
1. SNAT 與 DNAT (Virtual IP) 的區別
| 功能 | SNAT (Source NAT) | DNAT (Destination NAT / VIP) |
|---|---|---|
| 流量方向 | LAN WAN (內網上網) | WAN DMZ/LAN (外部存取內部) |
| 行為 | 修改封包的 來源 IP | 修改封包的 目的 IP |
| 關鍵技術 | PAT (Port Address Translation) | Port Forwarding / Virtual IP Mapping |
2. NAT 模式比較
Firewall Policy NAT (預設)
直接在 Firewall Policy 內勾選 "NAT"。
- 邏輯簡單:流量允許通過即轉換。
- 適用:中小型企業、快速部署。
Central NAT (進階)
獨立的 Central SNAT / DNAT 表格。
- 邏輯嚴謹:先查 Policy 放行,再查 NAT 表轉換。
- 適用:大型企業、複雜路由、Cisco/Juniper 移轉。
Visuals 架構視覺化
圖 1 SNAT 封包流向與轉換 (員工上網)
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'Noto Sans TC', 'fontSize': '20px', 'actorFontSize': '20px', 'noteFontSize': '18px', 'messageFontSize': '18px' }}}%%
sequenceDiagram
autonumber
participant PC as 員工 PC
(192.168.1.10) participant FG as FortiGate
(NAT) participant WAN as 網際網路
(Google) Note over PC, FG: SNAT 場景:員工上網 PC->>FG: 請求: Src=192.168.1.10:51234, Dst=8.8.8.8:443 Note right of FG: 查表與轉換 (SNAT)
將 192.168.1.10 轉為 WAN IP (203.0.113.1)
建立 Session 表:Port 51234 -> 10001 (PAT) FG->>WAN: 轉發: Src=203.0.113.1:10001, Dst=8.8.8.8:443 WAN-->>FG: 回應: Src=8.8.8.8:443, Dst=203.0.113.1:10001 Note left of FG: 查表還原
將 203.0.113.1:10001 還原為 192.168.1.10:51234 FG-->>PC: 轉發: Src=8.8.8.8:443, Dst=192.168.1.10:51234
(192.168.1.10) participant FG as FortiGate
(NAT) participant WAN as 網際網路
(Google) Note over PC, FG: SNAT 場景:員工上網 PC->>FG: 請求: Src=192.168.1.10:51234, Dst=8.8.8.8:443 Note right of FG: 查表與轉換 (SNAT)
將 192.168.1.10 轉為 WAN IP (203.0.113.1)
建立 Session 表:Port 51234 -> 10001 (PAT) FG->>WAN: 轉發: Src=203.0.113.1:10001, Dst=8.8.8.8:443 WAN-->>FG: 回應: Src=8.8.8.8:443, Dst=203.0.113.1:10001 Note left of FG: 查表還原
將 203.0.113.1:10001 還原為 192.168.1.10:51234 FG-->>PC: 轉發: Src=8.8.8.8:443, Dst=192.168.1.10:51234
圖 2 DNAT (VIP) 拓樸與邏輯 (外部存取伺服器)
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#ffcccc', 'edgeLabelBackground':'#ffffff', 'tertiaryColor': '#fff0f0', 'fontSize': '20px', 'edgeLabelFontSize': '18px'}}}%%
graph TD
subgraph Internet ["網際網路 (Untrust)"]
User[外部使用者
IP: 1.2.3.4] end subgraph FortiGate ["FortiGate (Edge)"] WAN_If[WAN1 介面
Public IP: 203.0.113.50] VIP_Obj[Virtual IP 物件
對應: 203.0.113.50:80 -> 10.1.1.20:8080] Policy[Firewall Policy
Src: All, Dst: VIP_Obj, Action: Accept] end subgraph DMZ ["DMZ 區域 (Trust)"] WebServer[網頁伺服器
Private IP: 10.1.1.20
Port: 8080] end User -- "1. 存取 http://203.0.113.50" --> WAN_If WAN_If -- "2. 匹配 VIP 規則 (DNAT)" --> VIP_Obj VIP_Obj -- "3. 檢查 Policy 放行" --> Policy Policy -- "4. 轉發封包 (Dst IP 變更)" --> WebServer style VIP_Obj fill:#f96,stroke:#333,stroke-width:2px style Policy fill:#bbf,stroke:#333,stroke-width:2px
IP: 1.2.3.4] end subgraph FortiGate ["FortiGate (Edge)"] WAN_If[WAN1 介面
Public IP: 203.0.113.50] VIP_Obj[Virtual IP 物件
對應: 203.0.113.50:80 -> 10.1.1.20:8080] Policy[Firewall Policy
Src: All, Dst: VIP_Obj, Action: Accept] end subgraph DMZ ["DMZ 區域 (Trust)"] WebServer[網頁伺服器
Private IP: 10.1.1.20
Port: 8080] end User -- "1. 存取 http://203.0.113.50" --> WAN_If WAN_If -- "2. 匹配 VIP 規則 (DNAT)" --> VIP_Obj VIP_Obj -- "3. 檢查 Policy 放行" --> Policy Policy -- "4. 轉發封包 (Dst IP 變更)" --> WebServer style VIP_Obj fill:#f96,stroke:#333,stroke-width:2px style Policy fill:#bbf,stroke:#333,stroke-width:2px
圖 3 NAT 模式決策流程圖
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontSize': '20px', 'edgeLabelFontSize': '18px' }}}%%
flowchart TD
Start(["封包進入 FortiGate"]) --> RouteLookup["路由查表"]
RouteLookup --> ModeCheck{"使用哪種 NAT 模式?"}
ModeCheck -- "Policy NAT (預設)" --> PolCheck["檢查 Firewall Policy"]
PolCheck --> PolMatch{"符合 Policy?"}
PolMatch -- Yes --> NATEnabled{"該 Policy 啟用 NAT?"}
NATEnabled -- Yes --> ApplyNAT["依照 Policy 設定執行 SNAT"]
NATEnabled -- No --> NoNAT["不進行轉換"]
ApplyNAT --> Forward["轉發封包"]
NoNAT --> Forward
ModeCheck -- "Central NAT" --> CN_PolCheck["檢查 Firewall Policy (只看放行)"]
CN_PolCheck --> CN_Match{"符合並放行?"}
CN_Match -- Yes --> CN_Table["查閱 Central SNAT/DNAT 表格"]
CN_Table --> CN_Apply["套用符合的 NAT 規則"]
CN_Apply --> Forward
Use Case 實務應用場景
場景:混合型企業網路部署
某科技公司需要同時滿足以下需求:
- 財務部 (Internal): 只能存取銀行網站,且出去的 IP 必須固定為
203.0.113.10。 - 一般員工 (Internal): 可自由上網,共用公司主要 IP
203.0.113.1。 - ERP 系統 (DMZ): 需提供給外部廠商存取,使用 Port 4433 對應內部的 Port 443。
解決方案配置邏輯
-
1
財務部 (SNAT Pool) 建立 IP Pool,並在 Policy 內啟用 "Use Dynamic IP Pool"。
-
2
一般員工 (Interface NAT) Policy 啟用 NAT 並選擇 "Use Outgoing Interface Address" (預設)。
-
3
ERP 系統 (VIP / DNAT) 建立 Virtual IP (VIP) 物件,Policy 目的端指向 VIP。
CLI 配置實戰範例
FortiGate CLI
Policy NAT Mode
# --- 步驟 1: 定義物件 (IP Pool & VIP) --- config firewall ippool edit "Finance_NAT_Pool" set type overload set startip 203.0.113.10 set endip 203.0.113.10 next end config firewall vip edit "ERP_Service_DNAT" set extip 203.0.113.1 set extintf "any" set portforward enable set extport 4433 set mappedip 192.168.100.5 set mappedport 443 next end # --- 步驟 2: 設定防火牆策略 (Firewall Policy) --- config firewall policy # 場景 A: 財務部 (SNAT: 指定 IP) edit 10 set name "Finance_to_Internet" set srcintf "port2" # 內部介面 set dstintf "wan1" # 外部介面 set srcaddr "Finance_Subnet" set dstaddr "all" set action accept set schedule "always" set service "ALL" set nat enable # 啟用 NAT set ippool enable # 啟用 IP Pool set poolname "Finance_NAT_Pool" # 選擇剛剛建立的 Pool next # 場景 B: 一般員工 (SNAT: 介面 IP) edit 20 set name "Staff_to_Internet" set srcintf "port2" set dstintf "wan1" set srcaddr "Staff_Subnet" set dstaddr "all" set action accept set schedule "always" set service "ALL" set nat enable # 預設使用外網介面 IP (203.0.113.1) next # 場景 C: ERP 伺服器 (DNAT: VIP) edit 30 set name "Internet_to_ERP" set srcintf "wan1" set dstintf "dmz" set srcaddr "all" set dstaddr "ERP_Service_DNAT" # 目的端直接放 Virtual IP 物件 set action accept set schedule "always" set service "HTTPS" set nat disable # DNAT 不需要此選項 (除非要隱藏來源 IP) next end
大師點評
在此案例中,如果使用 Central NAT 會更具優勢!
因為可以將「位址轉換邏輯」與「安全放行政策」分開管理。無論財務部要連去哪個銀行,只要來源是財務部,就統一走特定的 IP Pool,這比在每一條 Policy 裡重複設定 IP Pool 更不容易出錯,也更容易維護。
Quiz 隨堂測驗
請回答以下問題來測試你的學習成果: