构建自己防火墙的原因 : 需要对特定链接进行防cc攻击 但对某些链接不需要进行防cc攻击
技术选型: 基于 nginx + lua 的 verynginx
1、首先verynginx 需要nginx 编译安装模块 或者使用openresty
lua-nginx-module
http_stub_status_module
http_ssl_module
2、verynginx 自带的openresty(nginx)安装脚本 可以一键安装 因为我使用的是宝塔面板 不能使用他的一键安装脚本 或者你可以自己安装openresty 安装连接http://openresty.org/cn/installation.html
3、下面开始安装 verynginx
[root@localhost]git clone https://github.com/alexazhou/VeryNginx.git #克隆verynginx仓库
[root@localhost]mkdir -p /opt/verynginx #创建 vernginx 安装目录
[root@localhost]cd verynginx #进入verngin目录
[root@localhost]cp -r -f ./verynginx /opt/verynginx 复制文件
4、将下面三条代码放入 nginx http 配置块外部,http 配置块内部,server 配置块内部,
include /opt/verynginx/verynginx/nginx_conf/in_external.conf;
include /opt/verynginx/verynginx/nginx_conf/in_http_block.conf;
include /opt/verynginx/verynginx/nginx_conf/in_server_block.conf;
5、注意如果开起了nginx vhost模式 有个server 模块就要放几个server 这时候重载 openresty (nginx)配置或者重启就可以 访问响应域名后面加上 vn/index
6、遇到的坑 首先系统后台是使用thinkphp 开发这是时候 我发现 明明开启了防止下载 sql文件 但是我访问 http://demo.com/1.sql 是无法触发拦截规则的 伪静态如下:
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}
#问题出此案在 if这个判断 !-e $request_filename 这句代表如果不存在文件的话会直接 执行 rewrite规则 也就是说我访问的是 http://demo.php/1.sql 因为目录下没有 1.sql 其实域名实际访问的是 http://demo.php/index.php?s=1.sql 所以没有触发下载限制 但当 目录下存在 1.sql 就会出现警告 没有的话 报的404 是thinphp返回的 所以虽然没有触发 但对于安全还是有用的
7、请求访问顺序
Nginx Rewrite -> VeryNginx Rewrite -> Nginx aceess -> VeryNginx Access
8、有兴趣的小伙伴可以给我留言一起探讨 nginx waf防火墙 lua是天生适合做nginx waf语言