0

如果多个 IP 在 X-Forward-For 标头中,并且使用波浪号运算符与 ACL 进行比较,Varnish 会发生什么?

虚拟示例:

该请求具有以下 HTTP 标头:

X-Forward-For: 160.12.34.56, 10.10.10.10

Varnish 配置如下所示:

acl internal {
    "10.10.10.10"
}

if ((std.ip(req.http.X-Forward.For, "0.0.0.0") ~ internal)){
    # THIS CODE   
}
else {
    # OR THIS CODE
}

执行哪个代码块?

此外,IP 的顺序在 X-Forward-For 标头中是否重要?

如果有 2 个 X-Forward-For 标头,每个标头都有两个 IP 之一,它会改变吗?

4

1 回答 1

1

它会起作用吗?

对您的问题的简短回答是否定的,它不会起作用。

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 终止的信息。

于 2020-10-28T09:31:10.593 回答