它会起作用吗?
对您的问题的简短回答是否定的,它不会起作用。
std.ip()
期望接收单个IP 地址,而不是集合。转换将失败,并返回后备值(函数的第二个参数)。
这是一个快速测试脚本,说明了这一点:
vcl 4.0;
import std;
backend default none;
sub vcl_recv {
set req.http.x-f = "1.2.3.4, 5.6.7.8";
return(synth(200,std.ip(req.http.x-f,"0.0.0.0")));
}
此示例将返回0.0.0.0
.
X-Forwarded-For 需要多个 IP 地址吗?
X-Forwarded-For
如果您的标头需要多个 IP 地址,问这个问题确实有意义。
这个想法是向原始服务器指示原始客户端的 IP 地址是什么。
在您的情况下,网络服务器前面有超过 1 个代理,因此自然反应是将 IP 地址链接到X-Forwarded-For
标头中。
更好的解决方案是找出原始客户端的 IP 地址是什么,并将该值设置为X-Forwarded-For
.
完成此任务的最佳方法是利用 Varnish 支持的PROXY 协议。
利用代理协议
PROXY协议具有传输 HTTP 协议的能力,但还跟踪原始客户端的连接参数。
Varnish 支持这一点,并允许您设置一个额外的侦听端口来侦听PROXY请求。
下面是一个如何从PROXY支持开始varnishd
的示例:
varnishd -a :80 -a :8443,PROXY -f /etc/varnish/default.vcl -s malloc,256m
如您所见,端口80
仍可用于常规HTTP,但端口8443
已分配用于代理支持。
如果 Varnish 前面的代理服务器支持PROXY,Varnish 将从原始客户端获取值并自动设置X-Forwarded-For
为该值。
这样您就可以始终知道客户是谁,并且可以安全地执行ACL 检查。
此外,还有一个用于 Varnish 的代理模块,它可以为您提供有关在 Varnish 之前发生的潜在TLS 终止的信息。