攻擊者常透過代理伺服器隱藏真實 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 模式。
$v) echo "$k\t$v\n";
?>
瀏覽器存取 https://domain/self.php 觀察輸出,確認 HTTP_X_FORWARDED_FOR 格式。
針對「雙 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。
# 定義白名單對應 (映射表)
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
X-Forwarded-For 可偽造,建議結合 real_ip 模組從可信代理讀取真實 IP。\[[^\]]+\],\s*\[[^\]]+\])。if 效能較差,考慮用 map + split_clients 或 Lua (OpenResty) 處理。部署此規則後,可有效阻擋利用公共代理發動的針對性 CC 攻擊,保護後端資料庫資源。