Rat's

使用OneinStack搭建网站LNMP环境,并配置WAF防火墙防CC攻击
前言现在对于很多站长来说,或多或少的都会遇到CC攻击,而防御最好的办法就是套CDN,比如国外的CloudFlare...
扫描右侧二维码阅读全文
02
2018/05

使用OneinStack搭建网站LNMP环境,并配置WAF防火墙防CC攻击

前言

现在对于很多站长来说,或多或少的都会遇到CC攻击,而防御最好的办法就是套CDN,比如国外的CloudFlare,而CF很多时候速度并不是很快,在很多地方也被屏蔽了,所以体验不是很好。这时候我们可以用脚本来防一下,之前发过一个防CC脚本,查看:Linux VPS防CC攻击一键脚本,带微信提醒,由于需要访问日志,所以效果并不是很好,稍微大点的CC都会扛不住,所以该脚本在一些情况下不是很适合。

这里再讲个防CC教程,使用Nginx+Lua设置WAF防火墙来防CC,还可以拦截Url关键词等,其优点Nginx占用小,高并发的优势,以及Lua语言的轻快,并在用户访问前就可以处理掉攻击,效果还是很不错的。

由于配置前需要编译Lua模块,而OneinStackLNMP一键包中OpenResty自带Lua模块,所以博主建议使用该一键包安装网站环境。

LNMP安装

先去OneinStack网站获取一键包,访问地址:https://oneinstack.com/auto/Nginx选择OpenResty;如果内存小于1GMysql不能大于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_luaWAF防火墙脚本来防CC攻击和拦截Url关键词等。其功能如下:

  • 防止sql注入,本地包含,部分溢出,fuzzing测试,xss55RFweb攻击。
  • 防止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目录,请修改成其它名称访问数据库。

部分参考:https://www.94ish.me/1730.html

Vultr新用户注册送100美元/16个机房按小时计费,支持支付宝,【点击查看】。
最后修改:2018 年 11 月 14 日 09 : 17 AM

发表评论

29 条评论

  1. 烟灰

    其实不需要这么复杂的,oneinstack安装好nginx环境后,./addons.sh,选择11,直接安装ngx_lua_waf

    1. Rat's
      @烟灰

      这个是自动配置规则的么?是的话,我再试试。

      1. 烟灰
        @Rat's

        是,包含安装、配置文件、加载配置文件、重启nginx

        1. Rat's
          @烟灰

          有空我看看。

  2. CKeven
    nginx waf 配置后网站打不开了。。
    1. Rat's
      @CKeven

      估计操作问题,建议直接OneinStack,然后照着文章做基本不会有错。

      1. CKeven
        @Rat's

        本地centos测试可以~用的oneinstack appnode面板测试不成功。

        主配置和网站配置文件都试了 = = 就是不行! 保存nginx就起不来了。

        1. Rat's
          @CKeven

          那就不清楚了,一般启动不了就是配置文件有问题。

  3. CKeven

    老哥 配置规则是放在主配置文件还是网站的配置文件里锕~~~ 因为我用的appnode 设置了这个看不出效果= = 另外 老哥 这个是不是还需要开启lua扩展挖~

    1. Rat's
      @CKeven

      需要编译lua。

  4. Cyril Wong

    您好,这是我的nginx配置,请问我要把那串代码放到http什么位置,刚刚试了下,放进去之后,网站打不开了,谢谢。

    1. Rat's
      @Cyril Wong

      放到http{}双括号里面就行,随便哪个地方,网站打不开看有没有漏东西。

  5. C16

    有木有apache的啊,一直用LAMP。。。

    1. Rat's
      @C16

      么有,Nginx并发好些,所以一般都是nginx。

  6. James

    博主,phpMyAdmin怎么修改才能访问?

    1. Rat's
      @James

      数据库目录在/data/wwwroot/default里面,重新命名数据库文件夹就行了

  7. 久光

    需要nginx用户的可写权限是啥意思啊,应该怎么设置。我创建了目录但是看不到日志。。。

    1. Rat's
      @久光

      授权可执行权限。试试命令chmod -R 775 /data/wwwlogs

      1. 久光
        @Rat's

        感谢回复,是这样子的,意思是要把指定的目录权限设置为www,我没理解过来

  8. linkstar

    [root@host conf]# /etc/init.d/nginx restart
    /etc/init.d/nginx: line 92: /usr/local/nginx/sbin/nginx: No such file or directory

    1. linkstar
      @linkstar

      这个命令不能让Nginx重启吧。另外想知道这个配置生效了在哪里看呢?

      1. Rat's
        @linkstar

        测试教程的时候,这个命令确实是可以重启的,或者你使用service nginx restart重启,查看是否生效,你找个web页面,刷新10下,看是否出现503错误。

  9. CPUFAN

    大佬,这个一键包怎么安装php那个mail()函数,不喜欢SMTP,希望出安装这个函数的文章

    1. Rat's
      @CPUFAN

      这个暂时没深入研究。一般都自带这个函数,你去php.ini看看。

  10. zhujiwiki

    宝塔nginx1.12默认支持WAF防火墙

    1. zhujiwiki
      @zhujiwiki

      准备用这个

      1. Rat's
        @zhujiwiki

        我也把环境转过来了。

    2. Rat's
      @zhujiwiki

      不怎么喜欢用面板。