加固服务器防线:Fail2ban与Firewalld联手抗“爆”
在数字化浪潮席卷全球的今天,服务器作为网络世界的核心枢纽,承载着无数企业和个人的关键数据与重要业务。然而,伴随着网络技术的蓬勃发展,黑客攻击手段也日益猖獗,其中 SSH 爆破攻击就像隐藏在暗处的“幽灵”,时刻威胁着服务器的安全。一旦服务器被攻破,数据泄露、业务瘫痪等严重后果将接踵而至,给用户带来难以估量的损失。那么,如何才能为服务器打造一道坚不可摧的安全防线,有效抵御 SSH 爆破攻击呢?答案就是 Fail2ban 与 Firewalld 的强强联合。接下来,让我们一同深入探索这两款工具的神奇之处,学习如何利用它们守护服务器的安全。
一、Firewalld:服务器端口的忠诚卫士
Firewalld 是一款功能强大的防火墙管理工具,在 Linux 系统中,它如同一位忠诚的卫士,守护着服务器的各个端口,严格把控网络访问的权限。
在使用 Firewalld 之前,我们需要先了解几个关键操作。首先是查看其状态,使用命令“firewall-cmd --state” ,这个命令就像是给 Firewalld 打了个“招呼”,它会反馈当前是处于运行状态还是停止状态。
[root@localhost ~]# firewall-cmd --state
not running
如果 Firewalld 未启动,就可以使用“systemctl start firewalld”命令来启动它,如同唤醒这位沉睡的卫士,让它开始履行职责。为了确保系统重启后 Firewalld 依然能够自动运行,还需执行“systemctl enable firewalld.service”命令,将其设置为开机自启。
[root@localhost ~]# systemctl start firewalld
[root@localhost ~]# firewall-cmd --state
running
[root@localhost ~]# systemctl enable firewalld.service
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service
[root@localhost ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2025-02-21 18:43:53 CST; 3min 13s ago
Docs: man:firewalld(1)
Main PID: 1938 (firewalld)
Tasks: 2
Memory: 26.0M
CGroup: /system.slice/firewalld.service
└─1938 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
Feb 21 18:43:53 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
Feb 21 18:43:53 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
Feb 21 18:43:53 localhost.localdomain firewalld[1938]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration ...it now.
Hint: Some lines were ellipsized, use -l to show in full.
接下来就是放行服务器所需的端口,以 SSH 服务为例,假设 SSH 端口不是22而改为 60022 ,执行
[root@localhost ~]# firewall-cmd --zone=public --add-port=60022/tcp --permanent && firewall-cmd --reload
success
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens32
sources:
services: dhcpv6-client ssh
ports: 60022/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
这条命令的含义是在公共区域(zone=public)开放 60022 端口用于 TCP 协议的通信,“–permanent”参数确保设置在系统重启后依然生效,最后的“firewall-cmd --reload”则是让新的配置立即生效。
可以使用“firewall-cmd --zone=public --list-ports”命令查看当前已放行的端口,确保配置正确无误。
还可以使用“firewall-cmd --direct --get-all-rules”查看 Firewalld 的规则,进一步了解防火墙的设置情况。
操作要点提示:在开放和关闭端口时,务必明确每个端口的用途,避免开放不必要的端口,以免增加服务器的安全风险。错误地开放高危端口可能会让黑客有机可乘,导致服务器遭受攻击。
二、Fail2ban:智能识别并封禁恶意攻击源
Fail2ban 则像是一位智能的网络安全侦探,它通过监测系统日志,能够快速识别出异常的登录行为,并及时对恶意攻击源进行封禁,有效阻止 SSH 爆破攻击。
安装 Fail2ban 非常简单,在基于 yum 的系统中,只需执行以下命令,系统就会自动下载并安装 Fail2ban 及其与 Firewalld 的集成组件。
yum -y install epel-release
yum -y install fail2ban-firewalld
安装完成后,需要对 Fail2ban 进行配置。打开“/etc/fail2ban/jail.d/sshd.local”文件进行编辑,在文件中添加或修改以下内容:
tee > /etc/fail2ban/jail.local << EOF
[DEFAULT]
ignoreip = 127.0.0.0/8,192.168.10.0/24
bantime = 86400
findtime = 600
maxretry = 3
EOF
ignoreip:IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔
bantime:屏蔽时间,单位为秒(s)
findtime:时间范围
maxretry:最大次数
tee > /etc/fail2ban/jail.d/sshd.local << EOF
[sshd]
enabled = true
port = ssh
filter = sshd
maxretry = 3
bantime = 3600
findtime = 600
EOF
cat /etc/fail2ban/jail.d/sshd.local
“enabled = true”表示启用针对 SSH 服务的防护功能;
“port = ssh”指定要防护的 SSH 端口;
配置完成后,使用“systemctl start fail2ban.service”命令启动 Fail2ban 服务 ,同时也可以使用“systemctl enable fail2ban”命令设置开机自启,确保 Fail2ban 随时处于工作状态。
systemctl start fail2ban
systemctl enable fail2ban
在 Fail2ban 运行过程中,可以使用“fail2ban-client status sshd”命令查看被封禁的 IP 列表,“sshd”为服务名称,对应之前配置文件中的名称。
[root@localhost ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 9
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 192.168.10.1
You have new mail in /var/spool/mail/root
若发现误封的 IP ,比如“192.168.10.1” ,可使用“fail2ban-client set sshd unbanip 192.168.10.1”命令将其从封禁列表中删除。
[root@localhost ~]# fail2ban-client set sshd unbanip 192.168.10.1
1
You have new mail in /var/spool/mail/root
[root@localhost ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 0
|- Total banned: 1
`- Banned IP list:
[root@localhost ~]#
此外,通过查看“/var/log/fail2ban.log”日志文件,能够详细了解 Fail2ban 的工作情况,包括哪些 IP 被检测到异常行为、何时被封禁等信息,为后续的安全分析提供有力依据。
操作要点提示:在配置 Fail2ban 时,合理设置封禁时间、检测时间和最大重试次数至关重要。封禁时间过短可能无法有效阻止恶意攻击,过长则可能影响正常用户的访问;检测时间和最大重试次数设置不合理,可能会导致误封或无法及时封禁恶意 IP 。