Converta un rango de IP do primeiro ao último enderezo en rutas VPN exactas
Un rango do primeiro ao último enderezo raramente encaixa nun só prefixo. Convértao en bloques CIDR exactos para que unha ruta non capture destinos fóra do intervalo.
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.