Como usar uma lista de permissões Nginx por DNS dinâmico em vez de endereço IP?

Como usar uma lista de permissões Nginx por DNS dinâmico em vez de endereço IP?

Estou executando um servidor web Nginx no Ubuntu 20.04. Em meu arquivo de configuração de host virtual, defini uma diretiva de permissão/negação para bloquear todos os IPs, exceto o IP especificado, de acessar um URL. Minha configuração de host virtual é assim:

server {
    # Restrict access to LAN & Personal IP's
    allow 127.0.0.1; # LoopBack IP Address
    allow 192.168.1.0/24; # LAN IP Address
    allow 123.456.789.102/32; # Home Public IP Address
    allow 111.222.333.444/32; # Work Dynamic IP Address
    deny all;
    error_page 403 =444;
...

O problema com isso é que meus "Endereços IP dinâmicos de trabalho" são de fato dinâmicos e mudam com frequência. Então, por alguns dias, poderei acessar a página da web a partir do meu endereço IP de trabalho 111.222.333.444/32. Mas então, quando o endereço IP dinâmico do trabalho muda para 555.777.888.999/32, não consigo mais acessar a página da Web do trabalho, pois o endereço IP público do meu trabalho foi alterado.

A partir de agora, configurei meu endereço IP comercial com um provedor de DNS dinâmico. Portanto, meu endereço DNS dinâmico para trabalho é dansworkip.ddnsfree.com. Eu gostaria de incorporar um endereço de host DNS dinâmico na lista de permissões do Nginx para que, quando o endereço IP público do meu trabalho mudar, o Nginx procure o novo endereço IP do domínio dansworkip.ddnsfree.come o coloque na diretiva de permissão.

Eu tentei algo assim:

server {
    # Restrict access to LAN & Personal IP's
    allow 127.0.0.1; # LoopBack IP Address
    allow 192.168.1.0/24; # LAN IP Address
    allow 123.456.789.102/32; # Home Public IP Address
    allow dansworkip.ddnsfree.com; # Work Dynamic IP Address
    deny all;
    error_page 403 =444;
...

Mas quando tento esta configuração, o Nginx não inicia e recebo os seguintes erros no meu log do Nginx:

[emerg] 10269#10269: invalid parameter "dansworkip.ddnsfree.com" in /etc/nginx/conf.d/www.mysite.com

Minhas perguntas são: como posso incorporar o DNS dinâmico no Nginx para que o Nginx procure o endereço IP do domínio permitido e coloque na lista de permissões o endereço IP do meu nome de host DNS dinâmico?

Responder1

Usar um endereço IP como token de autenticação é comumente considerado uma prática inadequada. O Nginx não tem funcionalidade para conseguir o que você pede. Se eu realmente tivesse que encontrar uma solução para o problema que você colocou, então eu escolheria a solução de Alexey proposta nos comentários, no entanto, o Nginx tem um recurso de autenticação/autorização muito útil que permite que vocêentregar a decisãopara uma página web de sua escolha/design.

Lá você pode usar quaisquer regras/mecanismos de autenticação que você possa codificar. Você pode usar dados de sessão (se sua escolha de ferramentas suportar isso), mas considere se algum identificador de sessão pode entrar em conflito com aquele implementado pelo aplicativo para o qual você está fornecendo um gateway.

por exemplo, em PHP,

<?php
$ipdir="/var/www/access";
$TTL=600;

function deny_access() 
{
   header('HTTP/1.0 403 Forbidden');
   exit;
}

function permit_access()
{
   print "";
   exit;
}

function refresh_config()
{
   // replace files in "/allow", delete aged files from "/deny"
   // then update timestamp on control file.
   // Implementation left as an exercise for the reader
}

if (time() - filemtime($ipdir . "/control.file") > $TTL) {
    refresh_config();
} 
if (file_exists($ipdir . "/deny", $_SERVER['REMOTE_ADDR'])) {
    deny_access();
} else if (file_exists($ipdir . "/allow", $_SERVER['REMOTE_ADDR'])) {
    permit_access();
} else {

}

Uma abordagem alternativa (que pode ser mais eficiente com base em múltiplos fatores, mas restrita a endereços IP) é mantera pesquisa no próprio nginx- com a manutenção da lista externa.

informação relacionada