PREMESSA
Capisco che il titolo possa sembrare quantomeno fuorviante, ma descrive in modo abbastanza calzante il risultato che si riesce ad ottenere. Questo articolo è in particolare rivolto a tutte le persone che hanno connessioni Internet con pochi IP pubblici (i famosi 8 oppure 16) e non a chi ha a disposizione un /24 o anche di più.
 

SITUAZIONE
Quando acquistiamo un qualunque blocco di IP pubblici insieme ad una connessione Internet, siamo già a conoscienza che non tutti gli IP promessi potranno essere usati. Supponendo di prendere i classici 8 IP, al massimo ne potremo usare 5 per le nostre applicazioni: infatti dal blocco di 8 IP dobbiamo necessariamente togliere il primo (che rappresenta la rete che ci è stata assegnata) e l'ultimo (l'indirizzo di broadcast); dato poi che anche il nostro router, sulla sua interfaccia interna, ha bisogno di un indirizzo IP, il numero totale a nostra disposizione scende appunto a 5.

La figura sottostante mostra un classico esempio, dove il provider ci ha assegnato il blocco 200.200.200.16/29 che corrisponde al range da 200.200.200.17 a 200.200.200.22 e che potremmo semplicemente allocare come nella figura sottostante.

router noip

Molto probabilmente questa scelta è sufficiente nella maggior parte delle circostanza. Personalmente però mi sono trovato più volte "a corto" di IP: è infatti mia abitudine usare IP diversi per la navigazione, la pubblicazione dei servizi (es. sito web oppure server di posta) ed un ulteriore indirizzo per accedere alle funzioni di intranet (es. posta web) oppure VPN.

IDEA
L'idea mi è venuta in una sera d'inverno mentre cercavo di allocare in maniera "furba" gli 8 (pardon 5!) IP statici della mia connessione casalinga: manco a farlo apposta, 5 IP erano precisi precisi per la disposizione che avevo in mente (non fate domande, pleasewink smile e comunque sì mi servono tutti!) ma in questo modo non mi sarebbe rimasto nemmeno un piccolo indirizzo per fare eventuali prove e test.

A questo punto ho iniziato a ripensare a come un host IP utilizza l'indirizzo del gateway. Quando l'host (facendo le apposite operazioni con la propra subnet mask) capisce che il destinatario di un pacchetto non è nella propria rete, decide di inviare il relativo frame ethernet al gateway stesso: ovvero, il pacchetto avrà sempre come destinatario la macchina remota, ma a livello 2 il MAC address di destinazione sarà quello corrispondente all'IP del gateway (e non quello della macchina remota che non è ovviamente "visibile" dal mittente). Come quindi ho più volte detto in aula, ad un host non serve l'IP del gateway bensì il suo MAC address, solo che mettere il MAC address nella configurazione è decisamente poco comodo!

Un host trova il MAC address usando il protocollo ARP: questo signore, da un punto di vista teorico, è collocato allo stesso livello dell'IP e quindi colloquia direttamente con il livello network sottostante, come si può vedere dalla figura sottostante (limitatamente ai primi due livelli del modello del TCP/IP):

 livelli

(mi perdoni A.S. Tanenbaum che usa il modello a 5 strati ma per quello che voglio evidenziare quello a 4 è più che sufficiente).
Come si può vedere dalla figura il protocollo ARP "parla" direttamente con il livello di rete: questo significa che un pacchetto ARP non richiede di essere "incapsulato" dentro l'IP il quale, a sua volta, richiede un IP mittente ed un IP destinatario. Non solo: un pacchetto ARP viene spedito in broadcast (e di conseguenza elaborato da tutte le macchine che lo ascoltano)  e contiene al suo interno semplicemente una richiesta per conoscere il MAC address associato ad un certo indirizzo IP.
 

Sulla base di queste considerazioni ho cominciato a pensare che forse il mio gateway (ovvero il router che mi collega ad Internet) potesse avere un IP completamente diverso da quelli assegnati dal provider (es. 192.168.0.1/24), a patto che le macchine collegate abbiano come GW appunto il 192.168.0.1. In pratica la situazione che si viene a creare è la seguente:
 

