源码安装fail2ban
源码安装fail2ban
碎碎念:
这几天早上都比较凉爽,甚至有一丝凉意,到了中午下午太阳出来,还有些许燥热。下班后,抬头只见蓝天白云,天上的云朵像棉花糖一样铺了几朵,余晖落在身上,有种温暖舒适的感觉,这一刻尽情享受生命的美好。
下载
https://github.com/fail2ban/fail2ban/releases
安装
源码安装可以用于centos,欧拉系统等
这里以欧拉系统为例
先安装python环境:
dnf install python3
解压:
tar -zxf fail2ban-1.1.0.tar.gz
安装:
python3 setup.py install
然后就是复制jail.conf为jail.local去jail.local进行相关配置,具体使用方法可以参考:https://www.cnblogs.com/sillage/p/13966485.html ,此处不再详讲
tips:可以使用fail2ban-server -t检查你的jail.local语法是否正确
添加fail2ban服务
复制源码安装包中build目录下的fail2ban.service到/usr/lib/systemd/system
cp fail2ban-1.1.0/build/fail2ban.service /usr/lib/systemd/system/fail2ban.service
修改fail2ban.service中python环境为本机的具体路径:
[Service]
Type=simple
#Environment="PYTHONNOUSERSITE=1" 这里是原本的,要改为具体的python环境的路径,参考下面
Enviroment="PYTHONPATH=/usr/local/lib/python3.11/site-packages/"
完整的fail2ban.service如下:
[Unit]
Description=Fail2Ban Service
Documentation=man:fail2ban(1)
After=network.target iptables.service firewalld.service ip6tables.service ipset.service nftables.service
PartOf=iptables.service firewalld.service ip6tables.service ipset.service nftables.service
[Service]
Type=simple
#Environment="PYTHONNOUSERSITE=1"
Enviroment="PYTHONPATH=/usr/local/lib/python3.11/site-packages/"
ExecStartPre=/bin/mkdir -p /run/fail2ban
ExecStart=/usr/local/bin/fail2ban-server -xf start
# if should be logged in systemd journal, use following line or set logtarget to sysout in fail2ban.local
# ExecStart=/usr/local/bin/fail2ban-server -xf --logtarget=sysout start
ExecStop=/usr/local/bin/fail2ban-client stop
ExecReload=/usr/local/bin/fail2ban-client reload
PIDFile=/run/fail2ban/fail2ban.pid
Restart=on-failure
RestartPreventExitStatus=0 255
[Install]
WantedBy=multi-user.target
直接一键三连:
systemctl daemon-reload
systemctl enable --now fail2ban
systemctl start fail2ban
可以看到fail2ban服务已经正常启动了
可能遇到的报错
启动fail2ban服务的时候报错:
× fail2ban.service - Fail2Ban Service
Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; preset: disabled)
Active: failed (Result: exit-code) since Thu 2025-09-25 15:04:59 CST; 3s ago
Duration: 29ms
Docs: man:fail2ban(1)
Process: 2499477 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
Process: 2499480 ExecStart=/usr/local/bin/fail2ban-server -xf start (code=exited, status=1/FAILURE)
Main PID: 2499480 (code=exited, status=1/FAILURE)
Sep 25 15:04:59 test systemd[1]: fail2ban.service: Scheduled restart job, restart counter is at 5.
Sep 25 15:04:59 test systemd[1]: fail2ban.service: Start request repeated too quickly.
Sep 25 15:04:59 test systemd[1]: fail2ban.service: Failed with result 'exit-code'.
Sep 25 15:04:59 test systemd[1]: Failed to start Fail2Ban Service.
这是因为在fail2ban.service中,没有把python环境的路径写上去
参考:https://github.com/fail2ban/fail2ban/issues/3843
对于欧拉系统不生效问题排查
2025.9.26更新,注意,阅读本节前,你应当有使用过fail2ban经历
用欧拉系统源码安装fail2ban后,发现服务是正常的,配置也是没问题的,但是测试就是不生效,在规定时间内超过三次的尝试还是不会被ban
经过排查,终于找到了问题所在
我们先来了解fail2ban的封禁实现逻辑
fail2ban会按照我们配置的logpath,比如/var/log/secure下记录的登录日志,通过/etc/fail2ban/filter.d/sshd.conf的正则匹配去匹配登录失败的IP,然后封禁IP,对于centos来说,登录失败的日志格式为:Failed password for root from 192.168.1.250 port 62533 ssh2是可以正常匹配的,但是欧拉系统的secure日志不是这样的(在sshd_config中的LogLevel同为Verbose的情况下),导致无法匹配和封禁。
你可以先用此命令测试看能抓取匹配日志中有爆破行为登录失败的IP否:
sudo fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf
所以解决办法有以下,推荐使用方法3:
1、改正则匹配规则,以匹配secure日志
2、读取journal中的信息进行封禁,而不是secure文件,但是会有权限相关的问题,fail2ban正常情况下是不能读取systemd的日志的,需要调整selinux相关的,可以问AI如何实现
3、修改rsyslog的配置,让secure生成我们需要带有Failed password 的登录日志,vim /etc/rsyslog.conf,修改为:
auth,authpriv.* /var/log/secure
重启相关服务:systemctl restart rsyslog sshd
推荐用方法3,改起来是最方便的,实测也是没问题。
如果还是不生效,那么把防火墙开启,遵循端口有需要才开放的原则开放端口,再试一下。
对于方式1你可以将你的secure文件提交给AI,让AI帮你写正则匹配表达式,然后改/etc/fail2ban/filter.d/sshd.conf中的failregex部分就可以了,此处不详述。
对于方式2,我们需要改fail2ban的配置为读取journal日志,而且还要改selinux权限相关(此处省略,自行问AI),有点麻烦,不推荐此方法:
修改jail.local
[sshd]
enabled = true
filter = sshd
# 使用 journald 作为日志源(欧拉24推荐)
backend = systemd
logpath = sshd
# 或者使用传统文件路径(如果存在)
# logpath = /var/log/secure
port = 22
maxretry = 3
findtime = 300
bantime = 86400
action = %(action_mwl)s
以下是我们在欧拉通过实测发现,在journal中的日志就是我们需要的,可以匹配用于IP封禁的日志,可以去改vim /etc/rsyslog.conf配置,让这部分信息写入到secure:
[root@plmc-test log]# journalctl -u sshd -f | grep -i "failed\|authentication"
Sep 28 11:48:05 plmc-test sshd[43806]: Failed publickey for root from 192.168.1.99 port 56294 ssh2: ED25519 SHA256:QLI8OqtZvLAu9IXF1E4sNJsD6I+Rfr2xsTXIPqhyRNI
Sep 28 11:48:06 plmc-test sshd[43806]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.99 user=root
Sep 28 11:48:09 plmc-test sshd[43806]: Failed password for root from 192.168.1.99 port 56294 ssh2
Sep 28 11:48:23 plmc-test sshd[43806]: Failed password for root from 192.168.1.99 port 56294 ssh2
Sep 28 11:48:28 plmc-test sshd[43806]: PAM 1 more authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.99 user=root
卸载fail2ban
可以通过yum工具,比如yum romve fail2ban这样一键卸载,如果是源码安装也可以手动删除卸载:
# 删除文件
sudo rm -rf /usr/local/bin/fail2ban-*
sudo rm -rf /etc/fail2ban
sudo rm /usr/lib/systemd/system/fail2ban.service
sudo rm -rf /var/log/fail2ban
sudo rm -rf /var/run/fail2ban
# 重载 systemd
sudo systemctl daemon-reload

浙公网安备 33010602011771号