記憶體消耗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。
/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 的內容
包含 Systemd的
fail2ban-server
服務文件。$ 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
在那裡添加您的選項。
超限和系統
如果您嘗試
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).
參考
如果你的機器有常用的 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'