避免 Apache 的 mod_status 被 Varnish 暴露

避免 Apache 的 mod_status 被 Varnish 暴露

一个 Ubuntu 9.04 盒子,在 8080 上运行 Apache,在 80 上运行 Varnish。

最近设置了 Munin,不知道为什么 Apache 图表是空的。从日志中看到 Munin 正在访问/server-status?auto403 Forbidden返回。所以我编辑/etc/apache2/monds-enabled/status.conf以允许从 访问127.0.0.1。但这样做实际上会/server-status公开,因为通过 Varnish 发出的请求似乎也来自127.0.0.1

所以问题是,我该如何配置mod_status才能仅由 Varnish 访问munin-node而不是由 Varnish 访问?

答案1

我解决这个问题的方法是确保即使请求通过 varnish 缓存,Apache 也能获取实际访问者的 IP。我使用 Apache mod_rpaf 来实现这一点(请参阅http://giantdorks.org/alain/easily-get-the-correct-client-ip-with-mod_rpaf/)。

另外,为了防止客户端的请求也经过设置 X-Forwarded-For 标头的某些代理,我在我的 varnish 缓存实例(在 vcl_recv 中)中重置了它:

  remove req.http.X-Forwarded-For;
  set    req.http.X-Forwarded-For = client.ip;

然后还告诉 varnish 永远不要缓存 /server-status 和 /server-info 的响应。以下内容(也在 vcl_recv 中)对我有用:

  if (req.url ~ "server-(info|status)") {
    return (pass);
  }

答案2

这看起来像一个解决方案,告诉我你的想法。

Varnish 会X-Varnish向其发送到后端的每个请求添加一些 HTTP 标头。这些标头可用于 Apache 配置,以识别来自 Varnish 的请求。

/etc/apache2/mods-enabled/status.conf

<IfModule mod_status.c>

SetEnvIf X-Varnish ".+" from_varnish
ExtendedStatus On

<Location /server-status>
    SetHandler server-status
    Order allow,deny
    Deny from env=from_varnish
    Allow from localhost ip6-localhost 127.0.0.1

</Location>

</IfModule>

然后告诉 munin 监视端口 8080 而不是 80。来自的请求munin-node将直接发来,因此不会X-Varnish设置标头。

添加到/etc/munin/plugin-conf.d/munin-node

[apache_*]
env.url   http://127.0.0.1:%d/server-status?auto
env.ports 8080

答案3

我在 Ubuntu 12.04 上也遇到了同样的情况,Apache2 在端口 8008 上,Varnish 在端口 80 上。使用 Varnish VCL 时,我的服务器状态页面缓存了一个小时,因此仍然可用,但只有在缓存刷新时才提供状态报告。实施 Alain 的解决方案使实时服务器状态在 Varnish 传递到后端时可用。为了保护我的服务器状态,我做了以下事情:

我在 /etc/munin/plugin-conf.d/munin-node 中配置了 munin-node 来监听 8008:

[apache_*]
env.url   http://127.0.0.1:%d/server-status?auto
env.ports 8008

然后我在 VCL 的 vcl_recv 部分顶部添加了以下行:

if (req.url ~ "^/server-status") {
error 403;
}

这将阻止对端口 80 上的服务器状态 URL 的访问,并显示 403 禁止消息,但 munin-node 仍然可以连接到 localhost:8008 上的服务器状态

这篇文章很有帮助:http://nwlinux.com/how-to-configure-varnish-on-ubuntu-server/

相关内容