267 lines
7.9 KiB
Markdown
267 lines
7.9 KiB
Markdown
---
|
||
title: "Linux利用fail2ban+iptables加固系统,防止SSH暴力破解 - Terry的技术笔记"
|
||
source: "https://blog.terrynow.com/2022/02/06/linux-centos-fail2ban-iptables-prevent-ssh-from-brute-force-attack/"
|
||
author:
|
||
published:
|
||
created: 2026-04-15
|
||
description: "前面的文章有介绍防火墙是firewalld的情况下,使用fail2ban来防止SSH暴力破解的情况,详见:https://blog.terrynow.com/2021/09/17/linux-centos-fail2ban-firwalld-prevent-ssh-from-brute-force-attack/ 如果系统使用的是iptables防火墙,配置的方法有所不同。 关于如何安装和开启iptables防火墙,详见:https://blog.terrynow.com/2021/02/16/centos7-ub […]"
|
||
tags:
|
||
- "clippings"
|
||
---
|
||
前面的文章有介绍防火墙是firewalld的情况下,使用fail2ban来防止SSH暴力破解的情况,详见: [https://blog.terrynow.com/2021/09/17/linux-centos-fail2ban-firwalld-prevent-ssh-from-brute-force-attack/](https://blog.terrynow.com/2021/09/17/linux-centos-fail2ban-firwalld-prevent-ssh-from-brute-force-attack/)
|
||
|
||
如果系统使用的是iptables防火墙,配置的方法有所不同。
|
||
|
||
关于如何安装和开启iptables防火墙,详见: [https://blog.terrynow.com/2021/02/16/centos7-ubuntu-iptables-firewall/](https://blog.terrynow.com/2021/02/16/centos7-ubuntu-iptables-firewall/)
|
||
|
||
## 首先准备fail2ban
|
||
|
||
#开启iptables防火墙
|
||
|
||
systemctl start iptables
|
||
|
||
#设置防火墙开机启动
|
||
|
||
systemctl enable iptables
|
||
|
||
#安装epel-release
|
||
|
||
yum install epel-release
|
||
|
||
#安装fail2ban
|
||
|
||
yum install fail2ban
|
||
|
||
#开启iptables防火墙 systemctl start iptables #设置防火墙开机启动 systemctl enable iptables #安装epel-release yum install epel-release #安装fail2ban yum install fail2ban
|
||
|
||
```csharp
|
||
#开启iptables防火墙
|
||
systemctl start iptables
|
||
|
||
#设置防火墙开机启动
|
||
systemctl enable iptables
|
||
|
||
#安装epel-release
|
||
yum install epel-release
|
||
#安装fail2ban
|
||
yum install fail2ban
|
||
```
|
||
|
||
## 配置fail2ban的规则
|
||
|
||
安装好后fail2ban配置文件在/etc/fail2ban,其中jail.conf为主配置文件,相关的匹配规则位于filter.d目录,这里不做介绍,也没有用到。
|
||
|
||
新建文件 `/etc/fail2ban/jail.local` ,内容如下
|
||
|
||
\# vim /etc/fail2ban/jail.local
|
||
|
||
\[DEFAULT\]
|
||
|
||
\# 以空格分隔的列表,可以是 IP 地址、CIDR 前缀或者 DNS 主机名
|
||
|
||
\# 用于指定哪些地址可以忽略 fail2ban 防御
|
||
|
||
ignoreip \= 127.0.0.1 172.16.0.0 /12 10.0.0.0 /8 192.168.0.0 /24
|
||
|
||
\# 客户端主机被禁止的时长(秒)
|
||
|
||
bantime \= 86400
|
||
|
||
\# 客户端主机被禁止前允许失败的次数
|
||
|
||
maxretry \= 5
|
||
|
||
\# 查找失败次数的时长(秒)
|
||
|
||
findtime \= 600
|
||
|
||
\[sshd\]
|
||
|
||
enabled \= true
|
||
|
||
filter \= sshd
|
||
|
||
action \= iptables \[name=SSH, port=ssh, protocol=tcp\]
|
||
|
||
\# SSH的日志文件路径
|
||
|
||
logpath \= /var/log/secure
|
||
|
||
\# ssh 服务的最大尝试次数
|
||
|
||
maxretry \= 3
|
||
|
||
\# vim /etc/fail2ban/jail.local \[DEFAULT\] # 以空格分隔的列表,可以是 IP 地址、CIDR 前缀或者 DNS 主机名 # 用于指定哪些地址可以忽略 fail2ban 防御 ignoreip = 127.0.0.1 172.16.0.0/12 10.0.0.0/8 192.168.0.0/24 # 客户端主机被禁止的时长(秒) bantime = 86400 # 客户端主机被禁止前允许失败的次数 maxretry = 5 # 查找失败次数的时长(秒) findtime = 600 \[sshd\] enabled = true filter = sshd action = iptables\[name=SSH, port=ssh, protocol=tcp\] # SSH的日志文件路径 logpath = /var/log/secure # ssh 服务的最大尝试次数 maxretry = 3
|
||
|
||
```csharp
|
||
# vim /etc/fail2ban/jail.local
|
||
|
||
[DEFAULT]
|
||
# 以空格分隔的列表,可以是 IP 地址、CIDR 前缀或者 DNS 主机名
|
||
# 用于指定哪些地址可以忽略 fail2ban 防御
|
||
ignoreip = 127.0.0.1 172.16.0.0/12 10.0.0.0/8 192.168.0.0/24
|
||
|
||
# 客户端主机被禁止的时长(秒)
|
||
bantime = 86400
|
||
|
||
# 客户端主机被禁止前允许失败的次数
|
||
maxretry = 5
|
||
|
||
# 查找失败次数的时长(秒)
|
||
findtime = 600
|
||
|
||
[sshd]
|
||
enabled = true
|
||
filter = sshd
|
||
action = iptables[name=SSH, port=ssh, protocol=tcp]
|
||
# SSH的日志文件路径
|
||
logpath = /var/log/secure
|
||
# ssh 服务的最大尝试次数
|
||
maxretry = 3
|
||
```
|
||
|
||
上述配置意思是,fail2ban会自动禁止在最近10分钟内有超过3次访问尝试失败的任意IP地址。一旦被禁,这个IP地址将会在24小时内一直被禁止访问 SSH 服务。
|
||
|
||
配置好了以后,重启下fail2ban
|
||
|
||
\# 重启fail2ban
|
||
|
||
systemctl restart fail2ban
|
||
|
||
\# 开机启动
|
||
|
||
systemctl enable fail2ban
|
||
|
||
\# 重启fail2ban systemctl restart fail2ban # 开机启动 systemctl enable fail2ban
|
||
|
||
```csharp
|
||
# 重启fail2ban
|
||
systemctl restart fail2ban
|
||
|
||
# 开机启动
|
||
systemctl enable fail2ban
|
||
```
|
||
|
||
## 检查fail2ban状态并解禁被锁住的IP地址
|
||
|
||
可以随便找一台不在白名单中的IP地址的机器用错误的密码ssh多次测试
|
||
|
||
\# 查看iptables状态
|
||
|
||
iptables --list -n
|
||
|
||
Chain INPUT (policy ACCEPT)
|
||
|
||
target prot opt source destination
|
||
|
||
fail2ban-SSH tcp -- 0.0.0.0 / 0 0.0.0.0 / 0 tcp dpt:22
|
||
|
||
Chain FORWARD (policy ACCEPT)
|
||
|
||
target prot opt source destination
|
||
|
||
Chain OUTPUT (policy ACCEPT)
|
||
|
||
target prot opt source destination
|
||
|
||
Chain fail2ban-SSH (1 references)
|
||
|
||
target prot opt source destination
|
||
|
||
DROP all -- 192.168.1.8 0.0.0.0 / 0
|
||
|
||
RETURN all -- 0.0.0.0 / 0 0.0.0.0 / 0
|
||
|
||
检验fail2ban状态(会显示出当前活动的被ban列表):
|
||
|
||
<span class= "pln" \>fail2ban</span><span class= "pun" \>-</span><span class= "pln" \>client status</span>
|
||
|
||
\# 查看iptables状态 iptables --list -n Chain INPUT (policy ACCEPT) target prot opt source destination fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain fail2ban-SSH (1 references) target prot opt source destination DROP all -- 192.168.1.8 0.0.0.0/0 RETURN all -- 0.0.0.0/0 0.0.0.0/0 检验fail2ban状态(会显示出当前活动的被ban列表): <span class="pln">fail2ban</span><span class="pun">-</span><span class="pln">client status</span>
|
||
|
||
```csharp
|
||
# 查看iptables状态
|
||
iptables --list -n
|
||
|
||
Chain INPUT (policy ACCEPT)
|
||
target prot opt source destination
|
||
fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
|
||
|
||
Chain FORWARD (policy ACCEPT)
|
||
target prot opt source destination
|
||
|
||
Chain OUTPUT (policy ACCEPT)
|
||
target prot opt source destination
|
||
|
||
Chain fail2ban-SSH (1 references)
|
||
target prot opt source destination
|
||
DROP all -- 192.168.1.8 0.0.0.0/0
|
||
RETURN all -- 0.0.0.0/0 0.0.0.0/0
|
||
|
||
检验fail2ban状态(会显示出当前活动的被ban列表):
|
||
fail2ban-client status
|
||
```
|
||
|
||
查看fail2ban的SSH状态:
|
||
|
||
\[root@localhost ~\]# fail2ban-client status sshd
|
||
|
||
Status for the jail: sshd
|
||
|
||
|- Filter
|
||
|
||
| |- Currently failed: 0
|
||
|
||
| |- Total failed: 59
|
||
|
||
| \`- Journal matches: \_SYSTEMD\_UNIT=sshd.service \+ \_COMM=sshd
|
||
|
||
\`- Actions
|
||
|
||
|- Currently banned: 1
|
||
|
||
|- Total banned: 5
|
||
|
||
\`- Banned IP list: 192.168.1.8
|
||
|
||
\[root@localhost ~\]# fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 0 | |- Total failed: 59 | \`- Journal matches: \_SYSTEMD\_UNIT=sshd.service + \_COMM=sshd \`- Actions |- Currently banned: 1 |- Total banned: 5 \`- Banned IP list: 192.168.1.8
|
||
|
||
```csharp
|
||
[root@localhost ~]# fail2ban-client status sshd
|
||
Status for the jail: sshd
|
||
|- Filter
|
||
| |- Currently failed: 0
|
||
| |- Total failed: 59
|
||
| \`- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
|
||
\`- Actions
|
||
|- Currently banned: 1
|
||
|- Total banned: 5
|
||
\`- Banned IP list: 192.168.1.8
|
||
```
|
||
|
||
取消被ban的IP:
|
||
|
||
\# 取消被ban的IP
|
||
|
||
\[root@localhost ~\]# fail2ban-client set sshd unbanip 192.168.1.8
|
||
|
||
1
|
||
|
||
\# 取消被ban的IP \[root@localhost ~\]# fail2ban-client set sshd unbanip 192.168.1.8 1
|
||
|
||
```csharp
|
||
# 取消被ban的IP
|
||
[root@localhost ~]# fail2ban-client set sshd unbanip 192.168.1.8
|
||
1
|
||
```
|
||
|
||
fail2ban的日志路径是:/var/log/fail2ban.log
|
||
|
||
查看加入黑名单日志:
|
||
|
||
sudo zgrep 'Ban' /var/log/fail2ban.log\*
|
||
|
||
sudo zgrep 'Ban' /var/log/fail2ban.log\*
|
||
|
||
```csharp
|
||
sudo zgrep 'Ban' /var/log/fail2ban.log*
|
||
``` |