Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Nginx 拒絕代理 IP 存取:基於 X-Forwarded-For 雙 IP 特徵的精準封鎖規則

編輯:關於 Linux

攻擊者常透過代理伺服器隱藏真實 IP,發動針對資料庫密集查詢 (如 Search、F5 刷新) 的 CC 攻擊。本文說明如何分析 X-Forwarded-For 標頭中「雙 IP」特徵,在 Nginx 中以正則精準識別並回傳 503 拒絕代理存取,且不影響正常使用者。

代理請求特徵分析

正常直連:X-Forwarded-For 單一 IP (真實客戶端)。
手機 3G/4G 閘道:X-Forwarded-For: <客戶端IP>, <閘道IP> (兩個 IP)。
匿名代理/攻擊代理:X-Forwarded-For: <代理IP>, <代理IP> 或固定雙 IP 模式。

PHP 驗證腳本 (確認變數)

 $v) echo "$k\t$v\n";
?>

瀏覽器存取 https://domain/self.php 觀察輸出,確認 HTTP_X_FORWARDED_FOR 格式。

Nginx 正則封鎖規則

針對「雙 IPv4 以逗號空格分隔」模式:

# /etc/nginx/conf.d/block-proxy.conf
location / {
    # 匹配 "IP, IP" 格式 (兩組 IPv4)
    if ($http_x_forwarded_for ~ '^\d+\.\d+\.\d+\.\d+,\s*\d+\.\d+\.\d+\.\d+$') {
        return 503;   # 或 403、444
    }
    # 正常處理...
    proxy_pass https://backend;
}

正則解析:^\d+\.\d+\.\d+\.\d+ 第一組 IP,,\s* 逗號可選空白,\d+\.\d+\.\d+\.\d+$ 第二組 IP。

進階:白名單排除合法雙 IP (如企業閘道、CDN)


# 定義白名單對應 (映射表)
geo $is_legit_proxy {
    default 0;
    10.0.0.0/8 1;          # 內部閘道網段
    192.168.0.0/16 1;
    # CDN IP 範圍...
}

location / {
    if ($http_x_forwarded_for ~ '^\d+\.\d+\.\d+\.\d+,\s*\d+\.\d+\.\d+\.\d+$') {
        set $block 1;
    }
    if ($is_legit_proxy = 1) {
        set $block 0;
    }
    if ($block = 1) {
        return 503;
    }
    proxy_pass https://backend;
}

驗證與測試

# 正常請求
curl -H "X-Forwarded-For: 1.2.3.4" https://localhost/
# 代理請求 (雙 IP)
curl -H "X-Forwarded-For: 5.6.7.8, 9.10.11.12" https://localhost/
# 應回傳 503

注意事項

  • 僅在 Nginx 作為**反向代理** (前端) 時有效;若 Nginx 為後端應用伺服器,需在前端代理 (如 Cloudflare、AWS ALB) 層面處理。
  • X-Forwarded-For 可偽造,建議結合 real_ip 模組從可信代理讀取真實 IP。
  • IPv6 格式需另行正則 (\[[^\]]+\],\s*\[[^\]]+\])。
  • 高併發下 if 效能較差,考慮用 map + split_clients 或 Lua (OpenResty) 處理。

部署此規則後,可有效阻擋利用公共代理發動的針對性 CC 攻擊,保護後端資料庫資源。

Copyright © Windows教程網 All Rights Reserved