RouterOS 的 NAT 名稱很像:srcnat、src-nat、dstnat、dst-nat,但它們不是同一層設定。先分清楚「封包走哪一條 chain」和「要執行哪一個 action」,後面的規則才不容易寫反。
這篇先講 NAT 原理與判斷方式。若你已經確定要把網站服務開放給外部連線,可接著看 RouterOS Port Forward 實作教學。
文中的 IP 都是文件範例位址,不能直接套用到你的環境:
- 內網:
192.168.88.0/24 - 固定公網 IP:
203.0.113.10 - 外部測試端:
198.51.100.25
NAT 是什麼?
NAT(Network Address Translation)會在封包通過路由器時改寫 IPv4 的來源或目的位址。最常見的兩個用途是:
- 內網電腦連上 Internet:把私有來源 IP 改成路由器的公網 IP。
- 外部連到內網服務:把公網 IP 與連接埠改成內部伺服器的 IP 與連接埠。
NAT 解決的是「位址如何轉換」,不是「封包是否應該被允許」。是否放行仍由 firewall filter 決定。
chain 和 action 為什麼不要混在一起?
在 RouterOS 規則裡,chain 是封包要被哪一類 NAT 規則檢查;action 是條件符合後要做什麼。
| 用途 | chain | 常用 action | 改寫內容 |
|---|---|---|---|
| 內網往外連,固定公網 IP | srcnat | src-nat | 來源 IP |
| 內網往外連,動態公網 IP | srcnat | masquerade | 來源 IP |
| 外部連進內網服務 | dstnat | dst-nat | 目的 IP/連接埠 |
最容易忽略的是連字號:
chain=srcnat、chain=dstnat的名稱沒有連字號。action=src-nat、action=dst-nat的名稱有連字號。action=masquerade是為會變動的出口 IP 設計的特殊來源 NAT 動作。
SRC-NAT 是什麼?
SRC-NAT 會改寫封包的來源位址。內網設備原本從 192.168.88.20 送出封包,經過路由器後,外部網站看到的來源可能變成 203.0.113.10。
如果 ISP 提供固定公網 IP,可明確指定 action=src-nat 和 to-addresses:
/ip firewall nat add chain=srcnat src-address=192.168.88.0/24 out-interface=ether1 action=src-nat to-addresses=203.0.113.10 comment="LAN via static public IP"
這裡的意思是:
- 只處理來自
192.168.88.0/24的流量。 - 流量必須從
ether1離開。 - 把來源位址改成指定的固定 IP
203.0.113.10。
實際套用前,固定 IP、閘道與路由必須已依 ISP 提供的資料正確設定。不要因為範例用了 203.0.113.10 就直接複製。
固定 IP 為什麼用 src-nat?
固定公網 IP 不會因 DHCP 租約更新或 PPPoE 重連而隨機更換,因此直接指定 to-addresses 比較清楚,也適合有多個公網 IP、需要控制不同內網來源從哪一個 IP 出口的環境。
你仍然要確認:
- 該公網 IP 確實由 ISP 配給你。
- 路由器介面與 route 設定正確。
- 規則中的 LAN 網段和 WAN interface 符合現場環境。
- 前面沒有另一條更早命中的
srcnat規則。
動態 DHCP 或 PPPoE 為什麼用 masquerade?
如果 WAN 位址由 DHCP 取得,或 PPPoE 重連後可能換 IP,通常使用 masquerade:
/ip firewall nat add chain=srcnat src-address=192.168.88.0/24 out-interface=pppoe-out1 action=masquerade comment="LAN via dynamic PPPoE"
若動態 IP 在 ether1 上,則把 out-interface 改成現場實際的 WAN 介面。
masquerade 會依封包實際離開的介面選擇來源 IP;當介面斷線或 IP 改變時,RouterOS 也會清除與該介面相關的 masquerade connection tracking 項目,以便新連線採用新位址。
它不是所有環境都比較好的通用寫法。固定 IP 場景通常應使用可明確控制位址的 src-nat。
DST-NAT 和 DNAT 是什麼?
DST-NAT 會改寫封包的目的位址,常被簡稱為 DNAT。Port Forward 就是最常見的 DST-NAT 應用。
假設外部使用者連到 203.0.113.10:443,要把連線送到內網網站伺服器 192.168.88.50:443:
/ip firewall nat add chain=dstnat in-interface=ether1 dst-address=203.0.113.10 protocol=tcp dst-port=443 action=dst-nat to-addresses=192.168.88.50 to-ports=443 comment="HTTPS to internal server"
這條規則只做目的位址轉換,不代表 firewall 已經允許封包通過。對應的 filter 規則仍要限制到必要的服務、主機與來源,並放在拒絕規則之前。
例如只放行這個已做 DST-NAT 的 HTTPS 目的地:
/ip firewall filter add chain=forward in-interface=ether1 dst-address=192.168.88.50 protocol=tcp dst-port=443 connection-nat-state=dstnat action=accept comment="Allow forwarded HTTPS"
上線前應再依你的預設防火牆、interface list 與規則順序檢查,不能把單一範例視為完整安全政策。
NAT 和 Firewall 有什麼不同?
可以把兩者分成兩個問題:
- NAT:封包的來源或目的位址要改成什麼?
- Firewall:這個封包是否可以進入路由器、送往路由器,或轉送到其他設備?
Port Forward 規則存在,不代表服務就一定可連線;filter rule 放行,也不代表目的位址已正確轉到內網主機。排錯時要分別檢查 /ip firewall nat 和 /ip firewall filter。
NAT 也不是安全產品,不能取代更新、身分驗證、存取來源限制、日誌或備份。請勿把 WinBox、WebFig、RouterOS API、SSH、NAS 後台或其他管理介面直接公開給整個 Internet。
CGNAT 為什麼會讓 DNAT 失效?
ISP 可能在電信商網路裡再做一層 NAT,稱為 CGNAT。常見線索是 RouterOS WAN 位址落在 100.64.0.0/10,或路由器顯示的 WAN IP 與外部網站查到的出口 IP 不同。
在 CGNAT 後方,即使你的 RouterOS 寫了 dst-nat,Internet 上的新連線通常也到不了這台路由器,因為真正持有公網 IP 的是 ISP 設備,你無法在那一層自行設定 Port Forward。
另外,WAN 若拿到 10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16,通常代表前面還有一層私有網路或路由器,也要先處理上游 NAT。
需要外部連入時,可以向 ISP 確認是否能提供公網 IP 或固定 IP。不要把購買固定 IP 和完成防火牆、安全維護畫上等號;它只是讓端點可被穩定識別與連線的其中一項條件。
為什麼改完 NAT 規則還是看到舊結果?
RouterOS NAT 只在一條連線的第一個封包比對規則,後續封包會依 connection tracking 記住的結果處理。因此修改或新增 NAT 規則後,已存在的連線可能暫時沿用舊轉換。
先查看目前的 connection tracking:
/ip firewall connection print
較安全的測試順序是:
- 從外部測試端中斷原連線。
- 換一個全新的連線重新測試。
- 等待舊 connection tracking 項目過期,或只移除確認要重測的項目。
清空全部 connection tracking 會中斷正在通過路由器的連線。只有在維護時段、了解影響範圍並確定需要時,才使用:
/ip firewall connection remove [find]
不要在營運中的路由器為了方便測試就直接執行。
如何確認 NAT 規則有命中?
查看 NAT 規則與 counter:
/ip firewall nat print stats
從外部建立一條新連線,再觀察預期規則的 packet/byte counter 是否增加。因為 NAT 規則針對新連線的第一個封包決定轉換,測試時應建立新連線,而不是持續重用同一個既有 session。
如果完全沒有命中,依序檢查:
- 封包方向是否對應正確的
srcnat或dstnatchain。 - WAN interface、來源網段、目的 IP、protocol 和 port 是否寫對。
- 更前面的規則是否先命中。
- 公網 IP 是否真的在這台路由器,前方是否有雙重 NAT 或 CGNAT。
- 測試流量是否真的從外部網路進來。
counter 有增加但連線仍失敗,則繼續查 filter rule、內部服務是否有監聽、伺服器本機防火牆,以及回程路由。
常見錯誤有哪些?
| 錯誤 | 正確理解 |
|---|---|
把 chain=src-nat 寫進設定 | chain 是 srcnat,沒有連字號 |
| 固定 IP 也一律使用 masquerade | 固定公網 IP 通常用 action=src-nat 明確指定 |
| 寫了 DST-NAT 就代表已安全放行 | NAT 與 firewall filter 是不同功能 |
| 從同一個 LAN 測公網位址就下結論 | 可能受 hairpin NAT 或 split DNS 影響,應從外部測 |
WAN 是 100.64.0.0/10 還一直改 DNAT | 先確認 ISP CGNAT 與公網 IP 條件 |
| 改規則後只重送同一條連線 | 舊 connection tracking 可能仍保留原結果 |
下一步怎麼做?
- 要實際開放 HTTPS 服務:看 RouterOS Port Forward 與防火牆教學。
- 還沒完成 WAN、LAN 與 DHCP:先看 RouterOS 新手第一次設定。
- 規則看起來正確但網路仍不通:依 RouterOS 基礎排錯流程 檢查。
- 公司需要固定 IP、雲端白名單或備援線路:了解 企業網路與固定 IP 規劃。
所有掃描與連線測試都只能針對你擁有或已獲授權的設備與服務。NAT 只負責位址轉換,不保證服務安全,也不能取代完整的防火牆與主機維護。
參考資料: