不想看長文可以直接翻到最后看結(jié)論
經(jīng)常有大哥反饋說雷池攻擊日志里顯示的 IP 有問題。
這里我來講一下為什么一些情況下雷池顯示的攻擊 IP 會有問題。
問題說明

默認情況下,雷池會通過 HTTP 連接的?Socket?套接字讀取客戶端 IP。在雷池作為最外層網(wǎng)管設(shè)備的時候這沒有問題,雷池獲取到的 IP 就是攻擊者的真實 IP。
但是,有些情況下我們需要在雷池前面再疊加其他代理設(shè)備(如 Nginx,CDN,應(yīng)用交付,API 網(wǎng)管等等)。在這種情況下,實際連接雷池的不是真正的網(wǎng)站用戶,而是這些代理設(shè)備,這種情況下我們就需要根據(jù)實際網(wǎng)絡(luò)拓撲來調(diào)整雷池的 IP 獲取方式。
先了解什么是?X-Forwarded-For
X-Forwarded-For?是一個相對通用的 HTTP 請求頭。
HTTP 流量在經(jīng)過代理時,由于網(wǎng)絡(luò)連接被截胡,服務(wù)器無法得知真正的客戶端 IP。這時代理設(shè)備會給當前的流量加上一個?X-Forwarded-For?頭,里面的內(nèi)容就是連接這個代理的客戶端 IP。
下面這個例子中 HTTP 代理通過?X-Forwarded-For?頭告訴服務(wù)器,真正的客戶端地址是?1.2.3.4
1GET / HTTP/1.1
2Host: demo.waf-ce.chaitin.cn
3User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36
4X-Forwarded-For: 1.2.3.4
X-Forwarded-For?實際上是一個鏈式結(jié)構(gòu)。如果流量經(jīng)過了多層代理設(shè)備,X-Forwarded-For?會記錄途徑的所有 IP。
下面這個例子中 HTTP 代理通過?X-Forwarded-For?頭告訴服務(wù)器,流量經(jīng)過了三層代理,真正的客戶端地址是?1.2.3.4,第一層代理的是?11.12.13.14,第二層代理的地址是?21.22.23.24,第三次代理的地址可以通過?Socket?連接直接來獲取。
1GET / HTTP/1.1
2Host: demo.waf-ce.chaitin.cn
3User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36
4X-Forwarded-For: 1.2.3.4, 11.12.13.14, 21.22.23.24
IP-Forwarded-For?頭靠譜么
在代理設(shè)備和代理鏈路可信的情況下?IP-Forwarded-For?頭傳遞的內(nèi)容是很靠譜的,可以放心的試用。
但是呢,如果代理設(shè)備不可信,那么攻擊者會通過偽造?IP-Forwarded-For?頭的辦法來實現(xiàn)偽造源 IP。
雷池的配置
雷池全局配置里有一個這樣的選項,專門用來解決這個問題。

雷池在這個配置里提供了幾個選項,根據(jù)上面講到的知識,大家可以根據(jù)實際情況來選擇最適合的選項
從網(wǎng)絡(luò)連接中獲取: 當雷池作為最外層代理設(shè)備,無其他前置代理時選用
從?X-Forwarded-For?中獲取上一級代理的地址:在流量到達雷池之前還有一層代理設(shè)備(如Nginx,CDN 等)時可選用
從?X-Forwarded-For?中獲取上上一級代理的地址:在流量到達雷池之前還有兩層代理設(shè)備(如 Nginx,CDN 等)時可選用
從?X-Forwarded-For?中獲取上上上一級代理的地址:在流量到達雷池之前還有三層代理設(shè)備(如 Nginx,CDN 等)時可選用
從其他 HTTP Header 中獲?。河袔追N情況
流量經(jīng)過了一些特殊的反向代理設(shè)備,這類代理不會發(fā)送?X-Forwarded-For?頭,但是可以通過配置,把?IP?通過其他頭發(fā)過來
流量到達雷池有多種途徑,可能有一層代理,也可能有兩層代理,可以通過配置前置代理設(shè)備來統(tǒng)一?HTTP?頭