如何在TCP模式下将客户端的IP地址从Haproxy转发到Nginx

如何在TCP模式下将客户端的IP地址从Haproxy转发到Nginx

我想以 tcp 模式将真实客户端的 ip 地址从 haproxy 转发到我的后端服务器。Haproxy 的配置如下:

frontend main
    bind *:80
    mode http
    option forwardfor
    option http-server-close    
    default_backend app-main

frontend https_main
    bind *:443
    mode tcp
    option tcplog
    option tcpka
    default_backend app-ssl

backend app-main
    balance roundrobin
    server web1 192.168.1.22:8080 check fall 3 rise 2
    server web2 192.168.1.33:8080 check fall 3 rise 2

backend app-ssl
    balance roundrobin
    mode tcp
    option ssl-hello-chk
    server web3 192.168.1.44:443

http 请求的后端服务器是 apache,我已经用日志行替换了 httpd.conf 中的以下行,因此我现在可以正确获取客户端的 ip 地址:

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

我的 https 后端服务器使用 Nginx 作为 SSL 终止的反向代理,并将请求发送到 apache 后端。我的问题是我不知道如何在 nginx 日志中获取真实客户端的 IP 地址?我在 Google 上搜索了很多,并在 serverfault 和 stackoverflow 上找到了一些解决方案,但它们都没有解决我在 haproxy 中以 tcp 模式转发客户端 IP 地址的问题。任何帮助都非常感谢。

答案1

您应该listen 443 ssl proxy_protocol;在 nginx 端使用,并send_proxy在 Haproxy 端使用指令。

使用 Nginx 的代理协议

Haproxy 文档

从 HAProxy 发送 PROXY 协议标头

答案2

我的工作配置 HA 端:

# USED FOR some_service
frontend  some_service_https
  mode tcp
  bind *:443
  option tcplog
  option forwardfor
  default_backend some_service_https

backend some_service_https
  balance roundrobin
  stick-table type ip size 1m expire 1h
  stick on src
  server some_service 192.168.1.2:443 send-proxy check

NGINX 端:

set_real_ip_from 192.168.1.1; # HAproxy local IP
set_real_ip_from 183.55.111.30; # HAproxy external IP
real_ip_header proxy_protocol; # proxy_protocol needed
real_ip_recursive on;

upstream some_service {
  server unix:/tmp/unicorn.some_service.sock fail_timeout=0;
}

server {
  server_name some_service.myserver.com some_service_1.myserver.com;
  listen 443 proxy_protocol; # proxy_protocol needed
  root /opt/apps/some_service/current/public;
  add_header X-Whom some_service_1.myserver.com;

不要忘记在 HA 后端和 real_ip_header proxy_protocol 上添加“send-proxy”,并将 proxy_protocol 监听到 NGINX。即使您使用 80 或 443 端口或两者,也可以正常工作。

相关内容