fail2ban是什么
Fail2Ban是一个入侵检测系统框架,它可以保护电脑服务器免受蛮力攻击。以Python程序设计语言编写,并能够在类Unix系统上运行,这些系统具有本地安装的数据包控制系统或防火墙的接口,例如Iptables或TCP Wrapper。 --wiki
为什么需要fail2ban
为了更好的保护网站,服务(ssh等)的密码不被暴力破解
使用环境
系统:fnos
docker:nginx
Linux ***2 6.6.38-trim #80 SMP PREEMPT_DYNAMIC Tue Dec 10 20:45:43 CST 2024 x86_64 GNU/Linux
如何操作
以下操作都要使用root账户
安装以及配置fail2ban
软件安装
# 使用root
sudo su root
# 更新软件源
apt-get update
# 更新所有软件到最新
apt-get upgrade
# 安装jail2ban
apt-get install jail2ban
对于debian系统,由于日志系统写到systemd,所以需要对配置文件进行修改才能成功启动fail2ban。否则,会出现如下错误。
fail2ban.configreader [2192]: WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
fail2ban [2192]: ERROR Failed during configuration: Have not found any log file for sshd jail
fail2ban [2192]: ERROR Async configuration of server failed
修改sshd配置
# 进入软件配置主目录
cd /etc/fail2ban
# 修改默认的配置文件
vim ./jail.d/defaults-debian.con
在中间加一条 backend=systemd
最后文件内容如下
[sshd]
backend=systemd
enabled = true
[可选]去掉烦人的warning
启动fail2ban的使用,可能会遇到如下warning
WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
需要在主路径建立 fail2ban.local
文件,并写入
[DEFAULT]
allowipv6 = auto
重启软件即可去掉warning。
启动软件
启动
systemctl start fail2ban
开机自启
systemctl enable fail2ban
查看状态
systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; preset: enabled)
Active: active (running) since Wed 2025-01-01 19:02:16 CST; 25min ago
Docs: man:fail2ban(1)
Main PID: 1999795 (fail2ban-server)
Tasks: 5 (limit: 7031)
Memory: 29.1M
CPU: 1.237s
CGroup: /system.slice/fail2ban.service
**─1999795 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
查看封锁列表
fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd
查看SSH封锁情况
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: 0
`- Banned IP list:
配置nginx的网页密码验证,失败自动封锁ip
apt-get install apache2-utils
htpasswd -B -c /home/yuzu/disk/docker/nginx/password username
其中 /home/yuzu/disk/docker/nginx/
为你nginx配置的路径。
server {
listen 80;
server_name localhost;
# ...
auth_basic "请输入用户和密码"; # 验证时的提示信息
auth_basic_user_file /home/yuzu/disk/docker/nginx/password; # 认证文件
location / {
root /var/www;
index index.html index.htm;
}
# ...
}
重载 Nginx 配置文件后生效
# 进入docker
docker exec -it nginx bash
# 测试配置文件
nginx -t
# 重载配置文件
nginx -s reload
# 退出docker
exit
配置用于nginx验证的fail2ban
到fail2ban的配置主路径
cd /etc/fail2ban
修改filter
使用正则表达式定义要封禁的主机(登录失败的主机),用 <HOST>
标识主机IP地址部分。
vim filter.d/nginx-auth.conf
# 写入下面内容
[Definition]
failregex = no user/password was provided for basic authentication.*client: <HOST>
user .* was not found in.*client: <HOST>
user .* password mismatch.*client: <HOST>
ignoreregex =
修改jail
vim jail.d/nginx.local
# 写入下面内容
[nginx-auth]
enabled = true
filter = nginx-auth # 填写filter的文件名
# 如果你的nginx在系统中运行,可以把chain改为INPUT或者不填写
action = iptables-allports[name=NoAuthFailures,chain="FORWARD"] # 由于我的nginx在dokcer里,给FORWARD链加reject规则
bantime = 3600 # 1h # 测试封锁时间3600s
maxretry = 10 # 尝试10次封锁
logpath = /home/yuzu/disk/docker/nginx/logs/error.log # 填写nginx的error路径
测试
重启fail2ban
systemctl restart fail2ban
11次后,应该封锁ip,也就是访问不了网页了,可以使用以下命令之一查看封锁了ip 1.2.3.4
# 使用grep抓取指定位置
iptables -L -n --line-numbers -t filter|grep -i "chain f2b" -A5
——————
Chain f2b-NoAuthFailures (1 references)
num target prot opt source destination
1 REJECT 0 -- 1.2.3.4 0.0.0.0/0 reject-with icmp-port-unreachable
2 RETURN 0 -- 0.0.0.0/0 0.0.0.0/0
fail2ban-client status nginx-auth
——————
Status for the jail: nginx-auth
|- Filter
| |- Currently failed: 0
| |- Total failed: 21
| `- File list: /home/yuzu/disk/docker/nginx/logs/error.log
`- Actions
|- Currently banned: 1
|- Total banned: 3
`- Banned IP list: 1.2.3.4
# 解除ip封锁1.2.3.4
fail2ban-client set nginx-auth unbanip 1.2.3.4
未解决的问题
由于我为了让NAS能更快的下载东西,把网关改到旁路由上了,所以nginx的error.log都是旁路由的ip。
在网上查询是由于SNAT转换导致的,目前还没有什么好的解决办法,只能把网关指向改回来了。
查询资料用到的资料
Nginx配置密码访问
nginx无法获取真实ip的原因
fail2ban如何配置iptables的forward链
关于nginx验证的fail2ban配置文件的写法