Trasforma un intervallo IP dal primo all’ultimo indirizzo in rotte VPN esatte
Un intervallo dal primo all’ultimo indirizzo raramente entra in un solo prefisso. Convertilo in blocchi CIDR esatti perché una rotta non catturi destinazioni fuori dall’intervallo.
Qualcuno ti dà un primo e un ultimo indirizzo e chiede una rotta VPN. La mossa tentante è scegliere il prefisso più corto che contiene entrambi gli estremi, e quella mossa aggiunge in silenzio destinazioni che nessuno ha chiesto. Un blocco CIDR ha sempre una dimensione potenza di due e un indirizzo iniziale allineato a essa, quindi un intervallo arbitrario di solito ne richiede più di uno. Percorri l’intervallo, dividilo esattamente, poi controlla gli indirizzi subito fuori.
Parti dall’intervallo, non dal prefisso
Annota il primo indirizzo e l’ultimo prima di scrivere qualcos’altro. La coppia è il requisito; un prefisso è solo una possibile espressione, e a volte sbagliata. Due numeri sono anche molto più facili da controllare di una maschera.
Un intervallo allineato si riduce a un solo blocco. Uno non allineato si scompone in diversi, e la scomposizione è esatta, non approssimata. Quello che non devi fare è arrotondare verso l’esterno e considerarlo abbastanza vicino, perché gli indirizzi extra ricevono la politica che la rotta porta con sé.
Entrambe le direzioni dell’errore contano. Per una rotta verso il tunnel, gli indirizzi extra vengono attirati nella VPN. Per un’eccezione di bypass, gli indirizzi extra la saltano. Nessuno dei due risultati è visibile in una tabella di routing che mostra solo il prefisso installato.
Primo caso: l’intervallo risulta allineato
Prendi 198.51.100.64 fino a 198.51.100.127. Il primo indirizzo è allineato su un confine di 64 indirizzi e l’intervallo è esattamente di 64 indirizzi, quindi un solo /26 lo descrive senza nulla in eccesso.
Questo è il caso facile e vale la pena riconoscerlo, perché significa che il requisito è stato probabilmente scritto da qualcuno che pensava già in prefissi. Significa anche che il controllo è breve: conferma che la dimensione sia una potenza di due e che l’inizio sia un multiplo di quella dimensione.
Gli intervalli di documentazione sono buoni esempi proprio perché nessuno li possiede. Non installare questi indirizzi su un tunnel reale e non dare per scontato che un intervallo ricevuto sia spazio di documentazione solo perché sembra insolito.
Secondo caso: non lo è, quindi dividilo
Ora prendi 198.51.100.100 fino a 198.51.100.107. Sono otto indirizzi, che è una potenza di due, ma 100 non è un multiplo di otto. Un solo blocco di quella dimensione non può iniziare lì, quindi l’intervallo deve essere coperto da più di uno.
La copertura esatta sono due blocchi /30: 198.51.100.100/30 copre da 100 a 103, e 198.51.100.104/30 copre da 104 a 107. Otto indirizzi in tutto, nulla fuori dall’intervallo, e la scomposizione è unica per un dato intervallo.
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 funzione della libreria standard fa l’aritmetica per te, e la documentazione di ipaddress definisce cosa restituisce. Quello che non fa è scegliere un gateway, decidere a chi appartengono gli indirizzi o concedere l’accesso a un servizio dietro di essi.
Misura cosa avrebbe catturato il prefisso più ampio
Prima di accettare una scorciatoia, calcola quanto costa. Un /28 che inizia da 198.51.100.96 copre da 96 a 111, cioè sedici indirizzi invece di otto. Gli otto extra vanno da 96 a 99 e da 108 a 111, e ognuno di essi erediterebbe la rotta.
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))"
Otto destinazioni extra è un numero concreto che puoi mettere in una richiesta di modifica. È anche il numero che decide se la scorciatoia è accettabile, e questa è una questione di politica, non di aritmetica.
Tieni separate aritmetica e scoperta. Un intervallo fornito dall’operatore di rete si converte esattamente. Una singola risposta DNS di un servizio che cambia non stabilisce l’intervallo completo o permanente di quel servizio, e nomi non correlati possono condividere un indirizzo.
Installa l’insieme esatto e verifica i bordi
Consegna ogni prefisso risultante a chi possiede la configurazione VPN e lascia che lo installi tramite il meccanismo supportato. Se il requisito richiede due voci, mantieni due voci invece di allargarne una per accorciare un modulo.
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
Gli ultimi due comandi sono quelli che la gente salta. Il primo indirizzo interno dovrebbe seguire la nuova rotta, e l’indirizzo subito fuori dall’intervallo no. Se entrambi vanno per la stessa strada, l’intervallo è stato allargato da qualche parte tra il requisito e la configurazione.
Registra il primo indirizzo, l’ultimo indirizzo e i prefissi che li esprimono. La prossima persona che rivede la regola può così confrontare il requisito con la configurazione senza rifare l’aritmetica, e la differenza tra una rotta esatta e una comoda resta visibile.