X-Forwarded-for上的Logstash GeoIP

时间:2014-09-08 14:00:56

标签: linux apache logstash

我们正在使用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条目?如果是这样,怎么样?

非常感谢。

1 个答案:

答案 0 :(得分:2)

查看geoip源代码,它确实有一个数组:

     ip = event[@source]
     ip = ip.first if ip.is_a? Array

这告诉我你的xforwardedfor_header中没有数组 - 你有一个逗号分隔的字符串......所以你只需要split它。

filter {
  split {
    field => xforwardedfor_header
    terminator => ','
  }
}

geoip过滤器之前执行此操作可以解决您的问题。