Nginx - WAF.png

I. 博客优化简史

毒奶博客优化简史

优化网页加载速度的方法有很多种:

1.后端读取优化 - 使用数据库缓存(网页结构相对静态化)减少数据库读取,缩短TTFB时长;
2.本地缓存优化 - 延长静态资源过期时间,减少每次加载页面浏览器对服务器请求数(Request);
3.缩短物理距离 - 使用CDN,加速静态资源的全球访问;(CDN是什么?)
4.资源提前加载 - 使用 instantpage.js 在你点击网页前即开始加载网页(加载并放入浏览器缓存?),在你点击时加载已完成;
5.增强博客的防御能力 - 配置 ngx_lua_waf 抗CC攻击,即本文;恶意请求被拦截,服务器压力减少,正常访问网站自然快了;但返回 403/503 永远是不够的,你可能还会需要使用一些 CDN 的API,如 Cloudflare,配合API将恶意请求远远拦在CDN的WAF前面;

本文将就第 5 点做说明;

II. 主理人说

ngx_lua_waf 来自 loveshell,一个基于lua-nginx-module(Openresty)的web应用防火墙;已在Github 赢得 3.3Kstar;最后一次提交已是 2016年,但丝毫不影响其优秀的性能,应对普通CC攻击还是足够用的;

其中涉及到的难点主要在于 为你的 nginx 安装 lua-nginx-module 模块,或直接安装 Openresty;其他,只需对 nginx.conf 或 vhost 文件夹下 域名配置文件稍加修改即可完成 ngx_lua_waf 的配置;

以上。

III. 如何安装 Openresty

由于本 waf 基于 lua-nginx-module(Openresty),博主强烈建议大家安装 Openresty,是一个基于Nginx 与Lua 的高性能Web 平台,其内部集成了大量精良的Lua 库、第三方模块以及大多数的依赖项

当然也可以为你现有的 nginx 动态加载 lua-nginx-module,可参考本文

IV. ngx_lua_waf 资源

开源仓库:https://github.com/loveshell/ngx_lua_waf
使用说明:https://github.com/loveshell/ngx_lua_waf/blob/master/README.md

V. ngx_lua_waf 下载

下载与解压(具体存放位置根据自己需求而定,博客建议存放在nginx的 vhost 目录下;以下仅供示范参考);

## ngx_lua_waf 下载及目录结构
$ cd /usr/local/nginx/conf/vhost/ # 进入 vhost目录
$ wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip #下载
$ unzip master.zip #解压
$ mv ngx_lua_waf-master waf #移动并重命文件夹名字为 waf

假设当前waf存放目录为 /usr/local/nginx/conf/vhost/

[email protected]:/usr/local/nginx/conf/vhost/waf# tree -a
.
├── .gitattributes
├── .gitignore
├── README.md
├── config.lua
├── init.lua
├── install.sh
├── waf.lua
└── wafconf
    ├── args
    ├── cookie
    ├── post
    ├── url
    ├── user-agent
    └── whiteurl

1 directory, 13 files

VI. ngx_lua_waf 的配置文件说明

config.lua 是该waf的主配置文件,用以设置参数及对应行为on即代表开启功能,off代表关闭功能;

RulePath = "/usr/local/nginx/conf/vhost/waf/wafconf/" #路径对应的是 wafconf 的位置;
attacklog = "off"
logdir = "/home/wwwlogs/limbopro.xyz/waf/" # 设置日志存放路径 博主设置在 nginx 下 waf
UrlDeny="off"
Redirect="off"
CookieMatch="on"
postMatch="off" 
whiteModule="off" 
black_fileExt={"php","jsp"}
ipWhitelist={"127.0.0.1","62.11.132.44","12.65.27.75"}
ipBlocklist={"1.0.0.1"}
CCDeny="on"
CCrate="100/60"
html=

其中 CCrate="100/60" 中的 100/60 代表一分钟(60秒)内同一页面刷新100次则封禁直到这一分钟结束,假设你在20秒刷了100次,则剩下的40秒将会被封禁;

VII. 配置 nginx.conf

假设 nginx 的vhost文件夹路径假设为:/usr/local/nginx/conf/vhost/,在 limbopro.xyz.conf 的 http 段添加(即最顶部):

##WAF 配置资源引用开始
lua_package_path "/usr/local/nginx/conf/vhost/waf/?.lua;;";
lua_shared_dict limit 20m;
init_by_lua_file  /usr/local/nginx/conf/vhost/waf/init.lua; 
access_by_lua_file /usr/local/nginx/conf/vhost/waf/waf.lua; 
##WAF 配置资源引用结束

server
        {
        listen 443 ssl http2;
        listen [::]:80;
        server_name limbopro.xyz;
...

重启 nginx,大功告成;

vhost 文件夹的一些说明:Virtual Host,虚拟主机(Virtual Host)可以在一台服务器上绑定多个域名,架设多个不同的网站,一般在开发机或者要部署多个小网站的服务器上需要配置虚拟主机。nginx的虚拟主机配置其实也挺简单,为了使得配置文件清晰,可以改每一个虚拟主机建立一个配置文件,然后在主配置文件(nginx.conf)里使用include语句包含所有的虚拟主机配置文件。

VIII. 测试有效性

503页面 - F5恶意刷新

你可以将 CCrate="100/60" 设置为 CCrate="3/6" 同一页面在6秒内超过3次则封禁,并返回错误状态 503/403;
重启 nginx;疯狂刷新下网页试试;或刷新下本页面试试;

IX. Tips

如有时间可以抽空设置一下 你的 503/404/403 页面;

最后修改:2021 年 03 月 19 日 01 : 19 AM