AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 442041
Accepted
jetboy
jetboy
Asked: 2012-10-25 14:41:23 +0800 CST2012-10-25 14:41:23 +0800 CST 2012-10-25 14:41:23 +0800 CST

使用 Nginx/Varnish/Apache 记录客户端 IP

  • 772

我让 Nginx 作为 SSL 终结器侦听端口 443,并将未加密的流量代理到同一台服务器上的 Varnish。Varnish 3 正在处理此流量,并且流量直接通过端口 80 进入。所有流量都未加密地传递到集群中其他服务器上的 Apache 实例。Apache 实例使用 mod_rpaf 将记录的客户端 IP 替换为 X-Forwarded-For 标头的内容。

我的问题是,如果流量来自 Nginx,而“正确的”客户端 IP 被记录在 VarnishNCSA 日志中,看起来 Varnish 正在(可以理解地)用 127.0.0.1 下游替换 Nginx 的 X-Forwarded-For 标头,这是用 Apache 记录的。如果 X-Forwarded-For 已经填充,是否有一种很好的简单方法来阻止 Varnish 重写 X-Forwarded-For?

apache-2.2
  • 1 1 个回答
  • 4133 Views

1 个回答

  • Voted
  1. Best Answer
    Shane Madden
    2012-10-25T16:57:50+08:002012-10-25T16:57:50+08:00

    绝对地; 的 Varnish 处理X-Forwarded-For实际上只是在默认vcl_recv函数中定义。

    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;
        }
    }
    

    函数的默认定义始终附加到您在活动 VCL 文件中定义的函数,但如果您定义的函数始终处理请求,则默认逻辑将永远不会执行。

    vcl_recv沿着这些线设置一个:

    sub vcl_recv {
        /* Your existing logic goes here */
        /* After that, we'll insert the default logic, with the X-Forwarded-For handling removed */
        /* The return (lookup); at the end ensures that the default append behavior won't have an impact */
    
        if (req.request != "GET" &&
          req.request != "HEAD" &&
          req.request != "PUT" &&
          req.request != "POST" &&
          req.request != "TRACE" &&
          req.request != "OPTIONS" &&
          req.request != "DELETE") {
            /* Non-RFC2616 or CONNECT which is weird. */
            return (pipe);
        }
        if (req.request != "GET" && req.request != "HEAD") {
            /* We only deal with GET and HEAD by default */
            return (pass);
        }
        if (req.http.Authorization || req.http.Cookie) {
            /* Not cacheable by default */
            return (pass);
        }
        return (lookup);
    }
    

    编辑:

    由于 Varnish 也直接处理某些连接,因此更好的方法可能是让它有选择地设置标头。您仍然需要包含完整的vcl_recv内容,以便默认不应用自己的标题,但将其包含在顶部:

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

相关问题

  • Apache Django Mod_Wsgi - 自动重新加载应用程序

  • Apache:对多个虚拟主机使用相同的目录指令

  • Apache 上的子域不工作 - 找不到服务器

  • PHP 作为 CGI 还是 Apache 模块?

  • 避免将某些丢失的文件记录到 Apache2 错误日志中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve