Converta um intervalo de IP do primeiro ao último endereço em rotas VPN exatas
Um intervalo do primeiro ao último endereço raramente cabe num único prefixo. Converta-o em blocos CIDR exatos para que uma rota não capture destinos fora do intervalo.
Alguém entrega um primeiro e um último endereço e pede uma rota VPN. O movimento tentador é escolher o prefixo mais curto que contém as duas pontas, e esse movimento acrescenta silenciosamente destinos que ninguém pediu. Um bloco CIDR tem sempre um tamanho potência de dois e um endereço inicial alinhado a ele, então um intervalo arbitrário normalmente precisa de mais de um. Percorra o intervalo, divida-o exatamente e depois verifique os endereços logo fora dele.
Comece pelo intervalo, não pelo prefixo
Anote o primeiro endereço e o último antes de escrever qualquer outra coisa. O par é o requisito; um prefixo é apenas uma expressão possível dele, e às vezes uma errada. Dois números também são muito mais fáceis de conferir do que uma máscara.
Um intervalo alinhado reduz-se a um único bloco. Um desalinhado decompõe-se em vários, e a decomposição é exata e não aproximada. O que não deve fazer é arredondar para fora e considerá-lo suficientemente próximo, porque os endereços extras recebem a política que a rota carrega.
As duas direções do erro importam. Para uma rota para o túnel, endereços extras são puxados para a VPN. Para uma exceção de bypass, endereços extras a ignoram. Nenhum dos resultados é visível numa tabela de rotas que mostra apenas o prefixo instalado.
Caso um: o intervalo por acaso está alinhado
Pegue 198.51.100.64 até 198.51.100.127. O primeiro endereço está alinhado num limite de 64 endereços e o intervalo tem exatamente 64 endereços, então um único /26 descreve-o sem sobra.
Esse é o caso fácil e vale a pena reconhecê-lo, porque significa que o requisito provavelmente foi escrito por alguém que já pensava em prefixos. Também significa que a verificação é curta: confirme que o tamanho é uma potência de dois e que o início é um múltiplo desse tamanho.
Intervalos de documentação dão bons exemplos justamente porque ninguém os possui. Não instale estes endereços num túnel real e não presuma que um intervalo que lhe deram é espaço de documentação só porque parece incomum.
Caso dois: não está, então divida-o
Agora pegue 198.51.100.100 até 198.51.100.107. São oito endereços, que é uma potência de dois, mas 100 não é múltiplo de oito. Um único bloco desse tamanho não pode começar ali, então o intervalo tem de ser coberto por mais de um.
A cobertura exata são dois blocos /30: 198.51.100.100/30 cobre 100 a 103, e 198.51.100.104/30 cobre 104 a 107. Oito endereços no total, nada fora do intervalo, e a decomposição é única para um dado intervalo.
python3 -c "from ipaddress import ip_address, summarize_address_range as s; print(*s(ip_address('198.51.100.100'), ip_address('198.51.100.107')), sep='\n')"
A função da biblioteca padrão faz a aritmética por você, e a documentação do ipaddress define o que ela devolve. O que ela não faz é escolher um gateway, decidir quem possui os endereços ou conceder acesso a qualquer serviço por trás deles.
Meça o que o prefixo mais amplo teria capturado
Antes de aceitar um atalho, calcule quanto custa. Um /28 que começa em 198.51.100.96 cobre 96 a 111, ou seja, dezesseis endereços em vez de oito. Os oito extras são 96 a 99 e 108 a 111, e cada um deles herdaria a rota.
python3 -c "from ipaddress import ip_network as n; w=set(n('198.51.100.96/28')); t=set(n('198.51.100.100/30'))|set(n('198.51.100.104/30')); print(len(w), len(t), sorted(w-t))"
Oito destinos extras é um número concreto que pode colocar num pedido de mudança. É também o número que decide se o atalho é aceitável, e isso é uma questão de política e não de aritmética.
Mantenha a aritmética e a descoberta separadas. Um intervalo fornecido pelo operador de rede é convertido exatamente. Uma única resposta DNS de um serviço que muda não estabelece o intervalo completo ou permanente desse serviço, e nomes não relacionados podem compartilhar um endereço.
Instale o conjunto exato e verifique as bordas
Entregue cada prefixo resultante a quem possui a configuração da VPN e deixe que o instale pelo mecanismo suportado. Se o requisito precisa de duas entradas, mantenha duas entradas em vez de ampliar uma para encurtar um formulário.
sudo ip route add 198.51.100.100/30 via 10.90.0.1 dev tun0 sudo ip route add 198.51.100.104/30 via 10.90.0.1 dev tun0 ip route get 198.51.100.101 ip route get 198.51.100.97
Os dois últimos comandos são os que as pessoas pulam. O primeiro endereço interno deve seguir a rota nova, e o endereço logo fora do intervalo não. Se ambos forem pelo mesmo caminho, o intervalo foi ampliado em algum ponto entre o requisito e a configuração.
Registre o primeiro endereço, o último endereço e os prefixos que os expressam. A próxima pessoa que revisar a regra pode então comparar o requisito com a configuração sem refazer a aritmética, e a diferença entre uma rota exata e uma cômoda continua visível.