Nginx流量鏡像


 Nginx在1.13版本的時候就添加了ngx_http_mirror_module模塊,用來做流量鏡像。它的流量鏡像是只復制鏡像,發送到配置好的后端,但是后端響應返回到nginx之后,nginx是自動丟棄掉的,這個特性就保證了,鏡像后端的不管任何處理都不會影響到正常客戶端的請求。但是,復制的鏡像請求和原始請求是相關聯的,只要鏡像請求沒有處理完成,原始請求就會被阻塞

具體如下:

主要是倆個指令:

Syntax:mirror uri | off;
Default: mirror off;

Context:httpserverlocation

mirror用來指定請求將被鏡像到哪個uri,可以指定多個鏡像,uri也可以用相同的,相同的uri就表示將流量放大了一倍,也就是多復制了一份流量到uri。

 

Syntax:mirror_request_body on | off;
Default:

mirror_request_body on;

Context:httpserverlocation

該參數是指定是否鏡像request_body部分,默認是開啟的,官方文檔中說,這個指令和

  • proxy_request_buffering

  • fastcgi_request_buffering

  • scgi_request_buffering

  • uwsgi_request_buffering

指令沖突,開啟之后會禁用以上指令。

使用該指令一定要保證mirror_request_body、proxy_pass_request_body和Content-Length配置一直,比如mirror_request_body或proxy_pass_request_body設置為off,則Content-Length必須設置為“”,因為nginx(mirror_request_body)或tomcat(mirror_request_body)處理post請求時,會根據Content-Length獲取請求體,如果Content-Length不為空,而由於mirror_request_body或者proxy_pass_request_body設置為off,處理方以為post有內容,當request_body中沒有,處理方會一直等待至超時,則前者為off,nginx會報upstream請求超時

 

配置參考:

location / {
    mirror /mirror;
    proxy_pass http://backend;
}

location = /mirror {
    internal;
    proxy_pass http://test_backend$request_uri;
}

mirror 模塊可用於以下幾個場景:

  • 通過預生產環境測試來觀察新系統對生產環境流量的處理能力。
  • 復制請求日志以進行安全分析。
  • 復制請求用於數據科學研究。

1.用於安全分析

Nginx的兩種開源waf,NaxsiModSecurity,直接上生產會不會有問題,攔截正常請求。

現在大多WAF都是通過規則匹配請求特征,有規則,肯定就不會那么智能的避開所有正常請求,只攔截惡意請求,雖然現在有百度的openrasp等不依賴於請求特征的運行時攻擊檢測工具,但是也不能做到完全准確的攔截攻擊或惡意請求。

參考網絡防火牆,或者入侵檢測系統的方法,通過流量鏡像的方式,在網絡故障處理中,為了更好的分析定位網絡問題,我們通常會做流量鏡像或者端口鏡像,來保存鏡像流量,用於分析惡意請求、或抓包故障定位等,web上也可以通過這種方式來做:

 

 通常waf中,攔截掉之后會返回403給客戶端,當然也可以自定義,完后會記錄攔截日志,利用這種機制,將waf配置在流量鏡像下使用一段時間后,就可以從日志中分析出哪些正常請求會被攔截掉,從而修改waf規則,然后接入到生產數據中,這樣可以有效的避免waf的FRR。

參考:

https://blog.51cto.com/u_15127559/2661979

https://cloud.tencent.com/developer/article/1495449

http://nginx.org/en/docs/http/ngx_http_mirror_module.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM