Nel corso di questo capitolo daremo un breve cenno alle tecniche d'indirizzamento in Internet, spiegando quali sono i problemi generali derivati dall'utilizzo d'indirizzi di rete privati. Esamineremo poi l'indirizzamento H.323, e vedremo i problemi particolari creati dal protocollo, che implicano la necessità di un proxy. Infine, presenteremo delle soluzioni già realizzate.
(La trattazione dell'argomento è volutamente non approfondita: in questa sede, infatti, serve solo per introdurre la problematica che ha portato allo svolgimento del presente lavoro.)
La caratteristica principale di Internet è di fondere in un'unica architettura un'infinità di reti locali, potenzialmente disomogenee, e di permettere la comunicazione tra computer attestati sulle diverse sottoreti.
Ogni nodo della rete Internet è connesso a una rete locale, la quale a sua volta è connessa ad Internet mediante nodi detti router, che hanno la funzione di instradare la comunicazione verso l'esterno. L'instradamento ha luogo in base a un indirizzo IP, che individua i singoli nodi in modo univoco su scala mondiale. Un indirizzo IP consiste in un gruppo di 4 byte, il che permette di indirizzare un numero di host pari a oltre quattro miliardi.
In origine lo spazio di indirizzamento era partizionato in una gerarchia a due livelli: un indirizzo IP era cioè suddiviso in una parte che identificava la sottorete di appartenenza dell'host in questione (Network-ID), e una parte che identificava l'host all'interno di tale sottorete (Host-ID).
In tal modo ogni router dovrà essere a conoscenza solo degli indirizzi dei router che "servono" una determinata sottorete: esso inoltrerà i pacchetti a tali router, delegando loro la consegna finale dei pacchetti. Lo stratagemma serviva a ridurre le dimensioni delle tabelle di routing, e a velocizzare quindi il passaggio dei pacchetti nei router.

Figura 2.1 Classi di indirizzi IP
Più avanti la gerarchia ha subito un'ulteriore suddivisione, che riportiamo in figura 2.1.
I bit più significativi dell'indirizzo IP identificano 5 differenti classi di indirizzi:
Questa suddivisione è stata fatta per esigenze amministrative e funzionali, ma comporta un'inefficienza nell'allocazione degli indirizzi; a lungo andare, vista la crescita esponenziale del World Wide Web, ciò ha causato una scarsa disponibilità di indirizzi IP.
Un primo provvedimento "tampone" nei confronti di questo problema è stata l'introduzione degli indirizzi "privati" (RFC 1918); esistono dei gruppi di indirizzi IP che non vengono instradati dai router, come ad esempio 192.168.x.y, oppure 10.x.y.z, e possono essere riutilizzati nelle reti private di tutto il mondo per realizzare le Intranet, operanti con gli stessi protocolli e applicativi che funzionano via Internet.
Poiché non sono univoci, essi non vengono instradati dai router del "cuore" di Internet.
Come un host ne raggiunge un altro via Internet
Ogni nodo conosce, oltre al proprio indirizzo IP, una maschera di sottorete composta di serie di uno e zero, in numero complessivo di 32. Un qualsiasi nodo A opera un AND bit a bit tra la maschera e l'indirizzo IP del nodo B che deve raggiungere, ottenendo il Network-ID dell'host: se quest'ultimo appartiene alla stessa sottorete allora A può individuare l'indirizzo Ethernet del destinatario e inviargli i pacchetti direttamente. In caso contrario A invierà il pacchetto al proprio gateway (un router) verso Internet.

Figura 2.2 Reti Pubbliche e private
L'utente di un'applicazione Internet in realtà non conosce gli indirizzi IP dei nodi cui si vuole connettere, ma li identifica per mezzo di nomi simbolici, gli "indirizzi Internet": ad esempio, l'indirizzo Internet del computer dove risiede il sito Web del Dipartimento Infocom è quello in tabella.
Per facilità d'uso un indirizzo IP non viene mai espresso come stringa di bit, ma in vari formati; ciascuno strato della pila ISO-OSI, usa una propria convenzione di indirizzamento (vedi esempio in tabella).
|
Strato |
Formato dell'indirizzo |
|
Applicazione |
http: // frontcom.ing.uniroma.it |
|
Trasporto |
80 (Socket TCP) |
|
Rete |
151.100.10.136 (indirizzo IP) |
|
Data link |
a:b:c:d:e:f (indirizzo Ethernet) |
Tabella 2.3 Formati d'indirizzo (esempio)
Il processo che individua l'indirizzo IP associato ad un indirizzo Internet si dice RISOLUZIONE, e avviene mediante l'interrogazione di un particolare nodo, il Domain Name Server (DNS).
In un indirizzo del tipo host.dominio.tld si ha:
Quando un nodo generico A deve comunicare con un nodo B di indirizzo nodoB.dominio.tld, interroga il proprio DNS per conoscerne l'IP; quest'ultimo fornisce l'informazione se la possiede, oppure gira la richiesta a un altro DNS, secondo una gerarchia di "autorevolezza".
Abbiamo già detto che gli indirizzi privati non vengono instradati dal generico router. Non c'è alcun impedimento fisico oppure di software; semplicemente, tali indirizzi non sono univoci. Un router che non sia direttamente connesso alla LAN che usa quegli indirizzi privati non saprebbe come instradare i pacchetti ad essi diretti. Per comunicare con le reti pubbliche le reti private necessitano quindi di strumenti di "traduzione" di indirizzi, quali NAT routers, proxy servers, etc.
Un piccolo esempio estremamente semplificato: supponiamo che un browser web su un host A attestato su una LAN a indirizzamento privato voglia aprire una pagina web che risiede su un server pubblico. Ci sarà una richiesta a un DNS (non scendiamo nel dettaglio) e una risposta; l'host A "riconosce" che l'indirzzo IP ottenuto non appartiene alla propria LAN, e invia il pacchetto con la richiesta al proprio gateway verso Internet. Quando la richiesta arriverà al server, questi manderà la pagina web all'indirizzo che trova nel pacchetto, che è privato; i router che la richiesta ha attraversato non instradano i pacchetti (è il primo router che attraversano che li scarta) e la pagina non arriverà a destinazione.
Proxy server
Per evitare una situazione quale quella descritta è comune l'uso di un proxy HTTP, vale a dire un processo che gira su una macchina che ha visibilità di entrambe le reti (possiede dunque un indirizzo pubblico e uno privato). Il browser sull'host privato presenta tutte le proprie richieste a un processo (il proxy) che si mette in ascolto su una porta ben nota, tiene traccia della richiesta dell'host A, e la fa in sua vece, fornendo al server il proprio indirizzo pubblico: la pagina richiesta arriva senza problemi al proxy, che la "gira" all'host richiedente.
Dispositivi NAT
Un'altra soluzione è l'uso del cosiddetto NAT, ovvero Network Address Translation. Un dispositivo NAT "traduce" un indirizzo IP usato in una rete in un differente indirizzo IP noto in un altra.
Chiamiamo una delle due rete "interna", ad esempio una LAN, e l'altra "esterna", ad esempio Internet.
Gli utenti della rete interna possono vedere quelli sulla rete esterna, ma non è vero il viceversa, dato che gli utenti interni comunicano esclusivamente attraverso il dispositivo di traduzione.
Ogni richiesta, entrante o uscente, deve passare attraverso un processo di traduzione, che è dinamico e trasparente alle applicazioni.
Tipicamente i dispositivi NAT permettono il passaggio di tutto il traffico uscente; l'informazione di indirizzamento di un pacchetto viene immagazzinata con un valore di timeout. I pacchetti che viaggiano in direzione opposta e che hanno indirizzi corrispondenti vengono ammessi sulla rete interna. Questa tecnica di creazione di regole dinamiche si chiama "pinholing" (letteralmente bucherellare).
Un dispositivo NAT mappa gli indirizzi di rete interna su uno o più indirizzi IP di rete esterna, e viceversa.
Ci sono due tipi di dispositivi NAT:

Figura 2.3 Dispositivo NAT: esempio

Figura 2.4 Dispositivo PAT: esempio
2.2
Indirizzamento H.323Network Address
Ogni entità H.323 ha almeno un indirizzo di rete, che identifica univocamente l'entità sulla rete. Alcune entità possono condividere un indirizzo di rete (ad esempio un terminale e un Media Controller colocati). Questo indirizzo è specifico della rete in cui si trova l'endpoint; tipi di reti differenti possono avere differenti formati di indirizzo di rete.
TSAPIdentifier
L'acronimo sta per Transport Service Access Identifier. Per ogni indirizzo di rete un'entità può avere diversi TSAPIdentifier: questi ultimi permettono il multiplexing di vari canali che condividono lo stesso indirizzo di rete.
Ogni endpoint ha uno TSAPIdentifier "ben noto" : quello del canale di segnalazione di chiamata.
I gatekeepers hanno anch'essi uno TSAPIdentifier "ben noto" , quello del canale RAS, e un indirizzo multicast, anch'esso ben noto, il Discovery Multicast Address.
Gli endpoint usano degli TSAPIdentifier dinamici per il canale di controllo H.245, per i canali audio, video e dati. I gatekeepers usano uno TSAPIdentifier dinamico per i canali di segnalazione di chiamata.
In parole povere, uno TSAPIdentifier non è altro che un numero di porta, che identifica in modo univoco la connessione TCP oppure UDP che l'applicazione H.323 sta usando.
Alias address
Ad ogni endpoint possono essere associati uno o più indirizzi alias: questi forniscono un metodo alternativo di indirizzamento, e includono indirizzi del tipo dialedDigits , PartyNumber (inclusi numeri di telefono privati o numeri E.164 pubblici), nomi H.323 (stringhe alfanumeriche che rappresentano nomi, indirizzi e-mail, etc.) e qualsiasi altro tipo definito nella Raccomandazione H.225.0.
Gli indirizzi alias saranno unici all'interno di una zona, e gatekeepers, Media Controllers e Media Processors non hanno indirizzi alias.
Per comodità di trattazione, useremo genericamente il termine "indirizzo", intendendo che, nei casi esaminati, esso sarà formato da due parti: una è l'indirizzo di rete, vale a dire l'indirizzo IP della macchina ove gira l'applicazione H.323, e che identifica univocamente tale macchina nell'ambiente di rete ove si trova; l'altra sarà un numero di porta, TCP oppure UDP, che identifica univocamente il protocollo (RAS, H.225, H.245, RTCP RTP) usato per lo scambio di dati su quella connessione.
TIPI DI INDIRIZZO IN UNA CHIAMATA H.323
|
Indirizzo |
IP |
Porta |
Vincoli sulla porta |
|
RAS |
Esempio:151.100.10.136 |
1719 (UDP) |
Fissa |
|
H.225.0 |
Esempio:151.100.10.136 |
1720 (TCP) |
Fissa |
|
H.245 |
Esempio:151.100.10.136 |
Esempio: 23765 (TCP) |
Dinamica, > 1024 |
|
RTCP |
Esempio:151.100.10.136 |
Esempio: 5001 (UDP) |
Dinamica, > 1024 , pari al numero di porta RTP più 1 |
|
RTP |
Esempio:151.100.10.136 |
Esempio: 5000 (UDP) |
Dinamica, > 1024 |
2.2.1 Chiamate H.323 : tutti i casi
In tutti i casi esaminati nel paragrafo gli endpoint e l'eventuale gatekeeper sono sulla stessa rete.
Chiamata diretta tra due endpoint senza registrazione a un gatekeeper.
Questo tipo di situazione prevede che un endpoint conosca almeno l'indirizzo H.225.0 dell'endpoint remoto col quale vuole comunicare. Per comodità chiamiamo i due endpoint Alice e Bob. Distinguiamo i vari passi con i quali si instaura la chiamata:

Figura 2.5 Chiamata tra due endpoint sulla stessa rete
Chiamata tra due endpoint registrati allo stesso gatekeeper
In questo tipo di chiamata è sufficiente che gli endpoint conoscano l'alias H.323 dell'endpoint che vogliono contattare.

Figura 2.6 Modalità H.225 direct
Chiamata tra due endpoint registrati allo stesso gatekeeper; modalità H.225 routed
Chiamata tra due endpoint registrati allo stesso gatekeeper, modalità H.245 routed
In questi esempi si è visto come le applicazioni basino la loro capacità di interagire sulla conoscenza dei reciproci indirizzi: nelle tabelle seguenti riassumiamo la situazione, relativamente a un endpoint
|
Chiamata diretta tra endpoint senza gatekeeper |
|
|
Indirizzo |
Provenienza |
|
RAS: nessuno |
Non necessario |
|
H.225.0: endpoint remoto |
Noto a priori |
|
H.245: endpoint remoto |
Negoziato in H.225 |
|
RTCP: endpoint remoto |
Negoziato in H.245 |
|
RTP: endpoint remoto |
Negoziato in H.245 |
|
Chiamata tra endpoint registrati allo stesso gatekeeper (modalità direct) |
|
|
Indirizzo |
Provenienza |
|
RAS: gatekeeper |
Noto a priori |
|
H.225.0: endpoint remoto |
Fornito dal gatekeeper |
|
H.245: endpoint remoto |
Negoziato in H.225 |
|
RTCP: endpoint remoto |
Negoziato in H.245 |
|
RTP: endpoint remoto |
Negoziato in H.245 |
|
Chiamata tra endpoint registrati allo stesso gatekeeper (modalità H.225 routed) |
|
|
Indirizzo |
Provenienza |
|
RAS: gatekeeper |
Noto a priori |
|
H.225.0: gatekeeper |
Fornito dal gatekeeper |
|
H.245: endpoint remoto |
Negoziato in H.225 |
|
RTCP: endpoint remoto |
Negoziato in H.245 |
|
RTP: endpoint remoto |
Negoziato in H.245 |
|
Chiamata tra endpoint registrati allo stesso gatekeeper (modalità H.225 e H.245 routed) |
|
|
Indirizzo |
Provenienza |
|
RAS: gatekeeper |
Noto a priori |
|
H.225.0: gatekeeper |
Fornito dal gatekeeper |
|
H.245: gatekeeper |
Fornito dal gatekeeper |
|
RTCP: endpoint remoto |
Negoziato in H.245 |
|
RTP: endpoint remoto |
Negoziato in H.245 |
Chiamata diretta tra endpoint non registrati a un gatekeeper
Lo scenario è quello, estremamente semplice, della chiamata diretta vista nel paragrafo precedente. Supponiamo che Alice, host ad indirizzo privato, conosca l'indirizzo H.225 di Bob, host ad indirizzo pubblico.

Figura 2.7 Chiamata diretta fallita
Nel caso in cui la chiamata iniziasse da Bob, fallirebbe ancora prima; infatti nel pacchetto IP che contiene il messaggio di setup il campo di destinazione contiene un indirizzo privato: il primo router incontrato scarterebbe il pacchetto, che non arriva ad Alice.
Raramente, però, si verifica il caso di una chiamata diretta: più comune è il caso in cui gli utenti che vogliono interagire sono registrati a un gatekeeper.
Chiamata tra due endpoint sulla stessa rete registrati allo stesso gatekeeper: modalità H.225 direct
Innanzitutto anticipiamo che la macchina sulla quale risiede il gatekeeper deve avere visibilità di entrambe le reti, per permettere la registrazione agli endpoint su rete pubblica e a quelli su rete privata. Questo significa che il gatekeeper si deve trovare su un router di confine tra le due reti, e che possa accettare registrazioni da entrambe.
Vediamo come si evolve la chiamata:
Senza esaminare nel dettaglio tutti i casi possibili, diremo che nel caso H.225 routed la segnalazione è inoltrata dal gatekeeper, e quindi i messaggi di Setup, Alerting e Connect arrivano a destinazione. In tali messaggi viene specificato un indirizzo H.245, formato da un numero di porta e da un indirizzo di rete privato, il che provoca il fallimento della chiamata per i motivi ampiamente specificati.
Nel caso H.225 e H.245 routed, anche il controllo di chiamata passa per il gatekeeper, e la chiamata viene instaurata; i flussi RTP e RTCP, d'altro canto, sono trasportati da pacchetti che hanno nella loro intestazione un indirizzo di destinazione privato, e non vengono instradati. La chiamata non è fallita, ma non è neanche molto utile, dato che, nel migliore dei casi, solo uno dei due endpoint riceverà l'audio inviato dall'altro.
Abbiamo visto che, nel caso generale, il problema degli indirizzi privati viene risolto principalmente con due tipi di dispositivo: proxy server e dispositivi NAT.
Per una LAN "privata" il fatto che i suoi host non siano visibili dall'esterno, come accade usando i dispositivi menzionati, è un valore aggiunto dal punto di vista della sicurezza, tanto che tali dispositivi si trovano spesso accoppiati con un firewall. Un firewall è una barriera posta tra due reti, in genere una LAN privata e Internet, usata per evitare intrusioni indesiderate sulla rete privata.
I due tipi principali di firewall sono i Packet Filters e gli Application Level Gateway:
Sia firewall che NAT router hanno bisogno di sapere, per funzionare in maniera corretta , gli indirizzi IP e i numeri di porta relativi ai dati entranti o uscenti.
Abbiamo due alternative:
Dato che il problema esposto è molto diffuso, altre soluzioni sono state realizzate. Accenniamo brevemente a tre di queste, descrivendone grossolanamente il funzionamento.
Opengatekeeper-Proxy
Soluzione realizzata da Marco Polci dell'università di Trieste, è un'estensione del progetto open-source opengatekeeper. Il punto di partenza è un gatekeeper, al quale sono state aggiunte varie funzionalità. Il funzionamento consiste nello scrivere in un buffer di ingresso i pacchetti che contengono i dati multimediali provenienti da uno dei due host, e scriverli in un buffer di uscita dal quale vengono "pescati" dalla parte di codice che li spedisce all'altro host. (Il tutto viene ripetuto nell'altra direzione).
Tale soluzione non è trasparente agli utenti, che devono essere informati della presenza del proxy: a un terminale H.323 deve essere specificato cioè l'indirizzo al quale mandare i pacchetti RTCP/RTP. Lungi dall'essere un grosso disturbo per l'utente finale, questo può creare problemi in caso di malfunzionamento del proxy: non si può cambiare dinamicamente la direzione dei pacchetti contenenti i media. Se si volesse offrire una tolleranza ai guasti del sistema, sarebbe invece necessario poter cambiare la direzione del flusso RTP in maniera trasparente al terminale.
Modulo Coritel
Soluzione realizzata dallo studente Iurilli dell'Università La Sapienza di Roma quale tesi di laurea in Ingegneria, è un modulo del kernel versione 2.2.12 di Linux (contenuto in Linux Red Hat 6.2 , per esempio) per il NAT routing, che permette il passaggio delle connessioni H.323. Questo modulo evita il problema di dover decodificare i messaggi di protocollo; vengono analizzati i pacchetti contenenti i messaggi dopo la codifica ASN.1, e individuate delle maschere di bit che caratterizzano tali messaggi.
Il router fa un confronto bit a bit dell'intestazione dei pacchetti con tali maschere, e se ottiene un risultato positivo permette il passaggio ai pacchetti, dopo aver sostituito nella loro intestazione un'altra maschera di bit corrispondente a un indirizzo IP opportuno.
Tale soluzione è, a mio avviso, migliore di quella precedente, dato che non ha il problema di leggere e scrivere i pacchetti nei buffer, ma ne esamina semplicemente l'intestazione, riducendo di molto il carico di lavoro della macchina.
Il funzionamento è però limitato alla sola versione citata del kernel di Linux, e ha alcuni seri limiti: non prevede l'uso di un gatekeeper ( almeno nella sua prima realizzazione) e presenta la possibilità di mancata connessine tra due applicativi nel caso di più chiamate contemporanee.
RSIP Server per Linux
(http://openresources.info.ucl.ac.be/rsip/)
Soluzione che per certi versi è simile a quella da me realizzata, ma poco pratica in certi casi. Senza scendere nei particolari, questo server ha a disposizione un certo numero di indirizzi IP pubblici, e quando un host su rete privata vuole fare una chiamata H.323 viene allocato uno di questi indirizzi; all'endpoint su rete pubblica viene fornito come indirizzo dell'interlocutore l'indirizzo pubblico, e si usa il packet filter IPTables per fare NAT e far passare i pacchetti sulla rete privata.
Il funzionamento è assimilabile a quello di un PBX con molti interni e poche linee in uscita nella telefonia tradizionale.
Il grosso problema è che per fare 100 chiamate contemporanee ci vogliono 100 indirizzi IP pubblici da allocare in aggiunta a quelli che usa normalmente la rete per dati, e se si ha tutta quella disponibilità di IP pubblici li si usa direttamente, senza fare ricorso a quelli privati, e risolvendo il problema dela sicurezza con un firewall.