【问题标题】:Varnish: Multiple IPs compare to ACL using TildeVarnish:多个 IP 与使用波浪号的 ACL 进行比较
【发布时间】:2021-02-10 00:16:05
【问题描述】:

如果多个 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 之一,它会改变吗?

【问题讨论】:

    标签: acl varnish varnish-vcl tilde x-forwarded-for


    【解决方案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 个代理,因此很自然的反应是在 X-Forwarded-For 标头中链接 IP 地址。

    更好的解决方案是找出原始客户端的 IP 地址,并将该值设置为 X-Forwarded-For

    完成此任务的最佳方法是利用 Varnish 支持的 PROXY protocol

    利用 PROXY 协议

    PROXY 协议具有传输 HTTP 协议的能力,但额外跟踪原始客户端的连接参数。

    Varnish 支持这一点,并允许您设置一个额外的侦听端口来侦听 PROXY 请求。

    这是一个示例,说明如何在 PROXY 支持下启动 varnishd

    varnishd -a :80 -a :8443,PROXY -f /etc/varnish/default.vcl -s malloc,256m
    

    如您所见,端口80 仍可用于常规HTTP,但端口8443 分配用于PROXY 支持。

    如果 Varnish 前面的代理服务器支持 PROXY,Varnish 将从原始客户端获取值并自动将 X-Forwarded-For 设置为该值。

    这样您就可以始终知道客户是谁,并且您可以安全地执行您的ACL 检查

    此外,还有一个PROXY module for Varnish,它可以为您提供有关在 Varnish 前发生的潜在 TLS 终止的信息。

    【讨论】:

    • 很好的答案,我正在查看清漆代码,但无法完全确定它是否以某种方式解析了集合。奇怪的是,实现 std.ip (vmod_ip : github.com/varnishcache/varnish-cache/blob/…) 的代码正在调用一个名为 VSS_ResolveFirst() 的函数。如果它不能处理列表,他们为什么要称它为 ResolveFirst?
    • @Silver VSS_ResolveFirst() 实际上与 IP 地址列表无关,但它是一个非常通用的解析器函数,它接受 IP 地址或主机名。如果使用解析为多个 IP 地址的主机名,此函数将选择第一个。我理解您的困惑,但不幸的是,它的名称中包含“first”这一事实与您的用例无关。
    • 啊,明白了。感谢您的澄清。您的测试也使其具有决定性。
    • @Silver 很高兴听到,但不要忘记我提到的PROXY 协议。当您有多个相互链接的代理时,它将确保正确的 IP 地址存储在 X-Forwarded-For 中。
    • 是的,我看过了,但实际上我们的组织中有其他/更好的解决方案,我已经为我们的案例推荐了这些解决方案。它肯定会在未来帮助其他人。
    猜你喜欢
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2013-07-25
    • 2011-06-24
    • 2013-07-14
    • 1970-01-01
    • 2017-07-28
    相关资源
    最近更新 更多