iT邦幫忙

2026 iThome 鐵人賽

DAY 5
0

ACL

在 NVIDIA (Cumulus Linux) 生態系中,存取控制串列(ACL)是管理流量、保護控制層與提升效能的核心元件。以下將從架構、與 iptables 的關係、使用方式與資料流、狀態機制,以及使用限制來為你全面解析。

ACL 的架構原理

在 Cumulus Linux 中,ACL 主要用於在 OSI 模型的第 2、3 和 4 層對封包進行分類與過濾。它的架構基於 Linux 核心的過濾機制。下圖顯示了封包從進入到輸出的流程:Prerouting -> 路由決定 -> (Input -> 控制平面軟體 -> Output) / Forward -> Postrouting

acl-chains

  • Chains (鏈): 決定封包在系統生命週期中被檢驗的時間點。
    • PREROUTING:在交換器對封包進行路由之前接觸封包。
    • INPUT:在交換器確定封包是發往本機系統之後,但在控制平面軟體接收它們之前接觸封包。
    • FORWARD:在傳輸流量通過交換器移動時接觸它。
    • OUTPUT:在來自控制平面軟體的封包離開交換器之前接觸它們。
    • POSTROUTING:在封包離開交換器之前(但在做出路由決定之後)立即接觸封包。
  • Tables (表)
    • Filter:對流量進行分類或過濾流量。
    • NAT:套用網路位址轉換 (Network Address Translation) 規則。
    • Mangle:在封包通過交換器時更改封包。
  • Rules(規則) 規則將想要控制的流量進行分類。將規則套用於鏈,而鏈則附加到表上。下圖顯示指令範例解析,-t mangle (Table) -A PREROUTING (Chain) -p tcp --dport 22 (Matches) -j (Jump) DSCP --set-dscp 46 (Targets)
    • Table:第一個參數是表 (table)。
    • Chain:第二個參數是鏈 (chain)。每個表支援幾個不同的鏈。
    • Matches (比對條件):第三個參數是比對條件 (match)。可以在單一規則中指定多個比對條件。然而,在規則中使用的比對條件越多,該規則消耗的記憶體就越多。
    • Jump (跳轉):Jump 指定了規則的目標;即如果封包符合該規則,要採取什麼動作。如果在規則中省略此選項,符合該規則不會對封包產生任何影響,但規則上的計數器會增加。
    • Targets (目標):Target 是一個使用者定義的鏈(不同於此規則所在的鏈)、一個立即決定封包命運的特殊內建目標(例如 DROP),或者是一個擴展目標。

acl-tables-chains-rules

每個表都有一組預設鏈,這些鏈在通過交換器的路徑的不同點修改或檢查封包。鏈包含影響流量的個別規則。在架構上,Cumulus 5.0 以後的版本,將硬體轉發(Transit)的 Ingress(入站)ACL 規則放在 -t mangle -A PREROUTING 鏈中,而 Egress(出站)ACL 則放在 -t mangle -A POSTROUTING 鏈中。

與底層 Iptables 的關係

Cumulus Linux 是基於 Linux 的作業系統,其 ACL 語法完全相容於 Linux 的使用者空間工具:iptables (IPv4)、ip6tables (IPv6) 和 ebtables (Layer 2 MAC)。

絕對不要直接使用 iptables 指令來設定資料層(Data Plane)的轉發規則。如果直接下達 iptables -A INPUT ...,該規則只會存在於 Linux Kernel 中,無法被硬體加速 (Hardware Accelerated),交換器的 ASIC 晶片不會生效。

在 NVIDIA 交換器上,必須透過 NVUE 或 cl-acltool 進行配置。這些工具會將規則寫入 /etc/cumulus/acl/policy.d/ 等目錄中,並透過 switchd 這個硬體抽象層守護行程 (Daemon),將 Linux Kernel 的設定同步燒錄到 Spectrum ASIC 底層的 TCAM / ATCAM 記憶體中,藉此實現線速 (Wire-speed) 轉發。如果執行 cl-acltool -i 進行重載,系統會清空所有不在 policy 設定檔內的 iptables 規則。

Stateful 與 Stateless 狀態是什麼?

在防火牆與 ACL 的概念中

  • Stateful (有狀態): 交換器會記住連線的狀態(例如 TCP 的三方交握),並允許同一條連線的回應封包通過(例如 ESTABLISHED, RELATED 狀態)。
  • Stateless (無狀態): 設備不記錄連線狀態,單純依據每一個獨立的封包標頭(IP、Port、TCP Flag)來決定允許或丟棄。

在 Cumulus Linux 的支援情況

  • Data Plane (資料層/硬體轉發) 是 Stateless 的: 寫入硬體 ASIC 的過濾規則(Transit 流量)不支援連線狀態比對(connection-state),你必須手動透過特定的 TCP Flags(如 SYN, ACK)進行無狀態的過濾。
  • Control Plane (控制層防火牆) 支援 Stateful: 保護交換器 CPU 本身的防火牆規則(如 SSH 或 BGP 的防護),是在作業系統層級處理。因此可以支援 match ip connection-state newestablished 這種 Stateful 的比對機制。

下圖可以看到 1 和 2 貫穿交換器屬於資料平面;3 和 4 屬於控制平面。

acl-config-example

ACL 有什麼限制?

在使用 Cumulus Linux 的 ACL 時,請注意以下架構限制:

  1. 硬體資源容量限制 (TCAM/ATCAM): 交換器的規則數量受限於硬體記憶體資源。如果網路中包含超過 1000 個 VLAN 介面,VLAN flow counters 等功能會與 ACL 共用記憶體空間(如 Spectrum-2 以上的 ATCAM),可能會導致 No More Resources 的硬體寫入錯誤。
  2. Atomic 與 Non-atomic 更新模式: 預設為 Atomic 模式,會保留 50% 的硬體空間以實現無中斷規則替換。若為了佈署更多的規則可切換為 Non-atomic 模式,但更新大規模規則時可能造成短暫的流量中斷。
  3. 不支援的規則與比對機制: 並非所有 Linux iptables 功能都能寫入硬體。例如:不支援 Inverse matching (反向比對,如 ! -p tcp)、不支援基於 UID 的 LOG 功能,以及部分 Extended targets。
  4. 介面套用限制:
    • Egress (出站) ACL 無法針對邏輯的 bond (Port-channel) 介面進行比對,你只能把規則套用到組成 Bond 的實體成員介面上。
    • ACL 的輸出埠若設定為子介面 (Subinterface, 例如 swp49s1.100) 將無法成功比對,只能套用於主要實體埠。

上一篇
NVUE - EVPN Multihoming LAB
下一篇
NVUE - ACL LAB
系列文
ToR 的復仇-頂架也能跑馬拉松20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言