我们正在使用logstash和它的grok过滤来预处理我们的Apache Logfiles。 我们所有的机器都落后于负载平衡器,因此客户端IP被登录到" X-Forwarded-For"报头中。
我们的访问日志如下所示:
"18.32.120.32, 192.168.12.118" [07/Sep/2014:15:53:48 +0200] "GET /login HTTP/1.1" 200 137 "http://www.google.com" "Mozilla/5.0 (Windows NT 5.1; rv:32.0) Gecko/20100101 Firefox/32.0"
"18.32.120.32, 88.32.240.21, 192.168.12.118" [07/Sep/2014:15:53:48 +0200] "GET /login HTTP/1.1" 200 137 "http://www.google.com" "Mozilla/5.0 (Windows NT 5.1; rv:32.0) Gecko/20100101 Firefox/32.0"
相应的apache logging指令如下所示:
LogFormat "\"%{X-Forwarded-For}i\" %t %{Host}i \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"
如您所见,x-forwarded-for标头可以包含1到3个IP地址,具体取决于接收请求的方式。
我们将 x-Forwarded-for 标题解释为" QuotedString"在logstash / grok模式中:
CUSTOMLOG %{QUOTEDSTRING:xforwardedfor_header} \[%{HTTPDATE:time}\] %{HOSTNAME:host_header} \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QUOTEDSTRING:http_referrer} %{QUOTEDSTRING:http_useragent}
如果我们尝试在xforwardedfor_header字段中使用grok中的GeoIP模块,则地理分辨率将失败。不应该搜索模块并使用它遇到的第一个IP地址吗?
我们是否需要以另一种方式解释x-forwarded-for条目?如果是这样,怎么样?
非常感谢。
答案 0 :(得分:2)
查看geoip
源代码,它确实有一个数组:
ip = event[@source]
ip = ip.first if ip.is_a? Array
这告诉我你的xforwardedfor_header中没有数组 - 你有一个逗号分隔的字符串......所以你只需要split它。
filter {
split {
field => xforwardedfor_header
terminator => ','
}
}
在geoip
过滤器之前执行此操作可以解决您的问题。