修改Apache2的Access日志格式

这是一个由实际需求引发的问题。公司服务器上原来有一个防止恶意抓取脚本,基本思路是从Apache2的access.log中获取到访问的来源ip,然后对ip进行分析,提取出其中的可疑ip加入Apache2的block ip中。

但是,由于Apache版本的升级还是其他不知道的什么缘故,脚本无法使用了。查到原因发现是因为类似以下的记录引起的:

记录1:

记录2:

这是两条非常典型的非典型记录,主要问题处在第一个字段(Hostname)。默认的access.log中记录的第一个字段为来访的主机名,一般情况下是ip地址,但是在记录1中,显示的是一个完整的主机名。这是一个来自Google的bot,主机名为crawl-66-249-75-174.googlebot.com,ip地址被放在了中间。于是脚本识别就出现了问题。所以,我需要修改access日志,将第一个字段修改为ip而不是hostname。

网上查到apache2.conf中有一个字段是控制显示ip还是hostname,我找到了这个字段。却发现这个字段默认为off,即显示ip。

那么,问题肯定不出在这。所以我还是去查看官方文档。在mod_log_config模块中,定义了Access Log的格式。这段配置也在Apache2.conf文件中:

我的日志格式是采用的combine方式,所以看这行:

我们关注第一个参数,%h。在官方文档中是这样描述这个字段的:

%h: Remote hostname. Will log the IP address if HostnameLookups is set to Off, which is the default. If it logs the hostname for only a few hosts, you probably have access control directives mentioning them by name. See the Require host documentation.

按照这段说明,既然我设置的HostnameLookups为Off,所以应当显示IP才对,但不不知道为什么没有生效。于是,我看到文档中的另一个字段:%a,描述如下:

%a: Client IP address of the request (see the mod_remoteip module).

记录请求IP,这应该就是我要的了。于是,修改配置如下:

现在,记录1的情况就已经解决了。下面来解决记录2的问题。

“::1”这个记录是IPv6的回环地址,相当于IPv4的127.0.0.1。而我们网站并不需要IPv6的支持,那么问题就简单了,只需要关闭Apache2对IPv6的支持即可。

在ports.conf中修改下面字段即可:

重新运行脚本,可以正常使用了。

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注