nginx-lua流量采集及拦截

2020-03-09  本文已影响0人  Sevsea

首先你的环境需要支持:

简单将流量采集分为3个模块:

  1. 请求数据包获取
  2. 响应数据包获取
  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

待更新高级用法。

上一篇下一篇

猜你喜欢

热点阅读