Java 版 WAF

栏目: Java · 发布时间: 7年前

内容简介:Java 版 WAF

网上有很多基于Nginx和Apache的软件WAF开源方案,笔者为了学习所以用 Java 重造了一个轮子.

Quick Start

编译:

mvn package

运行:

由于使用 appassembler-maven-plugin 打成了符合 JSW 规范的包,所以解压target目录下的Zip文件, 然后在bin目录下运行对应平台的脚本,以 Linux 为例:

bin/waf { console | start | stop | restart | status | dump }

配置:

配置文件在conf目录下,upstream.properties中配置的是需要反向代理的目标机,waf.properties中配置的是WAF拦截的信息及一些常规配置,wrapper.conf 中是JSW的配置文件,这里面包含JVM配置等信息.

架构

HTTP Proxy选择了基于 Netty 研发的 LittleProxy , LittleProxy是 LANTERN 的维护者发起的开源项目,是一款非常优秀的Java HTTP Proxy. 关于Loadbalance,WAF有两种模式可以供选择,一种基于Proxy Chain,例一种是基于HostResolver.Proxy Chain是把目标机的映射交给 下游的Proxy,而HostResolver则是WAF自身完成映射.需要特别注意的是,Proxy Chain中如果存在多Proxy是不会负载均衡的,只有前一个不可用时才会用下一个.

HttpRequestFilterChain和 HttpResponseFilterChain 责任链,分别对进来和出去的数据尽心拦截分析.Request拦截 又分为黑白名单两种,Response拦截主要给输出的数据进行安全加固.在Request的拦截规则方面,我参考了 loveshell/ngx_lua_waf .

性能

测试目的

Nginx的性能是有目共睹的,WAF既然作为一个HTTP Proxy,所以需要跟Nginx对比一下,看看性能的差距有多大.

因为目的是要压出中间Proxy的性能极限,所以后端服务性能要非常高,至少要比中间Proxy性能好,所以选用了Nginx模拟后端服务. 为了减少网络开销对测试影响,所有的测试都是在一台机器上完成的.

测试基准:

1.AB->Nginx_Proxy->Nginx_AS

2.AB->WAF->Nginx_AS

3.ab -k -c 100 -n 1000000 目标地址(HTTP长链)

4.ab -c 100 -n 1000000 目标地址(HTTP短链)

WAF JVM配置:

wrapper.java.additional.1=-server
wrapper.java.additional.2=-Xms2048m
wrapper.java.additional.3=-Xmx2048m
wrapper.java.additional.4=-Xmn500m
wrapper.java.additional.5=-XX:PermSize=128m
wrapper.java.additional.6=-XX:MaxPermSize=128m
wrapper.java.additional.7=-XX:TargetSurvivorRatio=80
wrapper.java.additional.8=-XX:+UseConcMarkSweepGC
wrapper.java.additional.9=-XX:+CMSClassUnloadingEnabled
wrapper.java.additional.10=-Xloggc:/tmp/log/gc.log
wrapper.java.additional.11=-XX:+HeapDumpOnOutOfMemoryError
wrapper.java.additional.12=-XX:+PrintGCDetails
wrapper.java.additional.13=-XX:+PrintGCTimeStamps

WAF参数配置:

#url路径拦截
waf.url=on
#cookie拦截
waf.cookie=on
#user agent拦截
waf.ua=on
#post body参数拦截
waf.post=on
#url参数拦截
waf.args=on
#文件拦截
waf.file=on
#cc拦截
waf.cc=off
#扫描器拦截
waf.scanner=on
#每秒rate
waf.cc.rate=100
#on表示waf支持loadbalance,需要配置upstream.properties;off表示loadbalance交给下游的proxy,需要配置waf.proxy.chain.servers.
waf.proxy.lb=on
#设置重试间隔时间,默认10秒
waf.proxy.lb.fail_timeout=10
#waf下游的proxy,多个用","分隔.注意只有前一个不可用,才会用下一个,下游proxy不会负载均衡
waf.proxy.chain.servers=127.0.0.1:8180
#是否启用TLS,需要对SelfSignedSslEngineSource2进行部分改造
waf.tls=off
#ip白名单
waf.ip.whitelist=on
#ip黑名单
waf.ip.blacklist=on
#url白名单
waf.url.whitelist=on
#接收者线程数
waf.acceptorThreads=200
#处理client请求的工作线程数
waf.clientToProxyWorkerThreads=300
#处理proxy与后端服务器的工作线程数
waf.proxyToServerWorkerThreads=300

服务器(测试机)配置:

4  Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz

结果:

测试场景 测试条件 QPS
AB->Nginx_AS HTTP长链 64815
AB->Nginx_AS HTTP短链 6174
AB->Nginx_Proxy->Nginx_AS HTTP长链 16924
AB->Nginx_Proxy->Nginx_AS HTTP短链 13137
AB->WAF->Nginx_AS HTTP长链 5566
AB->WAF->Nginx_AS HTTP短链 5559

火焰图:


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First JavaScript程序设计

Head First JavaScript程序设计

[美]Eric T. Freeman、[美] Elisabeth Robson / 袁国忠 / 人民邮电出版社 / 2017-9 / 129.00 元

本书语言和版式活泼,内容讲解深入浅出,是难得的JavaScript入门书。本书内容涵盖JavaScript的基本知识以及对象、函数和浏览器文档对象模型等高阶主题。书中配备了大量有趣的实例、图示和练习,让读者轻轻松松掌握JavaScript。一起来看看 《Head First JavaScript程序设计》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具