最近vps总是被扫描器扫,扫的不亦乐乎,看了看日志,写了个小脚本统计了一下。
```
#!/usr/bin/python
import re
visiter = {}
row = 0
with open("www.leavesongs.com.log", "r") as fin:
for line in fin:
line = line.strip()
rex = re.match(r"^([d.]+).*$", line)
ip = rex.group(1)
if visiter.has_key(ip):
visiter[ip].append(line)
else:
visiter[ip] = []
visiter[ip].append(line)
row += 1
print "Row: %d" % row
print "Ip: %s" % len(visiter)
with open("stat.log", "w") as f:
for (k, v) in visiter.items():
print "%s : %d" % (k, len(v))
if len(v) <= 2:
f.write("%sn" % v)
```
如上图,计算了究竟有多少IP在请求我的网站,然后每个IP请求的次数。正常情况下,请求次数在5以上,说明是一个浏览器用户在访问我。因为一个页面必然有css、javascript、images等资源同样需要请求。如果你发现一个IP只请求了你一次,很可能以下几种情况:
- 其他网站图片盗链:当请求的是图片的时候
- 蜘蛛在爬取(或者是伪装成蜘蛛的东西)
- rss订阅:请求的通常是/?rss、/rss.php之类的
- 扫描器在扫描,而且每次扫描的IP不同,可能是分布式扫描器
那么如果我发现一个IP访问我几百次,也只有几种情况:
- 我自己
- 我的忠实粉丝
- 爬虫或扫描器在扫
当然,第二种可能性微乎其微了。
为了防御无良扫描器。所以,想在自己的VPS上装一个WAF。以前尝试过一个WAF叫nasxi,但感觉效果一般,自定义性不好。
lua是一个轻量、快速的语言,一门语言的灵活度一定是比一个配置文件要高很多的,这也是我为何会选择用ngx_lua_waf作为WAF的原因。
我选择先在我树莓派上试安装一遍,免得把我虚拟机装坏了。
这是ngx_lua_waf的主页: https://github.com/loveshell/ngx_lua_waf
按照作者说法,我需要先安装lua-nginx-module:https://github.com/openresty/lua-nginx-module
再次按照lua-nginx-module作者的说法,我需要先安装LuaJIT、ngx_devel_kit。那么一步一步来。
## 一、安装luaJIT
luaJIT是一个C语言写的lua解释器,我的树莓派上原本就是有lua5.1.5版本的,但我还是选择用luaJIT,据说是效率较高一些。
通过git下载luajit2.0版本的源码、编译、安装:
git clone http://luajit.org/git/luajit-2.0.git
cd luajit-2.0
make
sudo make install PREFIX=/home/pi/luajit-2.0
没啥特别的,就像所有linux软件一样。
## 二、下载ngx_devel_kit
ngx_devel_kit是nginx的一个模块,用来拓展nginx服务器核心功能。其他模块可以在这个框架下更轻松的进行开发。
首先下载下来:
git clone https://github.com/simpl/ngx_devel_kit.git
不用编译了。
## 三、下载lua-nginx-module
我选择lua-nginx-module v0.9.5版本
wget https://github.com/openresty/lua-nginx-module/archive/v0.9.15.tar.gz
tar -zxvf v0.9.15.tar.gz
## 四、升级、编译nginx
树莓派之前是安装了nginx的,所以首先看看nginx版本以及当时编译的时候的编译选项:
真多呀。。版本也比较低,1.2.1,先在nginx都1.7.10了,我准备把nginx升级到最新版。
先下载并解压1.7.10。
wget http://nginx.org/download/nginx-1.7.10.tar.gz
tar -zxvf nginx-1.7.10.tar.gz
cd nginx-1.7.10/
然后我想整理一下nginx的这些模块,有些模块用不上的可以不用加了。当时安装nginx是通过apt-get进行安装的,所以有些模块的源码不在树莓派里了,直接用上面列出的编译选项肯定编译不通过。
1.nginx-auth-pam
提供pam认证的模块,对于我来说并没有太大意义,可以去掉。
2.nginx-echo
可以在nginx配置文件中使用echo语句,输出一些东西。其实还是比较有意思,但我这里为了不找麻烦,也没必要保留之。
3.nginx-upstream-fair
负载均衡模块,我单独的vps或树莓派也是用不上的。
4.nginx-dav-ext-module
提供nginx没有实现的HTTP方法,比如OPTIONS。因为之前已经加了--with-http_dav_module,这个自带的模块包括了大多数HTTP命令了,RESTful支持的PUT、DELETE在http_dav_module已经实现,所以也没太大必要使用nginx-dav-ext-module。
综上所述,apt-get安装的外带模块实际都不是必要的。然后我需要加自己的了:
--with-ld-opt="-Wl,-rpath,/home/pi/luajit-2.0/lib"
--add-module=/home/pi/ngx_devel_kit
--add-module=/home/pi/lua-nginx-module/lua-nginx-module-0.9.15
分别是luajit的lib,ngx_devel_kit与lua-nginx模块。
最后得到如下配置:
# 先设置环境变量,指定luajit的lib、include目录
export LUAJIT_LIB=/path/to/luajit/lib
export LUAJIT_INC=/path/to/luajit/include/luajit-2.0
./configure --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module --with-ld-opt="-Wl,-rpath,/home/pi/luajit-2.0/lib" --add-module=/home/pi/ngx_devel_kit --add-module=/home/pi/lua-nginx-module/lua-nginx-module-0.9.15
来到nginx目录/home/pi/nginx-1.7.10/执行之。
树莓派性能不行,check、make都挺慢的,过程中可以喝杯茶。
运行到一半时还是出错了:
出错不可怕,可怕的是不知道出了什么错。这里,错误被说得很明白,所以解决起来也不是什么难题。
在stackoverflow很快找到安装pcre library的方法:
所以执行一下:
sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
就可以了。还是得喝茶,因为太慢。不光树莓派慢,网速也慢。
好吧,还有依赖没装:
继续装。
sudo apt-get install libxml2 libxml2-dev libxslt-dev
继续有依赖没装:
继续装:
sudo apt-get install libgd2-xpm libgd2-xpm-dev
继续出错:
继续装:
sudo apt-get install geoip-database libgeoip-dev
继续装的过程中,发现这样一个博客:http://www.cnblogs.com/terrysun/archive/2012/11/22/2782472.html
我只能说,知我者,君也。
不过在装goeip的时候,树莓派的源似乎连不上了。
我们看看geoip是什么module:
http://nginx.org/en/docs/http/ngx_http_geoip_module.html
其实是一个根据IP来定位的module,在我这是用不上的。所以我也不自找麻烦,直接将--with-http_geoip_module去掉就OK了。
OK 完毕,开始编译:
make
再次喝茶。茶都喝穿了。
好了,将之前的nginx可执行文件备份一遍,把新的复制过去
sudo mv /usr/sbin/nginx /usr/sbin/nginx-1.2
sudo cp objs/nginx /usr/sbin/nginx
sudo /usr/sbin/nginx -t
测试OK:
将Makefile文件中upgrade节点中的/etc/nginx/sbin/nginx -t改为/usr/sbin/nginx -t
就开始平滑升级:
sudo make upgrade
OK,已经升级成功,而且lua-nginx-module,我们主要的任务已经编译进去了。
可以开始加载我们的ngx_lua_waf了。
## 五、下载并配置ngx_lua_waf
首先用git从github将ngx_lua_waf下载下来,并拷贝到nginx目录下
git clone https://github.com/loveshell/ngx_lua_waf.git
cp -R ngx_lua_waf /etc/nginx/waf/
然后编辑nginx的主配置文件nginx.conf,在http段中加入如下配置:
##
# ngx_lua_waf config
##
lua_package_path "/etc/nginx/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file /etc/nginx/waf/init.lua;
access_by_lua_file /etc/nginx/waf/waf.lua;
再把/etc/nginx/waf/config.lua中,按照自己的情况修改一下路径:
RulePath = "/etc/nginx/waf/wafconf/"
logdir = "/var/log/ngx_lua_waf/"
OK。大功告成。重启nginx:
sudo service nginx reload
测试一下:
可见已经让我go away了,赶紧滚蛋~
确实要滚去睡觉了。
--
以下是第二天
昨晚把树莓派装好了,今天开始装vps。这才是我最终目的。
自己的vps就是快,很快就按步骤基本做好了,结果卧槽最后重启nginx的时候报错了:
Reload service nginx... nginx: [emerg] unknown directive "lua_package_path" in /usr/local/nginx/conf/nginx.conf:114
为毛换个机子就出错呀。而且错误是说不认得lua_package_path这个配置项,可是我明明把lua-nginx-module编译进去了呀?
执行nginx -V 发现一切正常:
nginx version: nginx/1.7.10
built by gcc 4.7.2 (Debian 4.7.2-5)
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-ld-opt=-Wl,-rpath,/root/luajit-2.0/lib --add-module=/root/ngx_devel_kit --add-module=/root/lua-nginx-module-0.9.15
最后确实有/root/lua-nginx-module-0.9.15的。
于是想了很久,干脆重新编译了一次,这次用的是:
make -j2
make install
不再用upgrade,这时候nginx -t就OK了。
重启用service nginx restart不要用reload,否则waf功能加载不上。
基本就是这些笔记了,以后还需要对lua规则进行一些折腾,希望做成一个最适合我的防火墙。
本文始发于微信公众号(代码审计):nginx_lua_waf安装笔记
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论