Linux云服务器tengine环境fail2ban屏蔽攻击ip

  • A+
所属分类:Linux
高性能企业级服务器首台5折

基于 Tengine 环境的 Web 环境遭遇了CC攻击可以通过类似 ngx_lua_waf 的方式拦截攻击,生成一些类似 403 或者 30 2的状态码。这些防御避免了业务被持续攻击,但是还是会消耗服务器资源一旦达到一定数量级,也会严重影响到系统的性能,所以通过分析 nginx的访问日志彻底屏蔽这些 IP。 本文给出一个Tengine 环境结合 fail2ban 实现自动封禁 HTTP 状态码为 403 的访问者 IP 地址的示例。

Tengine 的环境配置和 ngx_lua_waf 的设置本文不再赘述,重点描述 fail2ban 的安装和配置。

安装 fail2ban


1
2
yum <span class="hljs-keyword">install</span> -y epel-<span class="hljs-keyword">release</span>
yum <span class="hljs-keyword">install</span> -y fail2ban

设置 Nginx 的访问日志格式

这个是设置 fail2ban 封禁的关键因素


1
2
<span class="hljs-attribute">log_format</span>  main  <span class="hljs-string">'<span class="hljs-variable">$remote_addr</span> <span class="hljs-variable">$status</span> <span class="hljs-variable">$request</span> <span class="hljs-variable">$body_bytes_sent</span> [<span class="hljs-variable">$time_local</span>]  <span class="hljs-variable">$http_user_agent</span> <span class="hljs-variable">$http_referer</span>  <span class="hljs-variable">$http_x_forwarded_for</span> <span class="hljs-variable">$upstream_addr</span> <span class="hljs-variable">$upstream_status</span> <span class="hljs-variable">$upstream_cache_status</span> <span class="hljs-variable">$upstream_response_time</span>'</span>;
<span class="hljs-attribute">access_log</span>  logs/access.log  main;

4.png

攻击日志的信息:


1
<span class="hljs-number">42.120</span>.<span class="hljs-number">74</span>.xxx <span class="hljs-number">403</span> GET <span class="hljs-regexp">/ethnicity.php?id=../</span>opt<span class="hljs-regexp">/nginx/</span>conf<span class="hljs-regexp">/nginx.conf HTTP/</span><span class="hljs-number">1.1</span> <span class="hljs-number">2090</span> [<span class="hljs-number">03</span><span class="hljs-regexp">/Dec/</span><span class="hljs-number">2015</span>:<span class="hljs-number">04</span>:<span class="hljs-number">19</span>:<span class="hljs-number">57</span> +<span class="hljs-number">0800</span>]  curl<span class="hljs-regexp">/7.29.0 -  - - - - -</span>

5.png

配置 fail2ban

CC 攻击的 IP 会经过 Nginx和 lua 处理后,访问状态变为 403,根据 Nginx的访问日志格式,设置 fail2ban 过滤这些 IP 和 403 状态,加入黑名单攻击的 IP 就被临时封禁了

1) 新建 fail2ban 的规则文件 /etc/fail2ban/filter.d/nginx-403-CC.conf,这个和 nginx 的日志 log_format 设置位置是吻合的,这个很关键:


1
2
3
4
<span class="hljs-comment"># cat /etc/fail2ban/filter.d/nginx-403-cc.conf</span>
<span class="hljs-section">[Definition]</span>
<span class="hljs-attr">failregex</span> =<span class="hljs-number">403</span>.(GET|POST)*.*HTTP/<span class="hljs-number">1</span>.*$
<span class="hljs-attr">ignoreregex</span> =

3.png

2)  新建 fail2ban 的配置文件 /etc/fail2ban/jail.d/nginx-anti-403.conf。这里配置的是封禁的规则相关的,日志的路劲是自定义的,需要和当前的路劲是一致的:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<span class="hljs-comment"># cat /etc/fail2ban/jail.d/nginx-anti-403.conf</span>
[nginx-anti-403]
enabled = <span class="hljs-literal">true</span><span class="hljs-built_in">
port </span>= http<span class="hljs-built_in">
filter </span>= nginx-403-cc
logpath = /opt/nginx/logs/access.log
findtime = 6
bantime = 900
maxretry = 9

时间和频率参数注释:
findtime(检测多少秒内的日志)
bantime (屏蔽攻击ip的时间为多少秒)
maxretry (达到多少次就启动屏蔽)

2.png

3) 修改 fail2ban 的防火墙相关的配置

当前版本 fail2ban 在执行 iptables 命令时,会加上了 -w 参数防止规则冲突,iptables-1.4.20 以后才有这个参数,而 CentOS 6 的 iptables 是1.4.7,导致 iptables 规则添加失败,解决方法是删除 iptables -common.conf 中的 执行如下命令即可无任何的返回就是成功的:


1
<span class="hljs-selector-id">#sed</span> -<span class="hljs-selector-tag">i</span> <span class="hljs-string">'s/iptables = iptables/iptables = iptables/'</span> /etc/fail2ban/action.d/iptables-common<span class="hljs-selector-class">.conf</span>

4) 启动 fail2ban


1
2
<span class="hljs-comment"># /etc/init.d/fail2ban start</span>
<span class="hljs-attribute">Starting</span> fail2ban:                                        <span class="hljs-meta"> [  OK  ]</span>

1.png

攻防效果的演示

fail2ban 策略生效之前:

6.png

生效之后:

7.png

再看下防护墙规则(这个规则是 fail2ban 自动添加的):

8.png

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: