
Pesquisei no serverfault, mas não consegui encontrar uma resposta para isso. Talvez eu simplesmente não saiba a palavra-chave certa ou seja um mal-entendido conceitual. Qualquer ajuda seria apreciada!
A situação:
- Meus serviços locais estão sendo executados por trás de um proxy reverso NGINX
- Eu uso umDNS da LAN no roteador (Draytek)para resolver solicitações locais para *.example.com diretamente para meu servidor local (192.168.1.2).
Mesmo que não haja conexão com a internet, os domínios serão resolvidos para o servidor local e todos os serviços estarão acessíveis. É por isso que uso o DNS da LAN. Até agora tudo bem.
Agora quero permitir que apenas clientes locais acessem determinados serviços usando oMódulo de acesso NGINXcom:
allow 192.168.1.0/24;
deny all;
Mas o NGINX vê apenas o IP público do roteador em vez do IP do cliente (192.168.1.100) e então toda solicitação é recusada:
[...] access forbidden by rule, client: 123.123.123.123, server: service.example.de, request: [...]"
Minha pergunta é:
Como posso distinguir entre clientes locais e remotos no NGINX neste cenário?
Responder1
Primeiro, uma suposição/condição, que é verificar se o seu roteador adiciona oX-encaminhado paracabeçalho ou algo semelhante (mantém rastreamento do IP real do cliente)
Você deve resolver o IP do cliente primeiro, atravésngx_http_realip_module
O exemplo de configuração fornecido lá:
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 192.168.2.1;
set_real_ip_from 2001:0db8::/32;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
Com isso, o IP utilizado para verificações de acesso deverá ser o correto (cliente real).
Uma ressalva é que com tal configuração, as tentativas de adicionar o roteador ao cabeçalho X-Forwarded-For não podem ser feitasautomaticamentecom proxy_add_x_forwarded_for, pois o IP adicionado através terá sido alterado pela diretiva anterior. Esse caso específico foi discutidono estouro de pilha