Java 版 WAF

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

内容简介: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

火焰图:


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

查看所有标签

猜你喜欢:

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

一只小鸟告诉我的事

一只小鸟告诉我的事

[美]比兹·斯通 / 顾雨佳 / 中信出版社 / 2014-11 / 59.00元

比兹•斯通,无疑是自乔布斯后的又一个硅谷奇迹! 70后的他,出身贫苦,一无所有,却又特立独行,充满智慧。从他这本自传中,我们知道他和乔布斯一样,大学都没读完就辍学做了一名图书封面设计师,然后创建了赞架(Xanga)网站,又进了谷歌。在经济上打了翻身仗后,他毅然放弃了安逸的生活,从零开始,和朋友创建了世界最知名的社交平台推特(Twitter)。当推特奇迹般地改变着世界时,他又悄然离去,创建了自......一起来看看 《一只小鸟告诉我的事》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码