Varnish从X-Forwarded-for中删除公共IP

时间:2013-04-08 11:36:56

标签: varnish varnish-vcl

我正面临一个问题,即清漆在特定情况下不发送中介代理IP或公共IP。 情景如下:

  • 有些酒店/公司配置了squid代理,所有互联网流量都通过Squid路由。

  • 首先访问我公司网站的用户点击Load Balancer然后点击Varnish& Apache

  • Apache配置了mod_geoip。我站点上的代码根据IP地址执行国家/地区重定向。

问题:

  • 当用户(在鱿鱼代理后面)访问Load Balancer后面的公司网站时 - > VARNISH - > Apache - 这里的apache只获得内部IP(他的私有IP)和负载均衡器内部IP为X-forwarding-for,因此基于IP的重定向FAILS!

在Apache日志中(配置为记录X-Forwarded-IP)我看到用户专用IP&然后我的负载均衡器私有IP。

172.10.5.10,LoadBalancerIP - - [.......]

  • 同一个用户访问另一个没有Varnish的网站时,点击Load Balancer - > Apache - 这里的apache获得用户私有IP&用户公共IP作为X-forwarded-for和基于IP的国家重定向工作正常。

在Apache日志中(配置为记录X-Forwarded-IP)我看到用户专用IP,然后他的公共IP也被记录。

172.10.5.10,PublicIP - - [.......]

我的清漆配置如下。

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

PS:我已经谷歌了所有可以找到的链接,并且每个链接都提供了以下的清漆配置

目前为了解决这个问题,我不得不绕过清漆,现在网站流量直接打到了Apache,但我需要让Varnish恢复到Cache和Speedy交付的服务器内容。

如果有人可以指导我如何解决这个问题,我们将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

上述问题已得到解决。归功于Mithrandir @ Varnish IRC频道。谢谢! 需要下面提到的更改才能解决问题。

在default.vcl的开头添加:

import std;

在“if(req.http.x-forwarded-for)”下面添加:

std.collect(req.http.x-forwarded-for);
  • 做varnish configtest&重装。这应该开始显示公共IP。

  • 以下是vmod_std文档中的解释:

  

收集

   Prototype
          collect(HEADER header)

   Return value
          Void

   Description
          Collapses the header, joining the headers into one.

   Example
          std.collect(req.http.cookie); This will collapse several Cookie:
          headers into one, long cookie header.

答案 1 :(得分:0)

在Varnish 4中,不再需要这个,see upgrade info here