web-dev-qa-db-ja.com

TCPモードでHaproxyからNginxにクライアントのIPアドレスを転送する方法

実際のクライアントのIPアドレスをhaproxyからtcpモードのバックエンドサーバーに転送したい。 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終了のreverse_proxyとして使用し、リクエストをApacheバックエンドに送信します。私の問題は、nginxログで実際のクライアントのIPアドレスを取得する方法がわからないことです。私はたくさんググって、serverfaultとstackoverflowでいくつかの解決策を見つけましたが、haproxyのtcpモードでクライアントのIPアドレスを転送する際の私の問題を解決するものはありませんでした。どんな助けでもありがたいです。

2
Sinai

Nginx側ではlisten 443 ssl proxy_protocol;を、Haproxy側ではsend_proxyディレクティブを使用する必要があります。

Nginxでプロキシプロトコルを使用

Haproxyのドキュメント

HAProxyからPROXYプロトコルヘッダーを送信

5
Fedor Dikarev

私の作業構成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ポート、あるいはその両方を使用しても機能します。

3
Tomas Pytel