# 防火牆 and Proxy 部屬模式


## 防火牆定義

過濾封包的安全裝置，根據不同的防禦可以分成

1. L3/L4 網路層防火牆，在 TCP/IP 運作，分為
   1. Stateless 防火牆，沒有狀態，僅僅是根據
   2. Stateful 防火牆，根據自己的狀態表來做防禦
2. L7 應用層防火牆，對 L7 協議做防禦

### 防火牆架設

下面不同架設方式適用上面三種不同類型的防火牆。

#### 路由防火牆位置

{{< image
    src="image.png"
    alt="[第九章、防火牆與 NAT 伺服器](https://linux.vbird.org/linux_server/centos5/0250simple_firewall-centos5.php)"
    caption="[第九章、防火牆與 NAT 伺服器](https://linux.vbird.org/linux_server/centos5/0250simple_firewall-centos5.php)"
>}}

一種是放在 Router 的位置，它會切分 WAN/LAN，這時防火牆就是 LAN Server 的 Default gateway，並且它要有 Router/NAT 的功能。

#### 透明橋接模式

防火牆沒有 IP，它就只是一台 「會檢查封包的超級交換器 (Switch)」。他是隱形的，Server 什麼設定都不用改變。

#### 單臂模式 (One-Arm / Stick Mode)

這在雲端環境或負載平衡器（LB）也非常常見，設備只接「一條線」連到核心交換器，透過 VLAN Tagging，流量進入交換器後，被強制導向防火牆，檢查完後再送回同一條線流向目的地。

## Proxy

也是類似做防禦的，防火牆是 Client 與 Server 是直接握手，而 Proxy 是 Client 先跟 Proxy 握手完，Proxy 才去跟 Server 握手（Termination 終止）。

常見有以下分類：

1. Forward Proxy: 代理用戶端，隱藏用戶端身分
2. Reverse Proxy: 代理伺服器端，隱藏真實 IP or 做負載平衡
3. Transparent Proxy: 用戶端不知道有 Proxy 存在。流量在網路層被強制攔截並導向代理伺服器

### Load Balancer

可能是有 L4 or L7 LB (Proxy)。

1. L4 LB (傳輸層代理)：它只看到 TCP/UDP 層級（IP 和 Port）
   1. 連線 A (Client ↔ Proxy)： 用戶端先跟 Proxy 完成 TCP 三向握手
   2. 連線 B (Proxy ↔ Server)： Proxy 根據演算法選定後端伺服器後，再發起另一個全新的 TCP 三向握手
1. L7 LB：
   1. 連線 A (Client ↔ LB)： LB 代表後端，跟用戶端完成 TCP 三向握手。如果是 HTTPS，還要在這層完成 SSL/TLS 握手（這就是為什麼 LB 可以做 SSL Offloading）
   2. 協議解析： LB 讀取 HTTP Request 的內容（網址、Header、Cookie）
   3. 連線 B (LB ↔ Server)： LB 根據解析結果，選定一台最閒的 Server，發起另一個全新的 TCP 連線，把請求轉發過去

它可以用像是 Reverse Proxy 模式 or Transparent Proxy 模式。

1. Reverse Proxy 模式
   1. Client 看到是 LB 的 IP
   2. LB 收到封包，會把封包 src IP = LB IP, dst IP = server IP，伺服器看到是 LB 的 IP 封包
   3. Sever 不用改 Default gateway，因為它會以為旁邊的 LB 要跟他講話而已
   4. 對客戶端透明（Client 不知道後端 Server 的存在）
2. Transparent Proxy
   1. Client 還是看到 Server 自己的 IP
   2. 但可能用橋接或者其他方式讓它一定會經過 LB
   3. LB 收到封包不會改變 src IP
   4. 伺服器需要改變 Gateway 變成 LB IP
   5. 對伺服器透明（Server 以為自己在直接跟 Client 溝通）

第一種 Reverse Proxy 的缺點就是 Server 以為所有封包都是 LB 傳的，解決方式是，業界會使用 PROXY Protocol。這是一種特殊的技術，在 TCP 連線建立後、傳送正式資料前，先送一小段包含 Client IP 的資訊。後端伺服器（如 Nginx 或 Varnish）只要有開啟支援，就能從 TCP 連線中「聽」到真實 IP。

或者當他是 L7 Proxy 的時候，它可以在 HTTP Header 加上 X-Forwarded-For 就能知道真實 IP。

* L7 LB： 因為它本來就要拆開 HTTP，所以它可以順手在裡面塞一個 X-Forwarded-For: [Client_IP]
* L4 LB： 因為它不看 HTTP，它沒辦法幫你加這個欄位（除非你改用 PROXY Protocol）

---

但其實又可以針對上面兩種有變體

![alt text](image-1.png)

---

