A10 Networks Thunder 實戰課程

Level 3 - Architect | 大規模部署與自動化

aFleX 腳本語言實戰

透過程式化邏輯實現 L7 流量操控:Tcl 語法、HTTP Header 改寫與內容過濾

一、核心概念 (Concept)

一句話定義

aFleX 是 A10 Thunder ADC 上的流量控制腳本語言 (基於 Tcl),它允許管理員在封包轉發的過程中,深入 Layer 7 (應用層) 進行即時的讀取、修改與邏輯判斷。

生活化比喻

傳統的負載平衡就像是一個「郵局分信員」,他只看信封上的地址 (IP) 和收件人 (Port),然後丟到對應的籃子裡。

aFleX 就像是一位「王牌大飯店的禮賓司 (Concierge)」。他不僅看客人是誰,還會聽客人具體說了什麼內容 (HTTP 內容)。如果客人說「我想找義大利餐廳」,他會直接帶去二樓;如果客人說的是日語,他會自動切換成日語服務;如果客人看起來像是搗亂的 (惡意特徵),他會直接請保全處理,甚至不需要驚動經理 (後端伺服器)。

二、運作原理 (Mechanism)

1. 事件驅動 (Event-Driven)

aFleX 腳本不會一直執行,而是等待特定的「網路事件」觸發。最常用的是 HTTP 相關事件。

事件 (Event) 觸發時機 常用動作
when HTTP_REQUEST ACOS 接收到客戶端完整的 HTTP 請求表頭後 網址重導、阻擋 IP、修改 Header
when HTTP_RESPONSE 伺服器回傳回應給 ACOS,準備轉發給客戶端前 隱藏 Server 版本資訊、插入 Cookie

2. Tcl 基礎語法與常用指令

aFleX 基於標準 Tcl (Tool Command Language),但增加了 ACOS 專屬的網路指令。

範例:變數與條件判斷

when HTTP_REQUEST { # 取得 URI set uri [HTTP::uri] # 判斷是否包含敏感字串 if { $uri contains "admin" } { # 拒絕連線 reject } }

範例:HTTP Header 修改

when HTTP_RESPONSE { # 移除 Server 標頭以隱藏版本資訊 HTTP::header remove "Server" # 插入安全標頭 HTTP::header insert "X-Frame-Options" "DENY" }

三、架構視覺化 (Visuals)

下圖展示了封包流經 ACOS 設備時,aFleX 引擎介入的時機點。注意 aFleX 是在 TCP 三向交握完成後,針對 HTTP 內容進行處理。

aFleX 邏輯處理流程圖

sequenceDiagram participant Client as 用戶端 (Client) participant ACOS as A10 Thunder (aFleX) participant Server as 後端伺服器 (Server) Note over Client, ACOS: 1. TCP 三向交握完成 (Layer 4) Client->>ACOS: GET /index.php HTTP/1.1 (Layer 7 Request) activate ACOS Note right of ACOS: 觸發 when HTTP_REQUEST Note right of ACOS: 執行: 檢查 URL, 改寫 Header, 選擇 Server Pool alt 條件符合 (例如: 允許存取) ACOS->>Server: 轉發修改後的請求 activate Server Server-->>ACOS: 200 OK (Layer 7 Response) deactivate Server Note left of ACOS: 觸發 when HTTP_RESPONSE Note left of ACOS: 執行: 隱藏敏感資訊, 插入 Cookie ACOS-->>Client: 回傳最終內容 else 條件攔截 (例如: 惡意請求) ACOS-->>Client: 403 Forbidden (直接回應,不經過 Server) end deactivate ACOS

四、實務應用場景 (Use Case)

案例一:強制 HTTP 轉 HTTPS (Redirect)

**情境:** 公司網站為了安全性,要求所有使用者即便輸入 http:// 也要自動跳轉到 https:// 加密連線。
**解決方案:** 使用 aFleX 偵測 Port 80 的請求,並發送 301 Redirect 指令。

when HTTP_REQUEST { # 將客戶端重導向至相同的 Host 與 URI,但使用 HTTPS HTTP::redirect "https://[HTTP::host][HTTP::uri]" }

案例二:內容過濾與維護頁面 (Content Switching)

**情境:** 應用程式的 `/legacy` 路徑對應到舊版伺服器群組,而其他路徑對應到新版。另外,若偵測到 SQL Injection 特徵,則直接阻斷。

when HTTP_REQUEST { # 1. 安全檢查:簡單的 SQL Injection 特徵過濾 if { [HTTP::uri] contains "SELECT" || [HTTP::uri] contains "UNION" } { HTTP::respond 403 content "Access Denied: Malicious Pattern Detected" return } # 2. 內容交換 (Layer 7 Switching) if { [HTTP::uri] starts_with "/legacy" } { pool old_server_group } else { pool new_server_group } }
優點:
  • 極高的靈活性,可應對非標準需求。
  • 無需修改後端應用程式程式碼。
缺點:
  • 複雜的腳本可能增加 CPU 負載。
  • 除錯 (Debug) 較為困難,需依賴 Log。

五、隨堂測驗 (Quiz)