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.

Artigos relacionados