Nginx在1.13版本的時候就添加了ngx_http_mirror_module模塊,用來做流量鏡像。它的流量鏡像是只復制鏡像,發送到配置好的后端,但是后端響應返回到nginx之后,nginx是自動丟棄掉的,這個特性就保證了,鏡像后端的不管任何處理都不會影響到正常客戶端的請求。但是,復制的鏡像請求和原始請求是相關聯的,只要鏡像請求沒有處理完成,原始請求就會被阻塞。
具體如下:
主要是倆個指令:
Syntax:mirror
uri
| off
;
Default: mirror off;
Context:http
, server
, location
mirror用來指定請求將被鏡像到哪個uri,可以指定多個鏡像,uri也可以用相同的,相同的uri就表示將流量放大了一倍,也就是多復制了一份流量到uri。
Syntax:mirror_request_body
on
| off
;
Default:
mirror_request_body on;
Context:http
, server
, location
該參數是指定是否鏡像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,Naxsi和ModSecurity,直接上生產會不會有問題,攔截正常請求。
現在大多WAF都是通過規則匹配請求特征,有規則,肯定就不會那么智能的避開所有正常請求,只攔截惡意請求,雖然現在有百度的openrasp等不依賴於請求特征的運行時攻擊檢測工具,但是也不能做到完全准確的攔截攻擊或惡意請求。
參考網絡防火牆,或者入侵檢測系統的方法,通過流量鏡像的方式,在網絡故障處理中,為了更好的分析定位網絡問題,我們通常會做流量鏡像或者端口鏡像,來保存鏡像流量,用於分析惡意請求、或抓包故障定位等,web上也可以通過這種方式來做:
通常waf中,攔截掉之后會返回403給客戶端,當然也可以自定義,完后會記錄攔截日志,利用這種機制,將waf配置在流量鏡像下使用一段時間后,就可以從日志中分析出哪些正常請求會被攔截掉,從而修改waf規則,然后接入到生產數據中,這樣可以有效的避免waf的FRR。
參考:
https://blog.51cto.com/u_15127559/2661979