内容简介: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 |
火焰图:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Ajax Design Patterns
Michael Mahemoff / O'Reilly Media / 2006-06-29 / USD 44.99
Ajax, or Asynchronous JavaScript and XML, exploded onto the scene in the spring of 2005 and remains the hottest story among web developers. With its rich combination of technologies, Ajax provides a s......一起来看看 《Ajax Design Patterns》 这本书的介绍吧!