IPs remotos com HAProxy

19

Estou testando uma nova configuração de servidor da web que está tendo 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 apache protegidos por alguns IPs (nosso escritório, etc.).

No entanto, acabamos de colocar isso por trás do ha_proxy para que possamos adicionar mais alguns servidores de aplicativos, mas agora o IP remoto está sempre aparecendo como o proxy proxy, não como o usuário remoto real. Isso significa que não podemos chegar a alguns locais, e nosso aplicativo está se comportando de maneira um tanto estranha em que 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
Neil Middleton
fonte

Respostas:

31

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

- se o aplicativo precisar registrar o IP do cliente original, use o
  "forwardfor" que adicionará um cabeçalho "X-Forwarded-For" com o
  endereço IP do cliente original. Você também deve usar "httpclose" para garantir
  que você reescreva todos os pedidos e não apenas o primeiro de cada
  sessão:
        opção httpclose
        opção forwardfor

É declarado 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

O Haproxy 1.4 introduziu um novo modo com a "opção http-server-close". Ele ainda fechou a conexão com o servidor, mas mantém keep-alive para o cliente, se possível e usado. Na maioria das configurações, você provavelmente deseja usá-lo, pois ajuda na latência na parte de alta latência da sua conexão (entre o Haproxy e o cliente).

   option http-server-close
   option forwardfor
Maxwell
fonte
2
Melhor uso option forwardfor header X-Real-IPe reqidel ^X-Real-IP:isso deixa de falsificar IPs em seus logs. FYI: X-Real-IPé o cabeçalho padrão NginXda opção ' set_real_ip_from.
Tino
A pergunta não menciona nginx. X-Real-IP não funcionaria.
Rick Fletcher
1. essas duas opções precisam ser definidas na seção de configuração de front-end ou back-end? (Como eles parecem não funcionar aqui) 2. É necessário algum tipo de configuração no nível do Tomcat?
Yglodt 6/04
6

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

Há uma postagem no blog aqui: http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/

Algumas notas:

O mais recente kernel do linux (2.6.28-11-server) inclui suporte ao TProxy, portanto, não é necessário recompilar o kernel.

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

Geoff Dalgas
fonte
2

Use o módulo rpaf apache http://stderr.net/apache/rpaf/ Eu sei que esse é um post antigo, mas levei alguns dias para encontrá-lo. Isso apresentará a qualquer aplicativo o ip x-forwarded-for.

Shaggy63
fonte
1

Observe que você pode substituir o que o aplicativo vê alterando 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 no acesso ao Apache via "Permitir de" etc.

Neil Middleton
fonte
Isso pode causar resultados imprevisíveis se o cliente enviar um X-Forwarded-Forcabeçalho existente à medida que o novo endereço IP for adicionado ao final da lista existente, separado por vírgula e espaço. Altere (.*)para ([^ ]*)$para obter apenas o último IP ... ou use mod_rpafou mod_remoteippara o Apache 2.4 ou posterior.
Ladadadada
1

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

Uma solução pode ser, se o seu único problema for com um servidor web, procurar no cabeçalho HTTP encaminhado por X, que deve conter o endereço do cliente. Agora, isso é praticamente específico do aplicativo / idioma, mas dê uma olhada neste exemplo no php:

$headers = apache_request_headers();

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

Se você também deseja registrar o endereço original, pode modificar o LogFormat no httpd.conf para algo parecido com isto:

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

Thiagodrv
fonte
errado, você pode com a opção "forwardfor"
wittwerch
Sim, e esta opção é ativada por padrão, mas o que faz é definir o cabeçalho HTTP X-Forwarded-For. O que eu estava dizendo, e parece-me que é o que o consulente estava realmente pedindo, era sobre o endereço de origem real do pacote IP
Thiagodrv
0

Bem, parece que o X-Forwarded-for não funciona bem para a sua configuração. Então, existe algum motivo especial para você ficar com haproxy? Parece que o IPVS é mais adequado às suas necessidades (na verdade, uso o ldirector, que por sua vez usa o ipvs).

Dê uma olhada em:

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

e

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

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

Thiagodrv
fonte
0

Tente mod_extract_forwarded em http://www.openinfo.co.uk/apache/

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEFOrder refuse,accept
MEFRefuse all
MEFAccept xxx.xxx.xxx.xxx

fonte
-1

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

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

haproxy.conf:

.

.

listen ssl 0.0.0.0:443

modo tcp

balance leastconn

opção httpchk GET / ping

opção log-health-checks

servidor w1 192.168.1.1:443 send-proxy check check-ssl

servidor w2 192.168.1.1:443 send-proxy check check-ssl

.

.

O Nginx precisa de suporte ao protocolo proxy

nginx.conf:

.

.

escute 192.168.1.1:443 ssl proxy_protocol;

.

.

set_real_ip_de 192.168.1.0/24;

real_ip_header proxy_protocol;

.

.

Emilio Joel Gomez, Macias
fonte