RouterOS NAT 基礎:SRC-NAT、DST-NAT 與 Masquerade 差在哪?

從封包方向理解 MikroTik RouterOS 的 srcnat、dstnat、src-nat、dst-nat 與 masquerade,並說明固定 IP、動態 IP、Port Forward、CGNAT、防火牆和 connection tracking。

RouterOSMikroTikNATSRC-NATDST-NATMasqueradePort Forward固定IP動態IPCGNATConnection Tracking防火牆

RouterOS 的 NAT 名稱很像:srcnatsrc-natdstnatdst-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改寫內容
內網往外連,固定公網 IPsrcnatsrc-nat來源 IP
內網往外連,動態公網 IPsrcnatmasquerade來源 IP
外部連進內網服務dstnatdst-nat目的 IP/連接埠

最容易忽略的是連字號:

  • chain=srcnatchain=dstnat 的名稱沒有連字號。
  • action=src-nataction=dst-nat 的名稱有連字號。
  • action=masquerade 是為會變動的出口 IP 設計的特殊來源 NAT 動作。

SRC-NAT 是什麼?

SRC-NAT 會改寫封包的來源位址。內網設備原本從 192.168.88.20 送出封包,經過路由器後,外部網站看到的來源可能變成 203.0.113.10

如果 ISP 提供固定公網 IP,可明確指定 action=src-natto-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/8172.16.0.0/12192.168.0.0/16,通常代表前面還有一層私有網路或路由器,也要先處理上游 NAT。

需要外部連入時,可以向 ISP 確認是否能提供公網 IP 或固定 IP。不要把購買固定 IP 和完成防火牆、安全維護畫上等號;它只是讓端點可被穩定識別與連線的其中一項條件。

為什麼改完 NAT 規則還是看到舊結果?

RouterOS NAT 只在一條連線的第一個封包比對規則,後續封包會依 connection tracking 記住的結果處理。因此修改或新增 NAT 規則後,已存在的連線可能暫時沿用舊轉換。

先查看目前的 connection tracking:

/ip firewall connection print

較安全的測試順序是:

  1. 從外部測試端中斷原連線。
  2. 換一個全新的連線重新測試。
  3. 等待舊 connection tracking 項目過期,或只移除確認要重測的項目。

清空全部 connection tracking 會中斷正在通過路由器的連線。只有在維護時段、了解影響範圍並確定需要時,才使用:

/ip firewall connection remove [find]

不要在營運中的路由器為了方便測試就直接執行。

如何確認 NAT 規則有命中?

查看 NAT 規則與 counter:

/ip firewall nat print stats

從外部建立一條新連線,再觀察預期規則的 packet/byte counter 是否增加。因為 NAT 規則針對新連線的第一個封包決定轉換,測試時應建立新連線,而不是持續重用同一個既有 session。

如果完全沒有命中,依序檢查:

  • 封包方向是否對應正確的 srcnatdstnat chain。
  • 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 可能仍保留原結果

下一步怎麼做?

所有掃描與連線測試都只能針對你擁有或已獲授權的設備與服務。NAT 只負責位址轉換,不保證服務安全,也不能取代完整的防火牆與主機維護。

參考資料:

需要固定 IP 或企業網路規劃?

先整理雲端白名單、遠端維護、備援與跨據點需求,再決定線路與固定 IP 配置。