我的日志在 /var/log/syslog/YYYY-MM-DD/file.log 文件中。rsyslog 会自动创建新目录,并将日志自动放到新位置。
每天,我都会将前一天日志存档到另一个目录,因此,除了 5 分钟时间段外,/var/log/syslog/ 中只有一个子目录。
基于此,我使用以下方法制定了 fail2ban 规则:
logpath = /var/log/syslog/*/auth.log
有效。直到午夜,fail2ban 仍会“监听”之前的日志。我可以重新加载 fail2ban 配置,但这会让我失去现有的禁令。
所以问题是 - 怎样才能让 fail2ban 切换到新日志,而不会丢失现有的禁令?
我还尝试创建符号链接 /var/log/syslog/today,指向当天的日志,并将 fail2ban 指向 /var/log/syslog/today/auth.log,但随后我得到了日志:
Jan 8 00:05:46 xxxx fail2ban.filter : ERROR Unable to open /var/log/syslog/today/auth.log
Jan 8 00:05:46 xxxx fail2ban.filter : ERROR [Errno 2] No such file or directory: '/var/log/syslog/today/auth.log'
Traceback (most recent call last):
File "/usr/share/fail2ban/server/filter.py", line 491, in getFailures
has_content = container.open()
File "/usr/share/fail2ban/server/filter.py", line 569, in open
self.__handler = open(self.__filename)
IOError: [Errno 2] No such file or directory: '/var/log/syslog/today/auth.log'
这可能是因为 auth.log 直到几分钟后才创建。
但无论如何 - fail2ban 记录了这个错误几次,然后没有监视任何东西(没有禁止任何东西)
答案1
编辑当您启动 fail2ban 时,它会打开当前看到的所有 auth 文件的文件句柄。它不会继续扫描目录以查看是否有任何新文件出现。使用符号链接不起作用,因为符号链接指向的是旧 inode,而不是新 inode。
最简单的解决方案是添加第二个单独的 authlog 文件,该文件仅供 fail2ban 使用。您可以在每个午夜清空它,以避免它变得太大。
原始答案 问题是,fail2ban 第一次启动时会打开属于该文件名的 inode/文件句柄。打开文件后,它不会检查更改,因此当文件被移动时,其文件句柄将停止工作。
解决方案是根本不移动文件。而是将其内容复制到新文件,然后清空旧文件。您没有说明轮换的具体执行方式,但大多数 logrotation 包都会有复制而不是移动的选项。