我想以 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 端使用指令。
答案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 端口或两者,也可以正常工作。