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-server
Systemd 的服务文件。
$ 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)
手册页,您可以看到这些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 - 想想吧!