Fail2Ban CentOS 内存消耗

Fail2Ban CentOS 内存消耗

Fail2Ban 在我的系统上使用了大量内存 (1.2 GB)。有几篇文章描述了如何减少它。以下是 Debian 的示例。

  • 将 1ulimit1 命令附加到/etc/default/fail2ban文件中。
  • 在最后一行添加(到文件):

    ulimit -s 256
    

不幸的是,CentOS 7 上没有这样的文件或目录。如何在我的系统上应用它?


经过一些提示后,我的 Fail2Ban Systemd 文件是

[Unit] 
Description=Fail2ban Service 

[Service] 
Type=forking 
ExecStart=/usr/bin/fail2ban-client -x start 
ExecStop=/usr/bin/fail2ban-client stop 
ExecReload=/usr/bin/fail2ban-client reload 
PIDFile=/var/run/fail2ban/fail2ban.pid 
Restart=always 
LimitSTACK=256`

不幸的是结果仍然是 1251888 KB。

答案1

/etc/默认值

该目录/etc/default从未在任何基于 Red Hat 的发行版上使用。这就是 Debian/Ubuntu 主义。对于 Centos 7,您可以查看已安装的与fail2ban以下相关的软件包:

$ rpm -aq|grep fail
fail2ban-server-0.9-9.el7.noarch
fail2ban-sendmail-0.9-9.el7.noarch
fail2ban-firewalld-0.9-9.el7.noarch
fail2ban-systemd-0.9-9.el7.noarch
fail2ban-0.9-9.el7.noarch

fail2ban-server 的内容

包含fail2ban-serverSystemd 的服务文件。

$ rpm -ql fail2ban-server-0.9-9.el7.noarch | grep systemd
/usr/lib/python2.7/site-packages/fail2ban/server/filtersystemd.py
/usr/lib/python2.7/site-packages/fail2ban/server/filtersystemd.pyc
/usr/lib/python2.7/site-packages/fail2ban/server/filtersystemd.pyo
/usr/lib/systemd/system/fail2ban.service

系统服务文件

Systemd服务文件的内容:

$ more /usr/lib/systemd/system/fail2ban.service
[Unit]
Description=Fail2ban Service
After=syslog.target network.target firewalld.service

[Service]
Type=forking
ExecStart=/usr/bin/fail2ban-client -x start
ExecStop=/usr/bin/fail2ban-client stop
ExecReload=/usr/bin/fail2ban-client reload
PIDFile=/var/run/fail2ban/fail2ban.pid
Restart=always

[Install]
WantedBy=multi-user.target

因此,人们可以将额外的选项添加到该文件中,作为一种快速而肮脏的方法来确认它们是否正在工作。

长期修复

为了使它们永久存在,我将以更“官方”的方式添加选项,以便对fail2ban包的更新不会覆盖对此文件的修改。这可以通过fail2ban.service在此目录中添加文件的自定义版本来完成:

/etc/systemd/system/fail2ban.service

笔记:此目录中的文件/etc/systemd/system始终会覆盖默认.service文件。

但是,这样做有一些注意事项,其中之一是,如果此处存在服务文件,则在fail2ban通过该文件进行更新时yum将导致该服务被禁用,直到您手动重新启用它。因此,您可以.service通过将文件片段添加到下面的此目录来覆盖文件片段/etc

摘抄

要编辑包提供的单元文件,您可以创建一个名为 /etc/systemd/system/unit.d/ 的目录,例如 /etc/systemd/system/httpd.service.d/ 并将 *.conf 文件放置在其中覆盖或添加新选项。 systemd 将解析这些 *.conf 文件并将它们应用到原始单元之上。例如,如果您只是想向单元添加额外的依赖项,您可以创建以下文件:/etc/systemd/system/unit.d/customdependency.conf

   [Unit]
   Requires=new dependency
   After=new dependency

作为另一个示例,为了替换非 oneshot 类型的单元的 ExecStart 指令,请创建以下文件: /etc/systemd/system/unit.d/customexec.conf

   [Service]
   ExecStart=
   ExecStart=new command

所以你可以创建一个目录,/etc/systemd/system/fail2ban.service.d*.conf在其中添加文件,内容如下:

[Service]
ExecStart=
ExecStart=new command

在那里添加您的选项。

Ulimits 和 Systemd

如果您尝试ulimit为特定服务设置选项,请查看 的手册页systemd.exec

摘抄
LimitCPU=, LimitFSIZE=, LimitDATA=, LimitSTACK=, LimitCORE=, LimitRSS=, 
LimitNOFILE=, LimitAS=, LimitNPROC=, LimitMEMLOCK=, LimitLOCKS=,
LimitSIGPENDING=, LimitMSGQUEUE=, LimitNICE=, LimitRTPRIO=, LimitRTTIME=
These settings control various resource limits for executed processes. See 
setrlimit(2) for details. Use the string infinity to configure no limit 
on a specific resource.

因此,只需添加到我上面描述的LimitSTACK=256自定义.conf文件中就可以得到与设置相同的效果ulimit -s 256

摘录 - setrlimit(2) 手册页

如果您查看setrlimit(2)手册页,您可以看到这些ulimit开关如何与 Systemd 限制保持一致。

   RLIMIT_STACK
        The maximum size of the process stack, in bytes.  Upon reaching 
        this limit, a SIGSEGV signal is generated.  To handle this signal, 
        a process must employ an alternate signal stack (sigaltstack(2)).

        Since Linux 2.6.23, this limit also determines the amount of space 
        used for the process's  command-line  arguments  and  environment
        variables; for details, see execve(2).

参考

答案2

如果您的机器有常用的 sysvinit 脚本,您可以/etc/init.d/fail2ban(尽早,即在守护进程启动之前)执行此操作。

如果您的机器使用 systemd,您可以通过fail2ban.service.例如,而不是

ExecStart=/usr/bin/fail2ban-client -x start

ExecStart=/bin/sh -c 'ulimit -s 256; /usr/bin/fail2ban-client -x start'

答案3

解决方案是编辑/etc/init.d/fail2ban。

这是启动脚本:

start() {
echo -n $"Starting fail2ban: "
ulimit -s 256
${FAIL2BAN} -x start > /dev/null
RETVAL=$?
if [ $RETVAL = 0 ]; then
touch ${lockfile}
echo_success
else
echo_failure
fi
echo
return $RETVAL
}

不幸的是它只节省了我 50 mb

答案4

我通常做的就是在中配置类似的东西fail2ban.local

[Definition]
dbfile =
dbpurgeage = 0

这会强制fail2ban在每次重新启动时创建一个新的sqlite数据库(在内存中?),因为持久数据库包含所有已处理的原始日志行,当机器受到数百MB无用的攻击时,这通常会爆炸。登录sqlite数据库。

dbfile最初指向的/var/lib/fail2ban/fail2ban.sqlite3是持久性的,因此重新启动fail2ban不必要地从数据库重新加载这数百MB的日志(未经处理),只是为了从其他表中找出一些不同的IP - 想想吧!

相关内容