fail2ban工具安装配置及使用

1、背景:

1、有朋友问,之前的登录安全脚本能否通过fail2ban+mail实现。

2、近期HW,这些基础的安全防护还是有必要的。

3、因为是信创服务器,所以不能通过yum安装,需要源码安装。

2、思路:

1、检查运行环境是否具备安装条件(python环境)。

2、源码下载,编译,安装。

3、配置服务,基本配置,管理服务。

4、测试验证可用性。

3、开干:

1、检查运行环境是否具备安装条件(python环境)。

bash 复制代码
# 检查系统自带哪些 Python 版本
python --version 2>&1; python3 --version 2>&1; python2 --version 2>&1

# 查看 python 解释器的路径
which python python3 python2 2>/dev/null

麒麟 V10 通常自带 Python3。上面的命令显示有 python3,那就不需要用 安装 python3,直接用系统自带的 python3 即可。

2、源码下载,编译,安装。

下载

bash 复制代码
   wget https://github.com/fail2ban/fail2ban/archive/refs/tags/1.0.2.tar.gz
   # 如果没有 wget,可以用 curl:
   # curl -L -O https://github.com/fail2ban/fail2ban/archive/refs/tags/1.0.2.tar.gz
   #如果有git,用这个
   #git clone https://github.com/fail2ban/fail2ban.git

执行

bash 复制代码
[root@dev1 script]# cd fail2ban/
[root@dev1 fail2ban]# python3 setup.py install
running install
running build
running build_py
creating build
creating build/lib
creating build/lib/fail2ban
copying fail2ban/__init__.py -> build/lib/fail2ban
copying fail2ban/exceptions.py -> build/lib/fail2ban
copying fail2ban/version.py -> build/lib/fail2ban
copying fail2ban/helpers.py -> build/lib/fail2ban
copying fail2ban/setup.py -> build/lib/fail2ban
copying fail2ban/protocol.py -> build/lib/fail2ban
creating build/lib/fail2ban/client
copying fail2ban/client/filterreader.py -> build/lib/fail2ban/client
copying fail2ban/client/fail2banregex.py -> build/lib/fail2ban/client
copying fail2ban/client/fail2banreader.py -> build/lib/fail2ban/client
copying fail2ban/client/__init__.py -> build/lib/fail2ban/client
.........

Creating build/fail2ban-openrc.init (from fail2ban-openrc.init.in): @BINDIR@ -> /usr/local/bin
creating fail2ban-python binding -> /usr/local/bin
changing mode of /usr/local/bin/fail2ban-regex to 755
changing mode of /usr/local/bin/fail2ban-server to 755
changing mode of /usr/local/bin/fail2ban-testcases to 755
changing mode of /usr/local/bin/fail2ban-client to 755

Please do not forget to update your configuration files.
They are in "/etc/fail2ban/".

You can also install systemd service-unit file from "build/fail2ban.service"
resp. corresponding init script from "files/*-initd".

生成 Service 文件,处理 tmpfiles 文件

进入 files 目录,执行以下命令,把模板里的占位符替换掉,并输出为标准的 service 文件:

如果你在当前目录找不到 fail2ban.tmpfiles(可能旧版本叫法不同或没有),我们可以直接手动创建它,这只是为了配置系统运行时的临时目录,很简单:

bash 复制代码
cd /data/mdm2.0/script/fail2ban/files

# 读取模板,替换占位符,生成最终的 service 文件
python3 -c "import sys; content = open('fail2ban.service.in').read(); print(content.replace('@BINDIR@', '/usr/bin').replace('@LOCALSTATEDIR@', '/var'))" > fail2ban.service

# 确认生成成功,且里面没有残留的 @ 符号
cat fail2ban.service

cat > /etc/tmpfiles.d/fail2ban.conf << 'EOF'
d /var/run/fail2ban 0755 root root -
EOF

复制 service 文件并配置启动

bash 复制代码
cp fail2ban.service /etc/systemd/system/

# 创建日志目录
mkdir -p /var/log/fail2ban

# 重新加载 systemd
systemctl daemon-reload

# 启动并设置开机自启
systemctl enable --now fail2ban

注意:这里手动生成的service服务会有几个坑,主要如下:

(code=exited, status=203/EXEC)
  • (code=exited, status=1/FAILURE)

处理办法:

bash 复制代码
journalctl -u fail2ban -n 30 --no-pager

#确认正确的 PYTHONPATH
python3 -c "import fail2ban; print(fail2ban.__file__)"
/usr/local/lib/python3.7/site-packages/fail2ban/__init__.py

完整的/etc/systemd/system/fail2ban.service文件

bash 复制代码
[Unit]
Description=Fail2Ban Service
Documentation=man:fail2ban(1)
After=network.target iptables.service firewalld.service ip6tables.service ipset.service nftables.service

