前言
现在对于很多站长来说,或多或少的都会遇到CC
攻击,而防御最好的办法就是套CDN
,比如国外的CloudFlare
,而CF
很多时候速度并不是很快,在很多地方也被屏蔽了,所以体验不是很好。这时候我们可以用脚本来防一下,之前发过一个防CC
脚本,查看:Linux VPS防CC攻击一键脚本,带微信提醒,由于需要访问日志,所以效果并不是很好,稍微大点的CC
都会扛不住,所以该脚本在一些情况下不是很适合。
这里再讲个防CC
教程,使用Nginx
+Lua
设置WAF
防火墙来防CC
,还可以拦截Url
关键词等,其优点Nginx
占用小,高并发的优势,以及Lua
语言的轻快,并在用户访问前就可以处理掉攻击,效果还是很不错的。
由于配置前需要编译Lua
模块,而OneinStack
的LNMP
一键包中OpenResty
自带Lua
模块,所以博主建议使用该一键包安装网站环境。
LNMP安装
先去OneinStack
网站获取一键包,访问地址:https://oneinstack.com/auto/。Nginx
选择OpenResty
;如果内存小于1G
,Mysql
不能大于5.5
,然后其它自己看着办。
将获取到的一键包复制到SSH
客户端运行,直到安装完成。
LNMP操作命令:
#操作前请在oneinstack目录下操作
cd oneinstack
#添加网站
./vhost.sh
#删除网站
./vhost.sh del
#添加其它组件
./addons.sh
#网站备份
./backup_setup.sh
#更新版本
./upgrade.sh
更多命令及图文操作查看:https://oneinstack.com/install/。
相关目录:
#数据库文件夹,请将phpMyAdmin改成不容易猜到的名字比如xx,然后可通过IP:xx访问数据库
/data/wwwroot/default
#网站目录
/data/wwwroot
#网站配置文件
/usr/local/openresty/nginx/conf/vhost
添加网站后,使用FTP
工具将程序上传至根目录,建立数据库,打开网站配置就可以了。
配置WAF防火墙
这里使用Github
很火的一个基于ngx_lua
的WAF
防火墙脚本来防CC
攻击和拦截Url
关键词等。其功能如下:
- 防止
sql
注入,本地包含,部分溢出,fuzzing
测试,xss
,55RF
等web
攻击。 - 防止
svn
/备份之类文件泄漏。 - 防止
ApacheBench
之类压力测试工具的攻击。 - 屏蔽常见的扫描黑客工具,扫描器。
- 屏蔽异常的网络请求。
- 屏蔽图片附件类目录
php
执行权限。 - 防止
webshell
上传。
Github
地址:https://github.com/loveshell/ngx_lua_waf。
先把ngx_lua_waf
下载到conf
目录下:
cd /usr/local/openresty/nginx/conf
wget https://www.moerats.com/usr/down/waf.tar.gz
tar zxf waf.tar.gz
rm -rf waf.tar.gz
再编辑/usr/local/openresty/nginx/conf/nginx.conf
,将以下代码放入http{}
中。
lua_shared_dict limit 10m;
lua_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";
init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua";
access_by_lua_file "/usr/local/openresty/nginx/conf/waf/waf.lua";
然后运行service nginx restart
重启nginx
,使其生效。
配置文件:
#配置文件路径
/usr/local/openresty/nginx/conf/waf/config.lua
#详细参数,具体自己看着设置
RulePath = "/usr/local/openresty/nginx/conf/waf/wafconf/"
--规则存放目录
attacklog = "on"
--是否开启攻击信息记录,需要配置logdir
logdir = "/data/wwwlogs/"
--log存储目录,该目录需要用户自己新建,需要nginx用户的可写权限
UrlDeny="on"
--是否拦截url访问
Redirect="on"
--是否拦截后重定向
CookieMatch = "on"
--是否拦截cookie攻击
postMatch = "off"
--是否拦截post攻击
whiteModule = "on"
--是否开启URL白名单
black_fileExt={"php","jsp"}
--填写不允许上传文件后缀类型
ipWhitelist={"127.0.0.1"}
--ip白名单,多个ip用逗号分隔
ipBlocklist={"1.0.0.1"}
--ip黑名单,多个ip用逗号分隔
CCDeny="on"
--是否开启拦截cc攻击
CCrate = "10/60"
--设置cc攻击频率,单位为秒.
--默认1分钟同一个IP只能请求同一个地址10次
过滤规则:
#过滤规则在/usr/local/openresty/nginx/conf/waf/wafconf下。
#规则可根据需求自行调整,每条规则需换行,或者用|分割
args里面的规则get参数进行过滤的
url是只在get请求url过滤的规则
post是只在post请求过滤的规则
whitelist是白名单,里面的url匹配到不做过滤
user-agent是对user-agent的过滤规则
#默认开启了get和post过滤的,需要开启cookie过滤,编辑waf.lua取消部分--注释即可。
#日志文件名称格式如下:虚拟主机名_sec.log
白名单设置:
#ip白名单
修改/usr/local/openresty/nginx/conf/waf/wafconf/config.lua中的ipWhitelist。
可以填写多个ip,多个ip中用,分割,例如{"127.0.0.1","192.155.1.1"}。
#url白名单
修改/usr/local/openresty/nginx/conf/waf/wafconf/whiteurl,一行一个,取字符段验证,只取uri,通常用于api链接放行,且不能带参数。
例如https://xxx/Rats.php?xx,我们填入^/Rats.php$即可放行全部以/Rats.php开头的uri。
效果测试:
拦截CC
攻击返回503
错误。
触发关键词会被防火墙拦截。
注意ngx_lua_waf
默认拦截phpMyAdmin
目录,请修改成其它名称访问数据库。
这个吼!