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
相关推荐
aixingkong9216 小时前
Nvidia为例 XPU的Multi-Host、Socket Direct 、GPUDirect、RDMA 技术点分析
服务器·网络·硬件架构·硬件工程
雯宝8 小时前
mnt_init 函数
linux
律宏阔14 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔14 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴14 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千15 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei3715 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei3715 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei3715 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh15 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker