Alguén lle dá un primeiro e un último enderezo e pídelle unha ruta VPN. O movemento tentador é escoller o prefixo máis curto que contén ambos os extremos, e ese movemento engade en silencio destinos que ninguén pediu. Un bloque CIDR sempre ten un tamaño potencia de dous e un enderezo inicial aliñado con el, así que un intervalo arbitrario normalmente necesita máis dun. Percorra o intervalo, divídao exactamente e despois comprobe os enderezos xusto fóra del.

Empece polo intervalo, non polo prefixo

Anote o primeiro enderezo e o último antes de escribir calquera outra cousa. O par é o requisito; un prefixo é só unha expresión posible del, e ás veces unha incorrecta. Dous números tamén son moito máis fáciles de comprobar ca unha máscara.

Un intervalo aliñado redúcese a un só bloque. Un non aliñado descomponse en varios, e a descomposición é exacta en lugar de aproximada. O que non debe facer é redondear cara a fóra e consideralo suficientemente próximo, porque os enderezos adicionais reciben a política que leve a ruta.

As dúas direccións do erro importan. Para unha ruta cara ao túnel, os enderezos adicionais atraen á VPN. Para unha excepción de bypass, os enderezos adicionais sáltana. Ningún dos dous resultados é visible nunha táboa de rutas que só mostra o prefixo que instalou.

Caso un: o intervalo resulta estar aliñado

Tome 198.51.100.64 ata 198.51.100.127. O primeiro enderezo está aliñado nun límite de 64 enderezos e o intervalo é exactamente de 64 enderezos, así que un só /26 o describe sen nada sobrante.

Ese é o caso fácil e paga a pena recoñecelo, porque significa que o requisito probablemente o escribiu alguén que xa pensaba en prefixos. Tamén significa que a comprobación é curta: confirme que o tamaño é unha potencia de dous e que o inicio é un múltiplo dese tamaño.

Os rangos de documentación dan bos exemplos precisamente porque ninguén os posúe. Non instale estes enderezos nun túnel real e non supoña que un rango que lle deron é espazo de documentación só porque pareza inusual.

Caso dous: non o está, así que divídao

Agora tome 198.51.100.100 ata 198.51.100.107. Son oito enderezos, que é unha potencia de dous, pero 100 non é múltiplo de oito. Un só bloque dese tamaño non pode comezar aí, así que o intervalo debe cubrirse con máis dun.

A cobertura exacta son dous bloques /30: 198.51.100.100/30 cobre de 100 a 103, e 198.51.100.104/30 cobre de 104 a 107. Oito enderezos en total, nada fóra do intervalo, e a descomposición é única para un intervalo dado.

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 función da biblioteca estándar fai a aritmética por vostede, e a documentación de ipaddress define que devolve. O que non fai é escoller unha pasarela, decidir quen posúe os enderezos nin conceder acceso a ningún servizo detrás deles.

Mida que tería capturado o prefixo máis amplo

Antes de aceptar un atallo, calcule canto custa. Un /28 que comeza en 198.51.100.96 cobre de 96 a 111, que son dezaseis enderezos en lugar de oito. Os oito adicionais son de 96 a 99 e de 108 a 111, e todos herdarían a ruta.

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 adicionais é un número concreto que pode pór nunha solicitude de cambio. Tamén é o número que decide se o atallo é aceptable, e iso é unha cuestión de política e non de aritmética.

Manteña a aritmética e o descubrimento separados. Un intervalo proporcionado polo operador de rede convértese exactamente. Unha soa resposta DNS dun servizo cambiante non establece o rango completo ou permanente dese servizo, e nomes non relacionados poden compartir un enderezo.

Instale o conxunto exacto e verifique os bordos

Entregue cada prefixo resultante a quen posúe a configuración da VPN e deixe que o instale mediante o mecanismo admitido. Se o requisito necesita dúas entradas, manteña dúas entradas en lugar de ampliar unha para acurtar un formulario.

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 dous últimos comandos son os que a xente se salta. O primeiro enderezo interior debería seguir a ruta nova, e o enderezo xusto fóra do intervalo non. Se ambos van polo mesmo camiño, o intervalo ampliouse nalgún punto entre o requisito e a configuración.

Rexistre o primeiro enderezo, o último enderezo e os prefixos que os expresan. A seguinte persoa que revise a regra poderá entón comprobar o requisito contra a configuración sen refacer a aritmética, e a diferenza entre unha ruta exacta e unha cómoda segue sendo visible.

Artigos relacionados