首先你的环境需要支持:
- nginx-lua
- json.lua
- lua-resty-kafka (如将流量打至kafka则需安装此包)
- lua-resty-upload
简单将流量采集分为3个模块:
- 请求数据包获取
- 响应数据包获取
- 拦截模块
0x01 请求数据包获取
这部分比较简单,基本信息都在ngx.var ngx.ctx 等中都可以获取到:
ngx.status #状态码
ngx.var.scheme #协议
ngx.var.request_method # 请求方法
ngx.var.request_uri #请求uri
ngx.var.host #请求域名host
ngx.var.remote_addr #请求方IP
ngx.var.hostname #主机hostname
ngx.var.time_iso8601 #时间
ngx.var.server_port #服务端端口
ngx.req.get_headers() #获取请求头
ngx.req.get_body_data() #获取请求体
此处需注意get_headers 和 get_body_data 均需转换成dict形式。
0x02 响应数据包获取
响应体获取不是直接ngx.resp.get_headers()之类可以获取到的,需做一些处理:
resp_body = string.sub(ngx.arg[1],1,10000)
//此处代表截取前1w字符
ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body
if ngx.arg[2] then
ngx.var.resp_body = ngx.ctx.buffered
end
ngx.ctx.buffered 即为响应体内容
需配合 header_filter_by_lua_file 引用
local h = ngx.resp.get_headers()
local r = {}
for k, v in pairs(h) do
r[k]=v
end
ngx.ctx.resp_headers = r
ngx.ctx.resp_headers 即为响应头信息
需配合 body_filter_by_lua_file 引用
0x03 简单拦截
以下为对内容进行简单拦截。
local post_data = ""
if ngx.req.get_body_data()~=nil then
post_data = ngx.req.get_body_data()
end
local get_data = ""
if ngx.var.request_uri~=nil then
get_data = ngx.var.request_uri
end
if string.match(get_data,"@type") then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
if string.match(post_data,"@type") then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
待更新高级用法。
网友评论