IP remoto com HAProxy

19

Estou testando uma nova configuração de servidor da Web que está com alguns problemas. Essencialmente, temos um servidor web, onde o código usa o IP remoto para algumas coisas interessantes, e também alguns diretórios do Apache garantidos para alguns IP's (nosso escritório, etc).

No entanto, acabamos de lançar isso atrás do ha_proxy para podermos adicionar mais alguns servidores de aplicativos, mas agora o IP remoto está sempre chegando como o proxy ip, não o usuário remoto real. Isso significa que não podemos chegar a alguns locais, e nosso aplicativo está se comportando de maneira estranha onde o IP do usuário é importante.

Nossa configuração é a seguinte:

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
    
por Neil Middleton 23.06.2009 / 16:00

8 respostas

31

Citado no documento HAProxy em haproxy.1wt.eu .

- if the application needs to log the original client's IP, use the
  "forwardfor" option which will add an "X-Forwarded-For" header with the
  original client's IP address. You must also use "httpclose" to ensure
  that you will rewrite every requests and not only the first one of each
  session:
        option httpclose
        option forwardfor

Afirma-se que o aplicativo deve tratar o cabeçalho HTTP X-Forwarded-For para conhecer o endereço IP do cliente. Parece ser o único caminho a seguir no seu caso.

Atualizado para o HAProxy 1.4

Haproxy 1.4 introduced a new mode with "option http-server-close". It still closed the connection to the server but maintains keep-alive towards the client if possible and used. On most setups, you probably want to use that as it helps with latency on the single high-latency part of your connection (between Haproxy and the client).

   option http-server-close
   option forwardfor
    
por 23.06.2009 / 16:32
6

Existe uma maneira de recompilar o HAproxy para incluir o Tproxy, que permitirá o encaminhamento do endereço de origem.

Há uma postagem no blog sobre isso: link

Algumas notas:

O último kernel linux (2.6.28-11-server) inclui suporte para TProxy, então não é necessário recompilar o kernel.

Certifique-se de configurar os servidores em seu farm da Web com um endereço de gateway padrão que aponte para o servidor HAProxy.

    
por 05.09.2009 / 07:16
2

Use o link do módulo apache do rpaf Eu sei que este é um post antigo, mas levei dias para encontrar isso. Isto irá apresentar a qualquer aplicação o ip x-forwarded-for.

    
por 29.01.2011 / 17:06
1

Note que parece que você pode sobrescrever o que o aplicativo vê quando muda os cabeçalhos do Apache:

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

No entanto, isso não funciona para o acesso do Apache via "Permitir de", etc.

    
por 23.06.2009 / 16:19
1

O HAProxy, por padrão, não pode encaminhar o endereço IP original para o servidor real, praticamente como qualquer outro proxy.

Uma solução pode ser, se o seu único problema for com um servidor web, olhar para o cabeçalho HTTP X-forwarded-for, que deve conter o endereço do cliente. Agora, isso é praticamente específico de aplicativo / linguagem, mas dê uma olhada neste exemplo em php:

$headers = apache_request_headers();

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

Se você também quiser registrar o endereço original, você pode modificar o LogFormat em httpd.conf para se parecer com isto:

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

    
por 23.06.2009 / 16:26
0

Bem, parece que o X-Forwarded-for não funciona bem na sua configuração. Então, há alguma razão especial para você ficar com haproxy? Parece que o IPVS é mais apropriado para as suas necessidades (na verdade eu uso o ldirector, que por sua vez usa o ipvs).

Dê uma olhada:

link

e

link

O uso do IPVS no modo 'IP Tunneling' ou 'Direct Routing' preserva o endereço do cliente.

    
por 23.06.2009 / 16:36
0

Experimente mod_extract_forwarded no link

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEFOrder refuse,accept
MEFRefuse all
MEFAccept xxx.xxx.xxx.xxx
    
por 29.10.2009 / 15:48
-1

Maneira fácil com o haproxy no modo tcp e nginx:

adicione o send-proxy como opção do servidor:

haproxy.conf:

.

.

listen ssl 0.0.0.0:443

modo tcp

balancear o limite

opção httpchk GET / ping

opção log-health-checks

servidor w1 192.168.1.1:443 verificação de envio de proxy check-ssl verify none

servidor w2 192.168.1.1:443 verificação de envio de proxy check-ssl verify none

.

.

O Nginx precisa de um protocolo de proxy de suporte

nginx.conf:

.

.

escute 192.168.1.1:443 ssl proxy_protocol;

.

.

set_real_ip_from 192.168.1.0/24;

real_ip_header proxy_protocol;

.

.

    
por 20.01.2016 / 18:01

Tags