Como redirecionar solicitações http para o servidor Apache local na conexão com a Internet perdida?

3

Eu tenho um pequeno servidor Linux (baseado em Ubuntu) com 2 placas de rede, que funciona como um roteador, dhcp, servidor dns, firewall, etc. Uma placa de rede está conectada à LAN, enquanto a outra está conectada ao meu ISP. . Quando o link da Internet está desativado, eu gostaria de redirecionar todas as solicitações http para o servidor Apache local, que exibiria uma pequena página da Web informando aos usuários da LAN, se a conexão LAN está OK, se o servidor está OK, somente o link ISP atualmente para baixo. Como eu faria isso?

  1. Não encontrei nenhuma maneira confiável de detectar se a conexão com a Internet está inativa, a não ser periodicamente efetuar ping de vários hosts externos que são conhecidos por estarem ativos a maior parte do tempo. (O status da interface é UP o tempo todo).

  2. Qual ferramenta devo usar para redirecionamento? Iptables? Algo mais?

por Eiver 09.12.2013 / 15:25

2 respostas

3

I found no reliable way to detect if the Internet connection is down, other than periodically pinging a bunch of external hosts that are known to be up most of the time. (The status of the interface is UP all the time).

Para saber se o seu link está ativo, envie uma solicitação de eco ICMP (também conhecida como "ping") para um host conhecido e confiável na outra extremidade do link que você está tentando testar. Geralmente este será o gateway padrão do ISP, mas existem outras possibilidades. Se você não puder usar o gateway padrão do ISP para esse teste, sugiro segmentar os servidores DNS do seu provedor de serviços de Internet; Se eles estão em baixo, as coisas são muito ruins e se você não precisa que isso seja 100% preciso, provavelmente é bom o suficiente. Lembre-se de que o IP é o melhor esforço, e o ICMP não tem a natureza e as garantias orientadas para a conexão do TCP.

Não inunde um host com pings, a menos que você tenha um acordo mútuo com o administrador do sistema remoto. Uma vez a cada 30 segundos é provavelmente o suficiente, possivelmente aumentando quando o link é detectado como baixo e diminuindo durante períodos de baixa utilização, como durante a noite. O intervalo deve ser escolhido com base na rapidez com que você deseja responder a uma situação de linkdown e com o que o administrador do servidor remoto provavelmente tolerará. Mais de um ping a cada poucos segundos é quase certamente acima do topo, e se você não precisa de uma resposta "imediata" a uma situação de link-down, não há nada que diga que você não pode testar uma vez a cada poucos minutos ou até mais raramente. / p>

What tool should I use for redirection? Iptables? Something else?

Desde que você está falando sobre colocar uma página da web quando o link está fora, eu suspeito que você está preocupado principalmente com a navegação na web. Ao navegar na web, usar endereços IP diretamente é a exceção.

Portanto, configure um resolvedor de DNS de cache local e aponte seus clientes para ele. Configure-o para encaminhar para os servidores DNS do seu provedor ou defina-o para sair e buscar respostas por conta própria com base nas dicas de raiz, isso é com você.

Quando o link falhar, troque a configuração do servidor DNS local por uma que seja autoritativa para a zona de raiz . e responda a qualquer consulta A (e possivelmente AAAA ) com o endereço IP de seu servidor da Web local e emita um comando de recarregamento da configuração. Certifique-se de que o servidor da Web local não esteja se diferenciando com base no nome do host solicitado (coloque a página da Web em questão no host virtual padrão). Você teria algo como o seguinte em uma configuração BIND que é trocada quando você detecta uma falha no link:

zone "." { type master; file "failed-connection.root.zone"; };

e, em seguida, em failed-connection.root.zone você teria:

$ORIGIN .
$TTL 10
@ SOA <your SOA record details here>
* A 192.168.9.10
* AAAA fe80:123:45::1

Certifique-se de usar um TTL curto (usei 10 segundos no exemplo acima) para evitar o cache inadvertido da resposta "falha". Além disso, certifique-se de usar endereços IP que não dependam de conectividade externa. (Estritamente falando, o fe80 :: / 16 é obsoleto, mas é bom o suficiente para fins ilustrativos.) O script "link down detectado" também pode precisar liberar o cache do servidor DNS. Além disso, certifique-se de que isso não vaze na Internet. No BIND 9, faça bons amigos com o recurso de visualizações; com outro software, investigue alternativas antes de fazer algo assim ao vivo.

Quando você detectar o link voltando, apenas coloque de volta o arquivo de configuração original do BIND (ou outro servidor DNS) e emita outro comando de recarregamento da configuração e, possivelmente, faça o cache do flush.

Você pode usar, por exemplo, iptables com reescrita de endereço de pré-roteamento, mas você correria o risco de precisar de algo que possa lidar basicamente com qualquer coisa que alguém queira lançar em qualquer coisa na Internet, por utilidade adicional marginal. Para mim, fazer assim não parece valer a pena.

    
por 09.12.2013 / 16:00
0

Como você diz que tem um "pequeno" servidor, presumo que o volume de tráfego seja baixo o suficiente para ser manipulado por um proxy HTTP, como o Squid. Se você configurar o roteador como um proxy transparente (também conhecido como proxy de intercepção ), os clientes devem ter uma experiência normal na Internet até que a conexão com a Internet falhe. Então, eu esperaria que os clientes obtivessem respostas HTTP 504 (Tempo limite do gateway).

Se a sua conexão com a Internet não for confiável, você pode considerar um benefício secundário que as páginas que estão no cache do proxy HTTP ainda possam estar disponíveis para os clientes durante a interrupção.

    
por 09.12.2013 / 23:33