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 / 问题 / 30311
Accepted
Neil Middleton
Neil Middleton
Asked: 2009-06-24 06:00:52 +0800 CST2009-06-24 06:00:52 +0800 CST 2009-06-24 06:00:52 +0800 CST

带有 HAProxy 的远程 IP

  • 772

我正在测试一个新的 Web 服务器设置,它有几个问题。本质上,我们有一个 Web 服务器,其中代码使用远程 IP 来处理一些有趣的事情,还有一些 apache 目录保护到某些特定 IP(我们的办公室等)。

然而,我们刚刚把它抛在了 ha_proxy 后面,所以我们可以考虑添加更多的应用程序服务器,但现在远程 IP 总是作为代理 ip 通过,而不是真正的远程用户。这意味着我们无法到达某些位置,并且我们的应用在用户 IP 很重要的地方表现得有些奇怪。

我们的配置如下:

global
      maxconn 4096
      pidfile /var/run/haproxy.pid
      daemon

defaults
      mode http
      retries 3
      option redispatch
      maxconn 2000
      contimeout 5000
      clitimeout 50000
      srvtimeout 50000

listen farm xxx.xxx.xxx.xxx:80
      mode http
      cookie GALAXY insert
      balance roundrobin
      option httpclose
      option forwardfor
      stats enable
      stats auth username:userpass

      server app1 xxx.xxx.xxx.xxx:80 maxconn 1 check
haproxy
  • 8 8 个回答
  • 57277 Views

8 个回答

  • Voted
  1. Best Answer
    Maxwell
    2009-06-24T06:32:13+08:002009-06-24T06:32:13+08:00

    引用自haproxy.1wt.eu的 HAProxy 文档。

    - 如果应用程序需要记录原始客户端的 IP,请使用
      “forwardfor”选项将添加一个“X-Forwarded-For”标题
      原始客户端的 IP 地址。您还必须使用“httpclose”来确保
      您将重写每个请求,而不仅仅是每个请求的第一个
      会议:
            选项 httpclose
            期权转发
    

    据说应用程序必须处理 X-Forwarded-For HTTP Header 才能知道客户端 IP 地址。在你的情况下,这似乎是唯一的方法。

    为 HAProxy 1.4 更新

    Haproxy 1.4 引入了一种带有“选项 http-server-close”的新模式。它仍然关闭与服务器的连接,但如果可能并使用它,则保持对客户端的连接。在大多数设置中,您可能希望使用它,因为它有助于减少连接的单个高延迟部分(Haproxy 和客户端之间)的延迟。

       option http-server-close
       option forwardfor
    
    • 33
  2. Geoff Dalgas
    2009-09-05T21:16:00+08:002009-09-05T21:16:00+08:00

    有一种方法可以重新编译 HAproxy 以包含 Tproxy,这将允许转发源地址。

    这里有一篇关于它的博客文章:http: //blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

    几点注意事项:

    最新的 linux 内核 (2.6.28-11-server) 包括对 TProxy 的支持,因此不需要重新编译内核。

    确保使用指向 HAProxy 服务器的默认网关地址配置 Web 场中的服务器。

    • 6
  3. Shaggy63
    2011-01-30T08:06:59+08:002011-01-30T08:06:59+08:00

    使用 rpaf apache 模块http://stderr.net/apache/rpaf/ 我知道这是旧帖子,但我花了几天时间才找到它。这将向任何应用程序显示 x-forwarded-for ip。

    • 2
  4. Neil Middleton
    2009-06-24T06:19:47+08:002009-06-24T06:19:47+08:00

    请注意,您似乎可以覆盖应用程序看到的我更改 Apache 标头的内容:

    SetEnvIf X-Forwarded-For (.*) REMOTE_ADDR=$1
    SetEnvIf X-Forwarded-For (.*) REMOTE_IP=$1
    

    但是,这不适用于通过“允许来自”等进行的 Apache 访问。

    • 1
  5. Thiagodrv
    2009-06-24T06:26:46+08:002009-06-24T06:26:46+08:00

    根据设计,HAProxy 无法将原始 IP 地址转发到真实服务器,就像任何其他代理一样。

    如果您唯一的问题是 Web 服务器,则一种解决方案可能是查看 X-forwarded-for HTTP 标头,该标头应包含客户端的地址。现在,这几乎是特定于应用程序/语言的,但请看一下 php 中的这个示例:

    $headers = apache_request_headers();

    $real_client_ip = $headers["X-Forwarded-For"];

    如果你还想记录原始地址,你可以修改 httpd.conf 中的 LogFormat 看起来像这样:

    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common

    • 1
  6. Thiagodrv
    2009-06-24T06:36:38+08:002009-06-24T06:36:38+08:00

    好吧,X-Forwarded-for 似乎不适用于您的设置。那么,你坚持使用 haproxy 有什么特别的原因吗?似乎 IPVS 更适合您的需求(我实际上使用 ldirector,而后者又使用 ipvs)。

    看一眼:

    http://kb.linuxvirtualserver.org/wiki/IPVS

    和

    http://www.vergenet.net/linux/ldirectord/

    在“IP 隧道”或“直接路由”模式下使用 IPVS 可以保留客户端的地址。

    • 0
  7. Zart
    2009-10-30T06:48:39+08:002009-10-30T06:48:39+08:00

    从http://www.openinfo.co.uk/apache/尝试 mod_extract_forwarded

    LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
    MEFOrder refuse,accept
    MEFRefuse all
    MEFAccept xxx.xxx.xxx.xxx
    
    • 0
  8. Emilio Joel Macias Gomez
    2016-01-21T09:01:58+08:002016-01-21T09:01:58+08:00

    在 tcp 和 nginx 模式下使用 haproxy 的简单方法:

    添加 send-proxy 作为服务器选项:

    haproxy.conf:

    .

    .

    听 ssl 0.0.0.0:443

    模式 tcp

    平衡最小连接

    选项 httpchk GET /ping

    选项日志健康检查

    服务器 w1 192.168.1.1:443 发送代理检查检查 SSL 验证无

    服务器 w2 192.168.1.1:443 发送代理检查检查 SSL 验证无

    .

    .

    Nginx 需要支持代理协议

    nginx.conf:

    .

    .

    听 192.168.1.1:443 ssl proxy_protocol;

    .

    .

    set_real_ip_from 192.168.1.0/24;

    real_ip_header 代理协议;

    .

    .

    • -1

相关问题

  • SSL 网站的高可用性

Sidebar

Stats

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

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

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

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +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