美文网首页
nginx-lua流量采集及拦截

nginx-lua流量采集及拦截

作者: Sevsea | 来源:发表于2020-03-09 18:27 被阅读0次

    首先你的环境需要支持:

    • nginx-lua
    • json.lua
    • lua-resty-kafka (如将流量打至kafka则需安装此包)
    • lua-resty-upload

    简单将流量采集分为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
    

    待更新高级用法。

    相关文章

      网友评论

          本文标题:nginx-lua流量采集及拦截

          本文链接:https://www.haomeiwen.com/subject/qyzpdhtx.html