一、安装二、测试三、基本配置四、相关命令
原创 戒一双 LINUX开源玩家
前面说的防火墙基本是静态的情况,在实际运行中我们可能需要动态
调整防火墙策略,此时可以考虑使用Fail2ban。
Fail2ban 可以通过创建规则,自动更改防火墙配置,在尝试登录失败达到一定次数后禁止特定 IP,从而大大减少暴力攻击。
这样既可以防止暴力破解和流量攻击,也可以避免误伤客户端IP地址。
一、安装
为了方便,这里使用一个基于PVE的Debian LXC容器为例,因为它自带了fail2ban。
启用和查看服务
$ sudo systemctl status fail2ban.service# systemctl status fail2ban.service* fail2ban.service - Fail2Ban ServiceLoaded: loaded (/lib/systemd/system/fail2ban.service; enabled; preset: enabled)Active: active (running) since Wed 2024-05-15 12:25:36 UTC; 1 week 4 days agoDocs: man:fail2ban(1)Main PID: 201 (fail2ban-server)Tasks: 7 (limit: 617427)Memory: 29.2MCPU: 19min 8.397sCGroup: /system.slice/fail2ban.service`-201 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
二、测试
fail2ban默认启用了sshd的安全支持,添加了一条链规则f2b-SSH,接管了默认的sshd服务22端口
# iptables -S | grep f2b-N f2b-SSH
-A INPUT -p tcp -m tcp --dport 22 -j f2b-SSH
-A f2b-SSH -j RETURN
因为这个服务器的sshd端口已经修改为22222,所以需要修改下配置文件,默认配置文件是/etc/fail2ban/jail.conf
。
不过这个容器使用的是/etc/fail2ban/jail.local
,把里面的sshd端口从22改为22222,重启fail2ban服务,看见端口已经修改了
# sudo systemctl restart fail2ban.service# iptables -S | grep f2b-N f2b-SSH
-A INPUT -p tcp -m tcp --dport 22222 -j f2b-SSH
-A f2b-SSH -j RETURN
客户端ssh登录,故意输入错误的用户名或者密码,总之让sshd认证错误就行。这台服务器配置了错误的安全加固规则,直接就错误了,正常情况下要多错几次(达到配置要求)才会引起fail2ban的反应的。
$ ssh -p22222 abc@192.168.10.80abc@192.168.10.80's password:
Permission denied, please try again.
abc@192.168.10.80's password:
Received disconnect from 192.168.10.80 port 22222:2: Too many authentication failures
Disconnected from 192.168.10.80 port 22222
然后客户端就被BAN了,暂时不能再登录该服务器,连接请求会被直接重置,包括已有的连接也会被断开。
$ ssh -p22222 abc@192.168.10.80kex_exchange_identification: read: Connection reset by peer
Connection reset by 192.168.10.80 port 22222
从终端登录服务器可以看到防火墙自动添加了配置
客户端的地址被fail2ban自动加入了拒绝规则:-j REJECT --reject-with icmp-port-unreachable
三、基本配置
jail2ban的配置文件在目录/etc/fail2ban下,最基础配置文件是jail.local,可以参考jail.conf编写。
其中有几个最简单的配置
在[DEFAULT]段落下
bantime 参数设置了客户端无法正确通过身份验证时被禁用的时间长度。默认单位是秒。
maxretry 变量设定了客户端在被禁用前,在 findtime 定义的时间窗口内尝试身份验证的次数。
下面的配置,fail2ban 服务将禁止在 10 分钟内尝试登录 3 次失败的客户端,在600秒内不能登录SSH服务。
# cat /etc/fail2ban/jail.local [DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime = 600
findtime = 10
maxretry = 3
backend = systemd[sshd]
enabled = true
port = ssh,22222
action = iptables[name=SSH, port=22222, protocol=tcp]
sshd只是基本的实例,利用fail2ban可以为很多网络服务配置动态防火墙。当然这需要对服务本身的状态、日志、以及正则表达式编写等有一定理解。
四、相关命令
测试规则
fail2ban-regex <logpath> <filterpath>
如
fail2ban-regex /var/log/nginx/svn.error.log.1 /etc/fail2ban/filter.d/nginx_401.conf
Running tests
=============Use failregex filter file : nginx_401, basedir: /etc/fail2ban
Use log file : /var/log/nginx/svn.error.log.1
Use encoding : utf-8Results
=======Failregex: 4027 total
|- #) [# of hits] regular expression
| 1) [4027] ^<HOST> .*"(OPTIONS|GET|POST|PUT).*" (401|403) .*$
`-Ignoreregex: 0 totalDate template hits:
|- [# of hits] date format
| [4130] Day(?P<_sep>[-/])MON(?P=_sep)ExYear[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-Lines: 4130 lines, 0 ignored, 4027 matched, 103 missed
[processed in 0.36 sec]
查看状态
fail2ban-client status
fail2ban-client status sshd
取消限制
fail2ban-client set nginx-http-auth unbanip 192.168.85.162