Centos

記憶體消耗Fail2Ban CentOS

  • April 7, 2021

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'

引用自:https://unix.stackexchange.com/questions/170671