[Service]
Type=simple
Environment="PYTHONNOUSERSITE=1"
Environment="PYTHONPATH=/usr/local/lib/python3.7/site-packages"
ExecStart=/usr/bin/python3 /usr/local/bin/fail2ban-server -xf start
ExecStop=/usr/bin/python3 /usr/local/bin/fail2ban-client stop
ExecReload=/usr/bin/python3 /usr/local/bin/fail2ban-client reload
Restart=on-failure
RestartPreventExitStatus=0 255

[Install]
WantedBy=multi-user.target

3、配置服务,基本配置,管理服务。

注意:Fail2Ban 的配置文件位于 /etc/fail2ban/ 目录下。重要原则:不要直接修改 /etc/fail2ban/jail.conf(主配置文件,升级可能被覆盖),应创建或编辑 /etc/fail2ban/jail.local 文件来覆盖默认设置

bash 复制代码
[root@dev1 ~]# cat /etc/fail2ban/jail.local 
[DEFAULT]
# 忽略的 IP 列表(白名单)。多个 IP 用空格隔开。
# 可以写单个 IP,也可以写 CIDR 网段(如 192.168.1.0/24)
# 建议保留 127.0.0.1/8 ::1 以防本机服务互相影响
ignoreip = 127.0.0.1/8 ::1 <你的运维公网IP> <你的内网网段>
# 封禁时间:1天 (86400秒)
bantime  = 86400
# 检测时间窗口:10分钟 (600秒)
findtime = 600
# 最大失败次数
maxretry = 5
# 封禁动作:直接丢弃数据包
banaction = iptables-multiport

[sshd]
enabled = true
# 麒麟系统的SSH日志通常在这里,如果路径不对可以改为 /var/log/messages
logpath = /var/log/secure

重载并启动

bash 复制代码
systemctl daemon-reload
rm -f /var/run/fail2ban/fail2ban.sock
systemctl start fail2ban
systemctl status fail2ban

如果没遇到上面的报错,就不需要管了,如有,可看处理办法:

看这个报错:'python3\r': No such file or directory

里面的 \r 是 Windows 系统的回车符。这说明 fail2ban-client 这个脚本文件之前可能被 Windows 编辑过,或者解压时带了 Windows 的换行符(CRLF),导致 Linux 无法识别。

我们需要把 /usr/local/bin/ 下的几个脚本文件里的 \r 符号去掉。

bash 复制代码
# 清理 fail2ban-client 脚本
sed -i 's/\r//' /usr/local/bin/fail2ban-client

# 顺便把 server 和 regex 也一起清理了,防止后面出同样的问题
sed -i 's/\r//' /usr/local/bin/fail2ban-server
sed -i 's/\r//' /usr/local/bin/fail2ban-regex

输出结果显示:

  • Number of jail: 1 --- 已启用 1 个防护规则
  • Jail list: sshd --- SSH 防暴力破解已生效

你的服务器现在已经穿上了"防弹衣"。10分钟内 SSH 登录失败超过 5 次的 IP 将被自动封禁 24 小时。

4、测试验证可用性。

常用的管理命令

bash 复制代码
# 查看 SSH 防护详情(包括被封禁的 IP 列表)
fail2ban-client status sshd

# 手动封禁某个 IP
fail2ban-client set sshd banip 1.2.3.4

# 手动解封某个 IP
fail2ban-client set sshd unbanip 1.2.3.4

# 重启服务(修改配置后需要执行)
systemctl restart fail2ban
相关推荐
AOwhisky12 分钟前
Linux(CentOS)系统管理入门笔记(第十五期)——文件系统与存储管理(上篇):设备识别、挂载与文件查找
linux·运维·笔记·centos·文件系统
寒水馨17 分钟前
Linux下载、安装 Bun v1.3.14(附安装包bun-linux-x64.zip)
linux·javascript·typescript·node.js·bun·运行时·包管理器
维核科技1 小时前
算力机房高负荷期稳供指南:GPU前置维保与应急处置方案
运维·服务器维修·gpu维修·算力卡维修
worilb1 小时前
Spring Cloud 学习与实践(16):Elasticsearch 商品搜索、中文分词与索引一致性
运维·jenkins
Dear~yxy1 小时前
LVS企业级实战
linux·服务器·lvs
摇曳的精灵2 小时前
dify的docker部署
运维·docker·容器·dify
兮动人2 小时前
Linux 安装 Claude Code 实战:Node.js、npm、GLM 配置一次跑通
linux·npm·node.js·cc·claude code
weixin_462901972 小时前
TCP+WebSocket双向转发服务器 完整部署运维手册
运维·websocket·tcp/ip
AAA@峥2 小时前
Ceph RBD 块存储全解析:原理与实操汇总
运维·分布式·ceph
Sirius Wu2 小时前
OpenClaw Model Provider(模型提供商)完整详解
服务器·网络·人工智能·安全·aigc