Load-Balancing

根據客戶端 IP 清漆負載均衡器後面的 ACL

  • September 9, 2017

在以下設置中:

Client -> LB -> Varnish

我想配置 Varnish acls 以根據客戶端的 IP 採取某些操作。LB 在一個名為“ClientIP”的變數中發送客戶端的 IP,Varnish 可以通過req.httpd.ClientIP.我試過這個來讀取它:

acl admin_net {
 "10.10.1.160"/27;
}

sub vcl_deliever {
 if (req.http.ClientIP ~ admin_net) {
 // do something ... 
 }  
}

但 VCL 編譯失敗並顯示“預期 CSTR 得到 ‘admin_net’”(C 字元串?)。我可以通過 解決這個問題req.http.ClientIP ~ "10.10.1.*"),但我必須註釋掉 ACL 行。

還有其他方法可以使用 ACL 嗎?我也看了看client.ip,這是一個只讀變數。在上述設置中,它包含 LB 的 IP,而不是客戶端的 IP。

實際上 Varnish 將 client.ip 處理為不同的數據類型,因此您可以針對該值使用 ACL。這不適用於像 req.http.ClientIP (或所有 req.http.* 參數)這樣的文本值。因此,具有此文本值的正則表達式似乎是一個很好的解決方案。

或者,您可以使用特定模組來設置 client.ip。例如,我發現了這個:http: //lassekarstensen.wordpress.com/2013/07/22/setting-client-ip-in-varnish-vcl-with-libvmod-ipcast/

這可以使用std.ip來完成,假設 ClientIP 標頭已在 vcl_recv() 中設置。例如:

vcl 4.0;
import std;

acl admin_net {
 "10.10.1.160/27";
}

sub vcl_deliver {
 if (std.ip(req.http.ClientIP,"0.0.0.0") ~ admin_net) {
 // do something ... 
 }  
}

引用自:https://serverfault.com/questions/598184