使用fail2ban 防止服务器被恶意访问

fail2ban 是 Linux 下的一个防止服务器被恶意访问的程序,fail2ban 通过扫描指定的日志文件,统计访问频率,对达到指定访问频率的 ip 添加到系统防火墙(iptables/firewalld)封禁。

fail2ban 预置了很多常见服务的日志文件匹配模板,譬如 ssh,apahce服务器,nginx服务器的登陆错误模板,如果不满足我们的需求,可以自己编写规则,定义日志格式,访问频率、限制的端口等。

1.安装

Debian/Ubuntu

sudo apt-get install fail2ban

Centos

sudo yum install fail2ban

2.编写配置文件

fail2ban 的配置主要由两份文件构成:

(1)jail文件。声明了所有jail(监狱)并指定了囚禁(封禁)行为,譬如把ip进监狱的标准、封禁时长、封禁端口。

(2)filter文件。指定了日志文件的匹配非法行为的正则表达式

jail文件

jail 配置文件路径 /etc/fail2ban/jail.local,所有封禁行为都写在同一个配置文件中,安装完并不存在,需要拷贝自带的默认配置文件,并准备进行修改。

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

filter文件

过滤器文件在 /etc/fail2ban/filter.d/ 目录下,每个封禁对应一个配置文件。该目录下已经编写好了很多预定义的规则,我们可以在jail.local中直接引用即可,我们也可以在该目录下创建新的过滤器文件,譬如一般对于单个特定http服务器接口做 ddos 防范就需要我们自己编写过滤器。

jail 文件的编写

假设我们要做这样一个任务:

限制部署在 nginx 上的某 HTTP 请求的调用次数,单个 ip 每 60 秒请求不得超过 10 次。
nginx 的日志路径在:/usr/local/nginx/logs/access.log。
该 HTTP 一次请求产生的一条日志如下:

{ "@timestamp": "2017-12-18T11:06:27+08:00", "remote_addr": "122.96.42.74", "referer": "-", "request": "POST /api/law_inference/robot_multi_new HTTP/1.1", "status": 200, "bytes":642, "agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", "x_forwarded": "-", "upstr_addr": "192.168.0.82:8033","upstr_host": "-","ups_resp_time": "0.143" }

根据如上需求,我们在 jail.local 文件中添加如下一个小节:

/etc/fail2ban/jail.local

[origin-qa-second]

enabled=true #必须要写,表示开启
port = 8500 #触发封禁后,对特定ip封禁的端口
bantime=86400 #封禁持续时间,以秒计算
findtime=60 #封禁计时器(在该时间周期内统计次数),以秒计算
maxretry=10 #封禁触发次数
logpath = /var/log/nginx/access.log #日志路径
filter = origin-qa-second #过滤器名,必须要和顶上中括号里的名字一样
ignoreip=58.213.45.42 117.62.160.252 192.168.0.0/24 #白名单

banaction = iptables-multiport #如果在centos上启用了iptables,需要指定这一项

过滤器的编写

jail.local 中提到过滤器 origin-qa-second,因此还需要编写 origin-qa-second.conf

文件示例 /etc/fail2ban/filter.d/origin-qa-second.conf

[Definition]

failregex = ^.*"remote_addr": <HOST>.POST /api/law_inference/robot_multi_new

ignoreregex =

其中failregex指定了我们想匹配的日志,每匹配上一条,会触发计数器加一,其中正则中的 <HOST> 是匹配主机 ip 的语法,只有匹配到主机 ip,才能对该 ip 封禁,因此一定要写。

过滤器正则的测试

fail2ban 提供了测试正则的命令:

fail2ban-regex 日志 正则

例如

fail2ban-regex '{ "@timestamp": "2017-12-18T11:06:27+08:00", "remote_addr": "122.96.42.74", "referer": "-", "request": "POST /api/law_inference/robot_multi_new HTTP/1.1", "status": 200, "bytes":642, "agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", "x_forwarded": "-", "upstr_addr": "192.168.0.82:8033","upstr_host": "-","ups_resp_time": "0.143" }' '^."remote_addr": <HOST>.POST /api/law_inference/robot_multi_new.*'

会输出是否匹配到了规则。

3.fail2ban的维护

一些常见命令:

  • 查看状态:fail2ban-client status
  • 查看特定过滤器的状态:fail2ban-client status 过滤器名称
  • 解封ip:fail2ban-client set 过滤器名 unbanip ip地址

共有 2 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注