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
option forwardfor header X-Real-IP
ereqidel ^X-Real-IP:
isso deixa de falsificar IPs em seus logs. FYI:X-Real-IP
é o cabeçalho padrãoNginX
da opção 'set_real_ip_from
.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.
fonte
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.
fonte
Observe que você pode substituir o que o aplicativo vê alterando os cabeçalhos do Apache:
No entanto, isso não funciona no acesso ao Apache via "Permitir de" etc.
fonte
X-Forwarded-For
cabeç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 usemod_rpaf
oumod_remoteip
para o Apache 2.4 ou posterior.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
fonte
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.
fonte
Tente mod_extract_forwarded em http://www.openinfo.co.uk/apache/
fonte
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;
.
.
fonte