Nginx

NginX Logstash 中多個 IP 的 Grok 問題

  • April 9, 2020

我從我的網路伺服器進行日誌記錄時遇到問題,該伺服器有一個 elb,然後在 nginx 層前面有一個清漆層。

varnish 已為 X-Forwarded-For 正確設置,並且日誌正常通過,並記錄了正確的“client.ip”。

但是,nginx 日誌在請求中包含完整的 IP 列表。預設的 grok 行為似乎將客戶端 IP 設置為列表中的最後一個,即。elb 和 varnish 伺服器,這弄亂了我的 nginx 日誌的 client.ip 欄位。正確的客戶端 IP 應該是列表中的第一個(或至少是前幾個)。

這是一個例子:

172.31.7.219 - - [28/Sep/2015:12:39:56 +1000] "GET /api/filter/14928/content?api_key=apikey&site=website HTTP/1.1" 403 101 "-" "-" "my.website.com" "1.144.97.102, 1.144.97.102, 1.144.97.102, 127.0.0.1, 172.31.26.59"

問題是我無法調整 grok 來處理這樣的結果,heroku grok 調試器似乎不適用於這個查詢和我的 grok——但它們在 logstash IE 中工作。不標記 grok 失敗。

我試圖調試特定部分,但我還沒有找到一種方法來使用 IP/IPORHOST 執行我需要的操作,其中有一個逗號分隔的 IP 地址列表。我需要能夠指定它應該使用哪個 IP。IE。列表中的第一個應該是 client.ip 而不是最後一個。

我的 nginx grok 是:

NGINXACCESS %{IP:clientip} %{NGUSER:ident} %{NGUSER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer})(?:;|) %{QS:agent}

關於 grok 的任何想法來覆蓋該日誌?

不確定您是否仍然遇到此問題,但如果是這樣,這對您有用。

鑑於此日誌格式:

log_format custom '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$host" "$http_x_forwarded_for"';

您指定的 grok 模式沒有考慮到該 "$host" "$http_x_forwarded_for"部分的添加。

不知道為什麼你的 grok 沒有失敗,但它應該。

無論如何,此模式將適用於上述日誌格式:

%{IP:clientip} %{NOTSPACE:ident} %{NOTSPACE:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer})(?:;|) %{QS:agent} "%{NOTSPACE:host}" "(?<x_forwarded_for>%{IP:xff_clientip}, .*)"

並在以下欄位中產生

httpversion      1.1
request          /api/filter/14928/content?api_key=apikey&site=website
timestamp        28/Sep/2015:12:39:56·+1000
auth             -
host             my.website.com
agent            "-"
x_forwarded_for    1.144.97.102,·1.144.97.102,·1.144.97.102,·127.0.0.1,·172.31.26.59
clientip         172.31.7.219
bytes            101
response         403
xff_clientip     1.144.97.102
ident            -
port    
verb             GET
referrer    

請注意,與以前相比,您有幾個新欄位。

第一個 (“x_forward_for” => 1.144.97.102, 1.144.97.102, 1.144.97.102, 127.0.0.1, 172.31.26.59) 是最後一組引號的內容,或者$http_x_forwarded_for來自日誌格式。

第二個 (“xff_clientip” => 1.144.97.102)只是該列表中的第一個 IP,它應該轉換為請求的實際源 IP。

如果是我,我也會x_forwarded_for通過mutate過濾器執行該欄位以將其分解為一個數組:

mutate {
 split  => { "x_forwarded_for" => ", " }
}

引用自:https://serverfault.com/questions/725186