Alguien le entrega una primera y una última dirección y le pide una ruta VPN. El movimiento tentador es elegir el prefijo más corto que contenga ambos extremos, y ese movimiento añade en silencio destinos que nadie pidió. Un bloque CIDR siempre tiene un tamaño potencia de dos y una dirección inicial alineada con él, así que un intervalo arbitrario normalmente necesita más de uno. Recorra el intervalo, divídalo exactamente y luego compruebe las direcciones justo fuera de él.

Empiece por el intervalo, no por el prefijo

Anote la primera dirección y la última antes de escribir cualquier otra cosa. El par es el requisito; un prefijo es solo una expresión posible de él, y a veces una incorrecta. Dos números también son mucho más fáciles de comprobar que una máscara.

Un intervalo alineado se reduce a un solo bloque. Uno no alineado se descompone en varios, y la descomposición es exacta en lugar de aproximada. Lo que no debe hacer es redondear hacia fuera y considerarlo suficientemente cercano, porque las direcciones adicionales reciben la política que lleve la ruta.

Ambas direcciones del error importan. Para una ruta hacia el túnel, las direcciones adicionales se atraen a la VPN. Para una excepción de bypass, las direcciones adicionales se la saltan. Ninguno de los dos resultados es visible en una tabla de rutas que solo muestra el prefijo que instaló.

Caso uno: el intervalo resulta estar alineado

Tome 198.51.100.64 hasta 198.51.100.127. La primera dirección está alineada en un límite de 64 direcciones y el intervalo es exactamente de 64 direcciones, así que un solo /26 lo describe sin nada sobrante.

Ese es el caso fácil y vale la pena reconocerlo, porque significa que el requisito probablemente lo escribió alguien que ya pensaba en prefijos. También significa que la comprobación es corta: confirme que el tamaño es una potencia de dos y que el inicio es un múltiplo de ese tamaño.

Los rangos de documentación dan buenos ejemplos precisamente porque nadie los posee. No instale estas direcciones en un túnel real y no suponga que un rango que le dieron es espacio de documentación solo porque parezca inusual.

Caso dos: no lo está, así que divídalo

Ahora tome 198.51.100.100 hasta 198.51.100.107. Son ocho direcciones, que es una potencia de dos, pero 100 no es múltiplo de ocho. Un solo bloque de ese tamaño no puede empezar ahí, así que el intervalo debe cubrirse con más de uno.

La cobertura exacta son dos bloques /30: 198.51.100.100/30 cubre de 100 a 103, y 198.51.100.104/30 cubre de 104 a 107. Ocho direcciones en total, nada fuera del intervalo, y la descomposición es ú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')"

La función de la biblioteca estándar hace la aritmética por usted, y la documentación de ipaddress define qué devuelve. Lo que no hace es elegir una puerta de enlace, decidir quién posee las direcciones ni conceder acceso a ningún servicio detrás de ellas.

Mida qué habría capturado el prefijo más amplio

Antes de aceptar un atajo, calcule cuánto cuesta. Un /28 que empieza en 198.51.100.96 cubre de 96 a 111, que son dieciséis direcciones en lugar de ocho. Las ocho adicionales son de 96 a 99 y de 108 a 111, y todas heredarían la 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))"

Ocho destinos adicionales es un número concreto que puede poner en una solicitud de cambio. También es el número que decide si el atajo es aceptable, y eso es una cuestión de política y no de aritmética.

Mantenga la aritmética y el descubrimiento separados. Un intervalo proporcionado por el operador de red se convierte exactamente. Una sola respuesta DNS de un servicio cambiante no establece el rango completo o permanente de ese servicio, y nombres no relacionados pueden compartir una dirección.

Instale el conjunto exacto y verifique los bordes

Entregue cada prefijo resultante a quien posee la configuración de la VPN y deje que lo instale mediante el mecanismo admitido. Si el requisito necesita dos entradas, mantenga dos entradas en lugar de ampliar una para acortar 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

Los dos últimos comandos son los que la gente se salta. La primera dirección interior debería seguir la ruta nueva, y la dirección justo fuera del intervalo no. Si ambas van por el mismo camino, el intervalo se amplió en algún punto entre el requisito y la configuración.

Registre la primera dirección, la última dirección y los prefijos que las expresan. La siguiente persona que revise la regla podrá entonces comprobar el requisito contra la configuración sin rehacer la aritmética, y la diferencia entre una ruta exacta y una cómoda sigue siendo visible.

Artículos relacionados