1. 標準反向代理 (Standard Reverse Proxy)

這是最常見的負載平衡模式。

* **關鍵字：**
  * **SNAT (Source Network Address Translation):** 指 LB 轉發時修改來源 IP。
  * **Layer 7 Load Balancing:** 強調運作在應用層。
  * **SSL Offloading / Termination:** 終止加密連線的過程。
  * **X-Forwarded-For (XFF):** 用於在 Header 中傳遞真實 IP 的工業標準。

1. IP 透明變體 (Full Transparency / IP Transparency)

Client 連向 VIP，但 Server 看到真實 Client IP。

* **關鍵字：**
  * **IP Transparency / Full Transparency:** 業界最通用的名稱。
  * **Spoofed Source IP:** 指 WAF 偽造來源 IP 發送給 Server。
  * **Non-SNAT Mode:** 強調不進行來源位址轉換。
  * **Direct Routing (L3):** 雖然不是 DSR，但強調 L3 路徑的完整性。
  * **Policy-Based Routing (PBR):** 通常需要配合 PBR 確保回程流量正確。

1. 純透明代理 (Transparent Proxy / Interception Proxy)

Client 連向 Server IP，半路被截擊，Server 看到真實 Client IP。

* **關鍵字：**
  * **Interception Proxy:** 這是 RFC 中最標準的稱呼，強調「攔截」。
  * **TPROXY (Transparent Proxying):** Linux 核心中實作此功能的模組名稱（FreeBSD 則常用 `fwd` 或 `divert`）。
  * **Inline Mode:** 強調設備直接串在路徑中間。
  * **L3 Transparent Mode:** 區別於 L2 的透明模式。

1. 第四種變體 (Transparent Interception with SNAT)

Client 連向 Server IP，但 Server 看到 WAF IP。

* **關鍵字：**
  * **Single-Arm Transparent Mode:** 常用於 LB 旁路部署。
  * **Forced Interception:** 強制流量導向，但後端接續使用代理身分。
  * **Destination NAT (DNAT) + SNAT:** 這種模式在底層其實是這兩種 NAT 的組合

---

還有一種 Full bridge 模式

這是在 20G 環境下最常見的實作。Proxy 程式會進行 「雙向偽裝」：

1. 攔截 SYN： 當 Client 發出連線請求給 Server，Bridge 攔下這個 SYN。
2. 冒充 Server： Proxy 程式直接回覆 SYN/ACK 給 Client。注意，這封回包的 來源 IP 會偽裝成 Server IP，但 MAC 是 Proxy 的。
3. 冒充 Client： 同時，Proxy 向後端 Server 發起連線，來源 IP 偽裝成 Client IP。
4. 接資料： 兩邊握手都完成後，Proxy 就在中間拆開 L7 內容檢查，沒問題後再把資料「縫合」傳給另一邊

---

還有一種特別的部屬方式是 DSR (Direct Server Return)，LB 只負責處理「進來」的請求，並把封包轉給伺服器（不改 IP，只改 MAC 位址）。伺服器處理完後，直接回包給用戶端，完全不經過 LB。

這不是 Proxy，因為它沒有 Termination。這是在 Layer 2/3 做的事。

### WAF

是一種 L7 Proxy，因為它會用到連線終止，但因為他又有安全檢查，所以也叫做 Firewall。

L7 Firewall (NGFW) 主要是看封包特徵，識別這是什麼 App (Line, FB, SSH)，看的比較淺，不一定要終止連線 (透明過濾)，保護整個內部網路 或出口。

WAF 則是看網址參數、JSON 內容、Cookie，專門保護 Web Server。

同樣 WAF 類似 LB，也有兩種部屬方式。

1. WAF 的反向代理模式 (Reverse Proxy Mode)，這是最主流、最標準的部署方式（例如 Cloudflare WAF 或硬體 F5 WAF）
   1. Client 看到的是 WAF IP
   2. WAF 執行 Termination：WAF 向後端伺服器發起新連線時，會進行 SNAT（來源 IP 變成 WAF 的內網 IP）
   3. 部署最簡單，伺服器完全不需要改 Gateway
   4. 伺服器 Log 看到的都是 WAF 的 IP（需透過 X-Forwarded-For 取得真實 IP）
2. WAF 的透明代理模式 (Transparent Proxy Mode)
   1. Client 看到還是 Server IP
   2. WAF 像「保險絲」一樣插在 Server 前面，或者透過路由（L3）強制將流量導向 WAF
   3. WAF 發起後端連線時，會保持（Spoof）原始用戶的 IP 作為來源 IP
   4. 後端伺服器可以直接在 Layer 3 看到攻擊者的真實 IP
   5. 缺點： 配置極度複雜。為了讓回程流量（Return Traffic）也經過 WAF 處理，伺服器的 Default Gateway 必須指向 WAF

