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 / 问题 / 392033
Accepted
Ronnie Jespersen
Ronnie Jespersen
Asked: 2012-05-24 13:42:01 +0800 CST2012-05-24 13:42:01 +0800 CST 2012-05-24 13:42:01 +0800 CST

Varnish client.ip 说 127.0.0.1

  • 772

所以我有一个像 Nginx -> varnish -> apache2 这样的设置如果我收到一个带有静态文件的请求,它会通过 nginx 发送到 varnish 然后再次返回到 nginx,因为它比让 apache2 服务器快得多。我的问题是当我做一个

sub vcl_fetch {
    set beresp.http.X-Tabulex-Client = client.ip;

查看客户端 ip 地址是什么我被告知它的 127.0.0.1 (X-Tabulex-Client 127.0.0.1) 在 vcl_recv 我有:

sub vcl_recv {
    if ((!req.url ~"^/typo3temp/*" && !req.url ~"^/typo3/*") &&req.url ~"\.(jpg|css|gif|png|js)(\?.*|)$"){
        set req.backend = aurum;
        set client.identity = req.http.X - Forwarded - For;
    } elseif(client.ip == "192.168.3.189") {
        /* Traffic from the other Varnish server, serve using real backends */
        set req.backend = balance;
        /* Set client.identity to the X-Forwarded-For (the real IP) */
        set client.identity = req.http.X - Forwarded - For;
    } else{
        /* Traffic coming from internet, use the other Varnish as backend */
        set req.backend = iridium;
    }
}

nginx 配置包含

proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_intercept_errors on;

第一次发送到清漆时,再次从清漆接收时什么也没有。

我不确定问题出在哪里。我希望 client.ip 包含外部 ip 地址,以便我可以将它用于 acl。有任何想法吗?

ubuntu apache-2.2 nginx varnish x-forwarded-for
  • 3 3 个回答
  • 4918 Views

3 个回答

  • Voted
  1. Best Answer
    larsks
    2012-05-24T17:40:37+08:002012-05-24T17:40:37+08:00

    的价值client.ip是127.0.0.1因为nginx是客户。Varnish 掩盖这个值是没有意义的——即使在像您这样的情况下,Varnish 位于前端代理后面,您通常希望根据实际连接到 Varnish 的东西的 IP 地址做出决定。

    您真正想要做的是nginx将远程客户端 ip 地址放入专用标头(您已经在X-Real-IP使用它)并使用它来做出连接决策。我们在 Apache 前面提供 SSL 连接的环境中正是这样做的varnish,然后我们使用此标头做出访问决策。

    它不如 using 好用client.ip(你不能用acls 来匹配它),但它确实有效。我们做这样的事情:

    if (! (
            req.http.X-Real-IP ~ "^10\." ||
            req.http.X-Real-IP ~ "^100\.100\." ||
            req.http.X-Real-IP ~ "^200\.200\."
    )) {
            error 403 "Forbidden";
    }
    

    Varnish 不提供client.ip用自定义标头覆盖的本机机制,但无论如何都可以解决问题,因为您可以将任意 C 代码插入到您的配置中。

    这是一个与您的情况完全相似的示例,其中包括一个替换client.ip为另一个值的示例,以便它可以在 Varnish ACL 中使用。

    • 3
  2. Brendan
    2013-01-29T13:26:38+08:002013-01-29T13:26:38+08:00

    如果您使用 Varnish 作为 Rackspace Cloud Load Balancer 后面的前端网络服务器(我们的后端是 NGINX),那么您需要使用如下模式:

    if (!(
        req.http.X-Forwarded-For ~ "1\.2\.3\.4" || 
        req.http.X-Forwarded-For ~ "2\.3\.4\.5" 
        )) {
        # IP-based Rules
    }
    

    Rackspace Cloud Load Balancer 除了127.0.0.1将client.ip. 另外,我尝试使用更具限制性的模式,^2\.3\.4\.5$但它不匹配。我认为负载平衡器正在向标头添加额外的字符X-Forwarded-For。

    • 1
  3. Paul
    2017-07-14T15:01:30+08:002017-07-14T15:01:30+08:00

    如果 req.http.X-Real-IP 在您的请求中可用,那么您可以使用 std 模块的函数 ip() 将字符串(如 req.http.X-Real-IP)转换为 IP 类型,然后使用 ~ 运算符将其与 ACL 列表进行比较。这比使用某些 IP 字符串比较 multipe 时间更有效。 acl aclRestricted { "1.1.1.1"; "2.2.2.2"; } if (std.ip(req.http.X-Real-IP, "0.0.0.0") ~ aclRestricted ) { ... }

    参考 Varnish V4.1:https ://varnish-cache.org/docs/4.1/reference/vmod_std.generated.html#func-ip

    • 1

相关问题

  • 在 Ubuntu 上设置电子邮件服务器

  • 在 Linux Xen VPS 上优化 Apache 和 MySQL

  • mod_rewrite 不转发 GET 参数

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

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