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.