nginx IP errado ao verificar o limite de conexões

2

Muitas vezes aparece a seguinte linha no log de erros do nginx. Isso está causando o erro 50x que aparece para os visitantes do site. Temos um site multilíngüe com URL language.example.com

[error] 25720#0: *2716 limiting connections by zone "slimits", client: 127.0.0.1, server: localhost, request: .......

O cliente está sempre aparecendo como 127.0.0.1, o que é bastante suspeito.

Existe um balanceamento de carga que usa o host local e também outro servidor. A configuração nginx upstream:

upstream example.com {
    server 127.0.0.1:8082 weight=3 max_fails=3 fail_timeout=2;
    server otherserver.example.net:8082 max_fails=3 fail_timeout=2;
}

O valor slimit agora está definido para 40

limit_conn slimits 40;

Até onde eu sei, esse limite deve ser o limite de conexões que um usuário REMOTE deve ser capaz de abrir. Eu acho que o endereço IP do usuário remoto não é passado corretamente para o nginx abaixo da linha.

E esta é a definição de sites:

server {
    listen   80 default_server;
    server_name localhost;

    allow   all;
}


server {
    listen   80;
    server_name *.example.com;    
    # stop   subdomains like  everything.example.com
    deny all;
}
server {
    listen   80;
    server_name server.com www.example.com;
    location / {
        proxy_pass   http://example.com;
    }
}
server {
    listen   80;
    server_name fr.example.com;
    location / {
        proxy_pass   http://fr.example.com;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

A versão do Nginx é: 1.0.12.

    
por dawez 23.05.2013 / 11:30

1 resposta

0

O OP declarou em comente que essa configuração resolveu o problema errado de IP.

real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0; 

No entanto, o set_real_ip_from 0.0.0.0/0 pode ser problemático no futuro. Basicamente, o nginx confia em todos os hosts da Internet para obter o endereço IP real via X-Forwarded-For header, mesmo a partir do pedido falsificado. Por exemplo, (crédito para este tópico ):

curl --header "X-Forwarded-For: 1.2.3.4" "http://localhost/"

A solicitação acima foi gerada por meio de curl do localhost, não do balanceador de carga nginx.

Por enquanto o problema de spoofing foi um pouco difícil porque o servidor só fica em 127.0.0.1, mas pode ser uma precaução de segurança.

Portanto, alteramos para que o nginx confie apenas no X-Forwarded-For do endereço IP do balanceador de carga 127.0.0.1

real_ip_header X-Forwarded-For;
set_real_ip_from 127.0.0.1; 
    
por 16.12.2014 / 00:12