gw classe diversa

Vediamo come dovrebbe funzionare la cosa supponendo di usare la macchina 200.200.200.18

  1. La macchina 200.200.200.18 deve inviare un pacchetto IP fuori e quindi ha bisogndo del MAC address della scheda interna del router.
  2. Invia quindi un pacchetto ARP chiedendo il MAC corrispondente all'IP 192.168.0.1 (che è l'indirizzo del gateway impostato sull'host) e specificando il proprio MAC address come mittente.
  3. Il router riceve il pacchetto (dato che è un broadcast) e lo elabora
  4. Il router vede che il MAC richiesto è quello corrispondente al suo IP.
  5. Il router crea il pacchetto di risposta
  6. Il router invia il pacchetto al MAC address che ha fatto la richiesta (e quindi alla macchina 200.200.200.18).
  7. L'host "impara" il MAC address della macchina impostata come gateway.
  8. L'host costruisce il pacchetto per la destinazione (IP mittente: 200.200.200.18 - IP destinatario: IP della macchina remota su Internet)
  9. L'host invia il pacchetto alla scheda di rete del router
  10. Il router apre il pacchetto perchè è destinato alla sua scheda di rete
  11. Il router vede che l'IP del destinatario non è il proprio
  12. Il router "gira" il pacchetto sulla opportuna interfaccia basandosi sulla sua tabella di routing 

Ho separato con colori diversi le due fasi che ritengo importanti: la prima è quella in cui il "trucco" entra in gioco mentre la seconda è quella classica che si ha anche senza questa configurazione.

Rimane ovviamente un problema: quando arriva il pacchetto di risposta il router non conosce la rete 200.200.200.16 (dato che abbiamo tolto l'indirizzo dalla scheda interna) per cui scarterebbe il pacchetto. Per ovviare al problema basta insegnare al router che la rete 200.200.200.16 si trova "attaccata" all'interfaccia interna anche se quest'ultima non ha un indirizzo sulla stessa rete.
In pratica, il router non deve far altro che "inoltrare" i pacchetti di risposta sull'interfaccia interna, anche se potenzialmente il router non riesce a "vedere" a livello IP i destinatari in quanto appartengono ad una subnet diversa dalla proprie.


Per ottenere questo semplice risultato è sufficiente un bel

  router(config)# ip route 200.200.200.16 255.255.255.248 Ethernet0   

A questo punto, quando arriva il pacchetto di risposta per il 200.200.200.18, il router si comporta in questo modo:
  1. Il router esamina il pacchetto di risposta ricevuto sull'interfaccia Internet
  2. Il router confronta l'IP di destinazione (che sarà uno dei nostri IP pubblici) con la propria tabella di routing
  3. Il router vede (sulla base della riga precedente) che la destinazione è direttamente collegata alla scheda eth0
  4. Il router deve adesso trovare il MAC address corrispondente all'IP di destinazione
  5. Il router invia un pacchetto ARP sull'interfaccia eth0 chiedendo qual'è il MAC address corrispondente all'IP 200.200.200.18 e specificando come mittente il MAC address dell'interfaccia eth0.
  6. La macchina host vede il pacchetto ARP (di broadcast) e lo apre.
  7. La macchina vede che la richiesta è per il proprio indirizzo IP
  8. La macchina prepara il pacchetto di risposta nel quale si dichiara che il MAC di 200.200.200.18
  9. La macchina invia un pacchetto di risposta diretto all'interfaccia interna del router.
  10. Il router "impara" qual'è il MAC address di 200.200.200.18
  11. Il router inoltra il pacchetto originale ricevuto alla macchina interna

Ho quindi ottenuto il mio risultato ovvero ho "risparmiato" un indirizzo IP!


Questo trucco è stato provato sia con macchine Linux che Windows ed in entrambi i casi ha funzionato senza problemi.