为什么清漆默认配置将 IP 附加到 x-forwarded-for

Why does varnish default config appends the IP to x-forwarded-for

附加以逗号分隔的 ip 是否有充分的理由,或者以下是否有效?

if (req.restarts == 0) {
    if (!req.http.x-forwarded-for) {
       set req.http.X-Forwarded-For = client.ip;
    }
}

之所以这样做,大概是RFC7239

The "for" parameter is used to disclose information about the client that initiated the request and subsequent proxies in a chain of proxies.

像 squid 这样的客户端代理也可以将原始 IP 添加到 X-Forwarded-For header,所以如果你这样做并且请求已经设置了 header,varnish不会将它认为 client.ip 的内容添加为 header 字段的一部分。

更新:

“真实 IP”将只是 header 的唯一值,如果客户端还没有提供的话——但像 squid 这样的代理就是这样做的。如果您总是 想要客户端的 IP(这可能是不透明代理的 IP - 因此创建 XFF header)作为唯一值,请忽略 if (!req.http.x-forwarded-for)条件。

但我真的会单独使用 XFF header 并在后端使用自定义 header 字段,特别是如果您打算将其用于资源访问控制,这是固有的无论如何使用 XFF header 是不安全的事情。

另请注意,可以使用 setRequestHeader() 方法在 javascript 中设置 HTTP headers。

了解您的推荐目标是什么会很有用。