目錄表

網站取得用戶真實 IP 的方法

通用原則:掌握 HTTP Real IP 標頭

以下透過一個實驗環境(Cloudflare Tunnel、NPM 與 Docker Swarm 的架構)案例進行說明

graph TD %% 1. 定義主要節點 - 移除括號 A[Client - 1.2.3.4] B{Cloudflare CDN} C[Host A - 192.168.1.254 - Cloudflared] D[Host B - 192.168.1.100:80 - NPM] E[Docker Swarm Overlay Network - rproxy-net] F[Backend Service - dokuwiki_dokuwiki:80] %% 2. 結構化 - 邏輯分區 subgraph Edge & Host A A -- HTTPS --> B B -- Encrypted Tunnel --> C end subgraph Host B Docker Swarm & NPM %% Host A 到 Host B 的連線 C -- HTTP - LAN 192.168.1.x (X-Forwarded-For 開始累積,CF-Connecting-IP 帶有真實 IP) --> D %% NPM 經由 Overlay Network 到後端 D -- HTTP - rproxy-net 10.0.8.x --> E end subgraph Backend Service E -- rproxy-net 接入 --> F end %% 4. 補充細節/網絡連線 F -- 服務名稱解析 --> E

如果沒有特別設定, 因為 Docker Swarm 預設 Port Mode:Ingress 所以在 Backend Service 看到的用戶 IP 就會是 docker networks 的 rproxy-net overlay 的 IP 網段 Exp. 10.0.8.0/24

1. NPM 必須要將 Port Mode 改成 Host

2. NPM 內對 Backend Service 網站的設定

Advanced 的設定說明

當設定 real_ip_recursive on 時,Nginx 會從 X-Forwarded-For 列表的最右邊開始,依序移除屬於 set_real_ip_from 信任範圍內的 IP,直到遇到第一個非信任 IP。由於我們這裡直接使用 real_ip_header CF-Connecting-IP,因此它會被視為真實 IP 並覆蓋 $remote_addr。」

3. Backend Service 內的 Nginx Config 設定