O Nginx encaminha o tráfego não designado para um subdomínio aparentemente arbitrário

1

O problema

Eu tenho um servidor nginx que atende três subdomínios - por exemplo, a.example.com , b.example.com e c.example.com .

Os arquivos de configuração são a.example.com.conf , b.example.com.conf e c.example.com.conf , respectivamente. Eles são armazenados em /etc/nginx/sites-available e com link de /etc/nginx/sites-enabled .

Nos arquivos de configuração, cada cláusula server tem sua diretiva server_name apropriada. Se for importante, todos os três subdomínios usam os mesmos problemas de certificado SSL por meio do Let's Encrypt (o que funciona bem).

Quando b.example.com.conf é removido de sites-enabled , espero uma mensagem de erro ao tentar navegar até ele. Surpreendentemente, o nginx redireciona o tráfego para a.example.com . Na verdade, todas as conexões de entrada sem um nome de servidor correspondente em /etc/nginx/sites-enabled - incluindo apenas o IP da máquina - são roteadas para a.example.com .

Como configurar o nginx para tornar a diretiva server exclusiva, para que as solicitações para b.example.com nunca sejam atendidas por a.example.com ?

Configuração

a.example.com.conf

server {
    listen 443 ssl;
    server_name a.example.com;

    ssl_certificate     /etc/letsencrypt/live/a.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
    }
}

b.example.com.conf

server {
    listen 443 ssl;
    server_name b.example.com;

    # I'm using a multi-domain certificate called 'a.example.com', which is
    # serving a.example.com, b.example.com and c.example.com - not an error

    ssl_certificate     /etc/letsencrypt/live/a.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8090;
    }
}

Solução temporária

Eu criei um servidor padrão que captura todas as solicitações padrão e retorna o erro 404. No entanto, eu gostaria de ter uma solução mais holística impedindo que solicitações de qualquer servidor servidas por outro servidor.

server {
    listen       443  default_server;
    server_name  _;
    return       404;

    ssl_certificate     /etc/letsencrypt/live/a.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/a.example.com/privkey.pem;
}
    
por Adam Matan 06.03.2016 / 11:41

1 resposta

5

De nginx documentação :

In this configuration nginx tests only the request’s header field “Host” to determine which server the request should be routed to. If its value does not match any server name, or the request does not contain this header field at all, then nginx will route the request to the default server for this port. In the configuration above, the default server is the first one — which is nginx’s standard default behaviour.

Assim, sua solução temporária parece ser a solução certa.

    
por 06.03.2016 / 12:42

Tags