Capitolo 3 Lo scenario di partenza

In questo capitolo mostriamo dove si dovrebbe intervenire per risolvere il problema presentato, e spieghiamo la scelta dell'ambiente di partenza, costituito da un Gatekeeper e da un Media Controller. Dopo un approfondimento sul protocollo H.245 presentiamo gli strumenti usati per giungere alla soluzione.

3.1 Cosa deve fare il proxy

Nel capitolo precedente si è visto che un proxy H.323 deve essere un ALG, entità che ha la possibilità di intervenire sui messaggi di protocollo e, se necessario, cambiarne il contenuto. Vediamo ora dove deve intervenire questa entità nel flusso di una chiamata.

Tabella 3.1 Messaggi H.225 sui quali il proxy deve intervenire

PDU

Scenario

Azioni principali

Setup

Richiesta per l'instaurazione di una nuova chiamata; arriva sul canale di segnalazione (porta ben nota)

  1. Restituire al chiamante un messaggio di Proceeding
  2. Determinare se la chiamata ha origine interna o esterna
  3. Verificare se è presente nel Setup un indirizzo di segnalazione di chiamata di destinazione valido. In caso affermativo andare al punto 6
  4. In caso negativo scandire la lista degli alias per risolvere un indirizzo valido. Se anche questa ricerca fallisce respingere la chiamata.
  5. Sostituire nel messaggio di Setup l'indirizzo del proxy
  6. Una volta trovato un indirizzo IP valido, creare una connessione TCP verso tale indirizzo
  7. Inoltrare il messaggio di Setup modificato

Connect

Restituito dal chiamato al chiamante

  1. Se è presente un indirizzo H.245 sostituire tale indirizzo con l'indirizzo del proxy
  2. Inoltrare il messaggio modificato

Release complete

Può essere spedito da entrambi

  1. Rilasciare tutte le risorse allocate per i canali H.245 e audio-video
  2. Inoltrare il messaggio
  3. Rilasciare le risorse relative alla connessione H.225 e chiudere la connessione

 

Alerting

Spedito dal chiamato

Inoltrare con un corretto Call Reference Value

Tutte le altre PDU

 

Inoltrare con un corretto Call Reference Value

 

 

 

 

Tabella 3.2 Messaggi H.245 sui quali il proxy deve intervenire

PDU

Scenario

Azioni principali

Open Logical Channel

Spedito da chi vuole aprire un canale

  1. Se i dati sono di tipo è audio o video allocare porte per i flussi RTCP e RTP (su entrambi i lati del proxy)
  2. Rimpiazzare l'indirizzo RTCP con quello del proxy
  3. Inoltrare il messaggio modificato

Open Logical Channel Ack

Il ricevente accetta la richiesta di apertura del canale

  1. Se il canale non è noto scartare la PDU
  2. Per un canale noto:
    • Mappare le porte locali su quelle remote
    • Attivare l'inoltro dei pacchetti relativi alle sessioni RTCP e RTP
  3. Rimpiazzare gli indirizzi RTCP e RTP presenti nel messaggio con quelli del proxy
  4. Inoltrare il messaggio modificato

Open Logical Channel Reject

Il ricevente rifiuta l'apertura di un canale

  1. Se il canale non è noto scartare la PDU
  2. Se il canale è noto rilasciare tutte le risorse
  3. Inoltrare il messaggio modificato

Close Logical Channel

Spedito da chi vuole chiudere un canale

  1. Se il canale non è noto scartare la PDU
  2. Se il canale è noto:
    • Smettere di inoltrare i pacchetti sulle porte RTCP e RTP relative al canale considerato
    • Rilasciare le porte UDP
  3. Inoltrare il messaggio modificato

End Session

Una delle due parti vuole chiudere tutti i canali e terminare la chiamata

  1. Per ogni canale tra i due endpoint
    • Smettere di inoltrare i pacchetti sulle porte RTCP e RTP relative al canale considerato
    • Rilasciare le porte UDP
  2. Inoltrare il messaggio
  3. Rilasciare le risorse relative alla connessione H.245 e chiudere la connessione
  4. Mandare un messaggio H.225 di Release Complete ad entrambi gli endpoint e chiudere la
  5. connessione

Tutte le altre PDU

 

Inoltrare la PDU

 

Sostanzialmente i livelli ai quali si deve intervenire sono due: il primo è la gestione dei protocolli H.323 e H.245, e il secondo, a più basso livello, è il passaggio fisico dei pacchetti UDP che trasportano i media. La figura 3.1 illustra il concetto.

Figura 3.1 Decomposizione funzionale del proxy H.323

3.2 Gatekeeper e Media Controller

Abbiamo già parlato di questi due componenti nel primo capitolo, descrivendone in dettaglio le funzioni; richiamiamo brevemente quelle di interesse.

Funzionalità del gatekeeper

Denominazione

Significato

Obbligatoria/opzionale

Address Resolution

Traduzione da indirizzi alias in indirizzi IP

Obbligatoria

Admission Control

Controllo di accesso al servizio

Obbligatoria

Routing H.225

Inoltro della segnalazione di chiamata

Opzionale

Routing H.245

Inoltro del controllo di chiamata

Opzionale

 

Funzionalità del Media Controller

Gestione del flusso H.245 nel caso di conferenze a più di due partecipanti: gli endpoint non scambiano i messaggi di controllo di chiamata direttamente, ma li inviano all'MC, il quale li smista ai vari terminali che partecipano alla conferenza, dopo averli processati e, eventualmente, modificati. Un esempio: tre terminali vogliono instaurare una conferenza multipunto. Il terminale A può trasmettere audio secondo il codec G.711, mentre gli altri due hanno nel loro capability set ( un elenco associato a ogni terminale che comprende i codec che il terminale è in grado di decodificare e le funzionalità supportate) tutti i codec: il Media Controller invierà a tutti e tre i terminali un messaggio in cui stabilisce come codec il G.711

L'idea di base

Realizzare il proxy H.323 come un modulo di un gatekeeper: facendo lavorare quest'ultimo in modalità H.225 e H.245 routed, ci si può preoccupare della sola parte relativa al passaggio da una rete all'altra dei pacchetti che trasportano i flussi multimediali (vedi figura 3.2).

Figura 3.2 Gatekeeper e smistatore di pacchetti

Questo scenario richiede al gatekeeper e alla macchina sulla quale risiede dei requisiti ben precisi:

Il primo requisito non è affatto difficile da realizzare: basta montare due schede di rete su un PC.

Il problema nasce sugli altri due: i gatekeeper esistenti si "legano" a una sola interfaccia di rete, rilevandone l'indirizzo IP e immagazzinando come proprio indirizzo H.225 , da usare nelle procedure di chiamata viste, la combinazione indirizzo IP+porta ben nota TCP 1719.

Questo crea un ulteriore problema sul tipo di endpoint da usare. Supponiamo che la situazione sia quella in figura.

Figura 3.3 Gatekeeper a cavallo tra Internet e una rete privata

Il gatekeeper gira su una macchina che ha due interfacce di rete: le due reti sulle quali si affaccia hanno piani di indirizzamento differenti: una è una sottorete collegata a Internet, con indirizzi pubblici, e l'altra una sottorete di classe C di indirizzi privati 10.244.116.x. Il processo gatekeeper si "lega" all'interfaccia pubblica, per accettare registrazioni da Internet.

Gli endpoint sulla rete privata, in fase di registrazione, mandano una Gatekeeper Request all'indirizzo multicast ben noto, e ottengono dal gatekeeper un indirizzo IP che non appartiene alla loro sottorete; non tutti gli endpoint , a questo punto, sono capaci di completare ugualmente la registrazione (ad esempio Microsoft Netmeeting ne è capace, mentre Gnomemeeting no).

Analogamente, non tutti i gatekeeper supportano la registrazione da parte di endpoint con indirizzi IP appartenenti a una sottorete differente da quella cui appartiene il gatekeeper.

Si è scelto di usare un gatekeeper commerciale, funzionante su sistema operativo Linux Red Hat 7.1 ( Kernel 2.4), che può registrare endpoint indipendentemente dal loro indirizzo, e che è capace di inoltrare la segnalazione di chiamata a cavallo tra due reti.

In un primo test si è visto che due endpoint che avevano ultimato correttamente la procedura di registrazione riuscivano a raggiungersi, facendo "squillare il telefono" l'uno dell'altro. Questo indica che veniva completato lo scambio di messaggi in figura: l'endpoint Alice manda un'ARQ al gatekeeper GK, il quale restituisce nell'ACF il proprio indirizzo di segnalazione H.225. Alice manda il Setup a tale indirizzo, e GK "passa" tale messaggio sull'altra rete. A sua volta Bob compie la procedura ARQ-ACF, e manda il messaggio di Connect a GK, che, di nuovo, lo passa sull'altra rete (vedi figura 3.4).

 

Figura 3.4 H.225 routing

Una volta confermata la possibilità di routing H.225 tra due reti, rimaneva da vedere se il gatekeeper aveva la capacità di fare routing anche per il controllo H.245. Non sono stati fatti test in questo senso, per il motivo che andiamo a spiegare.

Il gatekeeper usato viene messo in commercio insieme a un Media Controller, che è un vero e proprio proxy H.245. Tale software può girare sulla stessa macchina del gatekeeper o anche su un'altra; una volta configurato il gatekeeper per riconoscere la presenza dell' MC, tutti i messaggi H.245 vengono gestiti da quest'ultimo.

Il software che realizza l'MC è fornito nella forma di una applicazione di esempio dal funzionamento elementare, e di un set di API (Application Program Interface), cioè di funzioni compatibili con lo stack H.323 realizzato dal fornitore del software. Per ogni messaggio H.245 ricevuto, l'MC immagazzina determinati parametri, cui le API fornite permettono un accesso parziale.

Scelta progettuale definitiva

La scelta progettuale operata è stata di:

    1. Usare il gatekeeper in modalità H.225 routed per gestire la segnalazione di chiamata indifferentemente sulle reti pubblica e privata
    2. Usare un sottoinsieme delle funzionalità dell'MC, operante sulla stessa macchina, per la gestione del controllo H.245
    3. Usare le API per modificare in maniera opportuna, ove necessario, i parametri relativi ai campi dei messaggi H.245
    4. Scrivere ex-novo una parte di codice, da inserire nel Media Controller, che permetta di:
      • Tenere traccia di ogni conferenza, delle connessioni TCP e UDP relative ad essa, delle modifiche fatte ai messaggi H.245 e delle porte usate
      • Implementare il passaggio dei pacchetti RTP contenenti i dati audio-video tra le due reti pubblica e privata, ma anche, volendo, tra due reti private con piani di indirizzamento differenti

    Per quanto riguarda il passaggio dei pacchetti da una rete all'altra lo strumento usato è IPTables, il packet filter del sistema operativo Linux. Tale strumento viene di solito usato come firewall, e quindi permette un controllo "porta per porta" molto efficace. Questa funzionalità ha dato al software realizzato un valore aggiunto in termini di sicurezza. Di IPTables parleremo in un paragrafo successivo. Approfondiremo ora il funzionamento dei protocolli H.245 e RTCP.

    3.3 Il protocollo H.245

    La Raccomandazione H.245 specifica la sintassi e la semantica dei messaggi informativi scambiati dai terminali, come pure le procedure che essi devono usare per negoziazione di tipo "in-band" all'inizio della comunicazione o durante la stessa.

    Questa raccomandazione descrive un certo numero di servizi, alcuni dei quali usufruibili da tutti i terminali, e altri solo da un sottoinsieme di questi.

    Vengono definite delle procedure per permettere lo scambio di capacità dati e audiovisuali; per richiedere la trasmissione di una particolare forma di audio e video (codec); per gestire i canali logici usati per il trasporto delle informazioni audio, video e dati; per stabilire quale dei due terminali sia master e quale slave per scopi di gestione dei canali logici; per trasportare vari segnali di controllo e indicazioni; per controllare il bit rate di ciascun canale logico e di tutto il multiplex; per misurare il round trip delay tra un terminale e l'altro, etc.

    La sintassi dei messaggi viene definita mediante la notazione ASN.1, e la semantica definisce il significato dei messaggi, fornendo inoltre delle restrizioni alla sintassi dell'ASN.1.

    Il protocollo H.245 è stato creato per essere indipendente dal meccanismo di trasporto sottostante, ma s'intende che debba essere usato con uno strato di trasporto affidabile, che garantisca il corretto arrivo a destinazione dei dati.

    Vediamo ora un elenco delle funzionalità per le quali vengono usati i messaggi H.245: verranno commentate solo quelle che risultano di interesse per il nostro caso specifico.

      1. Master-Slave Determination: nel caso di risorse limitate, può essere che più terminali se ne contendano l'uso; per regolamentare una situazione del genere uno dei due terminali agisce come master e l'altro come slave (nel caso di una comunicazione tra due soli terminali). Nel caso di un conflitto vi sono regole che stabiliscono il comportamento del master e dello slave. Lo stato di master o slave di un terminale può essere rideterminato a ciascun punto della conversazione
      2. Capability Exchange: queste procedure assicurano che i dati trasmessi siano di natura tale da poter essere trattati e decodificati adeguatamente da chi li riceve. Ciò richiede che le capacità di ciascun terminale di ricevere e decodificare siano note all'altro. Non è necessario che un terminale comprenda o immagazzini tutte le capability "entranti": se non le "capisce" le ignora semplicemente, e non le usa. Le possibilità complessive di ricezione e decodifica di un terminale vengono rese note all'altro terminale mediante la trasmissione del proprio "capability set". Questi capability set rendono possibile, per esempio, a un terminale, di gestire più di un flusso relativo a un media di uno stesso tipo. I terminali possono riaffermare il loro capability set in qualsiasi momento.
      3. Procedure di segnalazione relative ai canali logici: lo scopo di queste procedure è di assicurare che un terminale sia in grado di ricevere e decodificare i dati che vengono trasmessi su di un canale logico, e che sia pronto a farlo prima che inizi la trasmissione vera e propria. Una sezione del protocollo è dedicata all'apertura di canali bidirezionali: per evitare conflitti viene deciso in anticipo chi dei due terminali sarà master e chi slave.
      4. Richiesta di chiusura di un canale logico da parte del terminale ricevente: un canale logico viene in genere aperto o chiuso dal lato di chi trasmette; esiste una procedura che permette a un terminale ricevente di chiedere la chiusura di un canale logico entrante. Il terminale trasmittente può o meno accettare la richiesta di chiusura. Un terminale potrebbe usare questa procedura, ad esempio, per chiedere la chiusura di un canale che non riesce a decodificare.
      5. Determinazione del Round Trip Delay: in certe applicazioni può essere utile conoscere il ritardo di propagazione tra il terminale ricevente e quello trasmittente. Il protocollo H.245 fornisce i mezzi per calcolare il Round Trip Delay; questo meccanismo può essere utile, tra le altre cose, per sapere se il terminale remoto sta ancora funzionando.

     

     

     

     

     

     

     

     

     

     

     

    3.3.1 Tipi di messaggio H.245

    I messaggi H.245 si dividono in quattro tipi fondamentali:

    I messaggi di richiesta provocano l'esecuzione di un'azione da parte del terminale che li riceve, e richiedono una risposta (conferma) immediata.

    I messaggi di risposta vengono inviati in seguito alla ricezione di un messaggio di richiesta. Quelli di comando impongono un'azione, ma non richiedono una risposta esplicita.

    Infine, i messaggi di indicazione sono solo delle informazioni, che non richiedono né un'azione né una risposta esplicita.

    Con riferimento alle funzionalità esaminate nel primo paragrafo del capitolo, diamo qualche esempio: nella tabella 3.3 sono illustrati tutti i possibili messaggi che due terminali possono scambiare nel corso della procedura di Master Slave Determination, mentre nella tabella 3.4 troviamo quelli relativi alle procedure di gestione dei canali logici.

    Tabella 3.3 Messaggi della procedura MSD

    Denominazione

    Tipo

    Significato

    Master Slave Determination

    Richiesta

    Chiede al ricevente di decidere chi sia il master

    Master Slave Determination Acknowledge

    Risposta

    Restituisce il risultato della decisione

    Master Slave Determination Reject

    Risposta

    Respinge la richiesta di Master Slave Determination

    Master Slave Determination Release

    Indicazione

    In caso di timeout evita che la richiesta rimanga appesa

     

     

     

     

     

     

     

    Tabella 3.4 Messaggi delle procedure relative all'apertura e chiusura di canali logici

    Denominazione

    Tipo

    Significato

    Open Logical Channel

    Richiesta

    Richiede l'apertura di un canale logico unidirezionale con verso "uscente" dal mittente

    Open Logical Channel Acknowledge

    Risposta

    Accetta la richiesta di connessione mediante canale logico

    Open Logical Channel Reject

    Risposta

    Rifiuta la connessione

    Open Logical Channel Confirm

    Indicazione

    Nel caso di canali bidirezionali informa che il canale è aperto in entrambe le direzioni

    Close Logical Channel

    Richiesta

    Usato dal mittente per chiudere una connessione logica

    Close Logical Channel Acknowledge

    Risposta

    Conferma la chiusura della connessione

    Request Channel Close

    Richiesta

    Il mittente richiede all'endpoint remoto di chiudere un canale

    Request Channel Close Acknowledge

    Risposta

    L'endpoint remoto conferma che la connessione verrà chiusa

    Request Channel Close Reject

    Risposta

    L'endpoint remoto rifiuta di chiudere la connessione

    Request Channel Close Release

    Indicazione

    In caso di timeout evita che la richiesta rimanga appesa

     

    3.3.2 Codifica dei messaggi: ASN.1

    L'acronimo significa Abstract Syntax Notation 1, ed è la denominazione di un linguaggio formale, astratto e non ambiguo, che si propone (nientemeno) di rappresentare ogni tipo di dato che può essere scambiato tra due macchine, a livello di strato di applicazione (e quindi indipendentemente da hardware, sistema operativo, etc.).

    Esso permette di descrivere anche strutture dati complesse, incluse quelle con campi di lunghezza variabile o campi la cui presenza è opzionale.

    La codifica di un messaggio nella notazione ASN.1 consiste sostanzialmente nella trasformazione dello stesso in una serie di bit, che verranno poi trasmessi al processo applicativo residente sulla macchina remota e riconvertiti in messaggio da utilizzare; l'effettiva codifica binaria utilizzata è specificata nelle raccomandazioni X.690 (basic encoding rules o BER) e 691 (packet encoding rules o PER).

    BER permette la decodifica dei dati a sistemi che hanno conoscenza della notazione ASN.1 ma non della procedura specifica con la quale i dati sono stati formati; in altre parole il tipo di dato è codificato insieme al valore del dato stesso.

    PER viene usata quando sia il trasmittente che il ricevente si aspettano che i dati abbiano una certa struttura nota ad entrambi; ha una ridondanza molto bassa ed è molto più efficiente.

    I messaggi H.245 usano la codifica PER: per semplicità di decodifica viene usata la variante cosiddetta "allineata", che forza i messaggi ad utilizzare un numero intero di ottetti, e ad usare, se è il caso, bit di riempimento posti a zero (padding).

    Si hanno tipi di dato semplici, quali BOOLEAN e INTEGER, e tipi aggregati, simili alle strutture e agli array dei linguaggi di programmazione più comuni, fino a tipi molto complessi come i seguenti:

    H261VideoCapability ::= SEQUENCE

    {

    qcifMPI INTEGER (1..4) OPTIONAL, -- units 1/29.97 Hz

    cifMPI INTEGER (1..4) OPTIONAL, -- units 1/29.97 Hz

    temporalSpatialTradeOffCapability BOOLEAN,

    ...

    }

    VideoCapability ::= CHOICE

    {

    nonStandard NonStandardParameter,

    h261VideoCapability H261VideoCapability,

    h262VideoCapability H262VideoCapability,

    h263VideoCapability H263VideoCapability,

    is11172VideoCapability IS11172VideoCapability,

    ...

    }

    Figura 3.5 Notazione ASN.1

        1. RTP e RTCP

    Real Time Protocol

    L'acronimo RTP sta per Real-Time Protocol: esso è un protocollo che fornisce dei servizi di trasporto end-to-end per dati con caratteristiche real-time, quali audio e video interattivi.

    Questi servizi includono l'identificazione del tipo di payload, la numerazione delle sequenze, il timestamping e il monitoraggio del trasporto.

    Le applicazioni tipicamente usano RTP su UDP, per sfruttarne i servizi di multiplexing e di checksum; tuttavia RTP può essere usato con altri protocolli sottostanti di rete o di trasporto.

    RTP supporta la trasmissione di dati verso destinazioni multiple usando la distribuzione multicast, se supportata dagli strati sottostanti.

    RTP non fornisce alcun meccanismo per assicurare la consegna dei dati a tempo debito, né alcuna altra garanzia di qualità di servizio, ma fa affidamento sullo strato sottostante per queste funzionalità, qualora esso le supporti.

    Non garantisce la consegna dei pacchetti nell'ordine di trasmissione, né assume che lo strato sottostante sia affidabile e consegni i pacchetti in sequenza.

    I numeri di sequenza inclusi in RTP permettono a chi riceve di ricostruire la sequenza di trasmissione, ma i numeri di sequenza dei pacchetti possono anche essere usati per stabilire la corretta collocazione di un pacchetto, ad esempio nella decodifica video, senza per questo decodificare i pacchetti in sequenza.

    La mancanza di una funzionalità di ritrasmissione in caso di perdita di un pacchetto (come ad esempio nel protocollo TCP) è dovuta alla natura real-time dei dati: se il pacchetto fa parte di una conversazione audio, deve arrivare entro un certo intervallo di tempo, legato alla dimensione del buffer in ricezione. Se giunge, per così dire, "fuori tempo massimo", viene scartato perché non più significativo; se non giunge affatto non ha senso chiederne la ritrasmissione all'applicazione remota.

    Nonostante RTP sia stato creato per soddisfare i bisogni di partecipanti a conferenze multimediali, non è limitato a queste particolari applicazioni: può essere usato anche nell'immagazzinamento di dati di tipo continuo, nella simulazione interattiva distribuita e in applicazioni di misura e di controllo.

    Real Time Control Protocol

    Il protocollo RTP è affiancato da un altro protocollo, detto RTCP.

    Il protocollo di controllo RTCP è bastato sulla trasmissione periodica di pacchetti di controllo da parte dei partecipanti a una conferenza, facendo uso dello stesso meccanismo di trasporto usato per i dati.

    Il protocollo sottostante deve provvedere al multiplexing dei dati e dei pacchetti di controllo, per esempio usando differenti porte UDP.

    RTCP ha quattro funzioni:

    La funzione primaria è quella di fornire un feedback sulla qualità della distribuzione dei dati. Questa è una parte importante del ruolo dell'RTP come protocollo di trasporto, ed è correlata al controllo di flusso e di congestione. Questo feedback può essere usato direttamente da una codifica di tipo adattativo, e comunque è fondamentale per diagnosticare guasti nella distribuzione dei dati. Inoltre, nel caso di una conferenza multipunto, i partecipanti possono valutare se, in caso di problemi, questi siano globali o locali

    RTCP trasporta un identificativo per ciascuna sorgente di flusso RTP, detta Canonical Name, che identifica ogni partecipante ad una conferenza, e permette, in caso di flussi correlati (ad esempio audio e video trasmessi da uno stesso endpoint) di sincronizzarli correttamente

    Le prime due funzioni richiedono che tutti i partecipanti a una conferenza mandino pacchetti RTCP, e quindi, al crescere del numero dei partecipanti, la frequenza di invio viene diminuita, per evitare un forte aumento di traffico sulla rete

    Una quarta funzione, opzionale, è quella di convogliare, nel caso di conferenze multicast, informazioni di sessione, per conferenze non a stretto controllo.

    In una chiamata audio, dopo le varie contrattazioni, le applicazioni residenti su endpoint remoti "conoscono" una coppia di porte: una di queste è usata per i dati audio, l'altra per il controllo RTCP.

    L'applicazione di audioconferenza usata da ciascun partecipante spedisce dati audio in piccoli spezzoni di 20 ms, per esempio; ogni spezzone viene preceduto da un header RTP, e a loro volta header RTP e dati audio vengono inseriti in un pacchetto UDP (vedi figura 3.6).

    Figura 3.6 Pacchettizzazione dei dati audio

    L'header RTP contiene un informazione temporale e un numero di sequenza che permette al ricevitore di ricostruire correttamente la sequenza di trasmissione. Il sequence number può essere usato dal ricevitore anche per valutare il numero di pacchetti persi durante la trasmissione.

    Periodicamente, inoltre, l'applicazione audio spedisce un pacchetto RTCP chiamato Receiver Report, nel quale sono contenute delle statistiche di ricezione, che descrivono la qualità dei dati ricevuti, e l'identificativo del mittente.

    Ripetiamo ancora una volta che i controlli sull'header RTP non vengono effettuati a livello di protocollo, ma, se hanno luogo, è l'applicazione di audioconferenza che li effettua.

    3.4 Strumenti a disposizione

    Dopo aver esposto il problema e presentato lo scenario di partenza, esaminiamo gli strumenti che abbiamo a disposizione.

    3.4.1 Accesso ai messaggi H.245 mediante API

    Il gatekeeper e il Media Controller sono due processi software distinti, che comunicano tra loro scambiandosi dei segnali. Nei rispettivi file di configurazione viene specificato l'indirizzo IP al quale l'uno deve "cercare" l'altro: una volta fatti partire i due processi aprono ciascuno una propria finestra di log, nella quale annunciano di essere a conoscenza delle reciproche esistenze.

    Il gatekeeper funzionerà in modalità H.225 e H.245 routed; inoltrerà "personalmente" i messaggi H.225, mentre nella contrattazione H.225 darà come indirizzo H.245 quello del Media Controller, il quale si incaricherà dell'inoltro dei messaggi H.245.

    Funzionamento del Media Controller

    Le fasi nelle quali interviene l'MC nel corso di una chiamata sono:

    Per i nostri scopi interveniamo solo nella terza fase. Per ogni conferenza in corso ci sarà uno scambio di messaggi H.245, relativi a tale fase. Il Media Controller tiene traccia dei canali logici, numerandoli, e segue l'evoluzione di ciascun canale con un diagramma di stato. L'MC considera "entranti" i messaggi che riceve e "uscenti" quelli che inoltra. Ad ogni evento (l'arrivo o l'inoltro di un messaggio) ci spostiamo in un diverso stato del diagramma.

    Illustriamo il concetto riferendoci alla generica chiamata, per la quale mettiamo in evidenza i soli messaggi H.245 che ci interessano.

    Figura 3. Funzionamento del Media Controller

    Open Logical Channel: contiene indirizzo RTCP del mittente

    Open Logical Channel Acknowledge; contiene indirizzo

    RTCP e RTP del mittente

    L'applicazione riceve i messaggi, ne legge il

    contenuto, e ne riproduce una copia sui

    parametri della quale può intervenire prima

    dell'inoltro all'endpoint di destinazione

    Lo scambio di messaggi illustrato in figura avviene per ogni canale di dati che si vuole aprire tra i due endpoint ( e quindi una volta per l'audio, una per il video, etc.), e per ciascuna direzione, se si tratta di canali unidirezionali (audio e video sono unidirezionali, mentre il canale dati T.120 è bidirezionale).

    L'applicazione software "Media Controller" interpreta lo scambio di messaggi visto secondo i due diagrammi di stato in figura: gli eventi sono rappresentati con degli ovali, mentre gli stati con dei rettangoli.

    Diagramma di stato per il canale aperto da Alice

    Il Media Controller, ricevuto un messaggio, ne memorizza i parametri in una struttura dati apposita, dalla quale poi (è il processo che abbiamo chiamato duplicazione del messaggio) "ricostruisce" il messaggio uscente.

    Le API fornite insieme all'MC permettono l'accesso a tale struttura dati, e offrono la possibilità di cambiare il valore di alcuni campi: ne verrà fuori un messaggio H.245 diverso da quello che è stato ricevuto, modificato secondo i nostri scopi.

    3.4.2 Lo sniffer di pacchetti: Ethereal

    Ethereal è un'applicazione open-source, attualmente inclusa in tutte le maggiori distribuzioni Linux, quali Red Hat, Mandrake, Suse, etc., ma disponibile anche per il sistema operativo Windows.

    Ethereal è un analizzatore di rete (in gergo sniffer); collegato il PC sul quale gira lo sniffer a una LAN, si possono esaminare gli header dei pacchetti IP che circolano su tale LAN. Il programma è strutturato modularmente: per ogni protocollo esiste un modulo capace di eseguirne la decodifica, e di presentare "in chiaro" le informazioni rilevanti. Mano a mano che si succedono le versioni, lo sniffer aggiunge moduli, e acquista la capacità di "leggere dentro" pacchetti che trasportano informazioni relative ai protocolli più disparati.

    Figura 2. Ethereal: esempio di cattura pacchetto.

    Esiste una versione di Ethereal che ha un modulo relativo all'H.323, aggiunto da un programmatore della Philips; tale versione ( la 0.8.15, per la cronaca) offre la possibilità di decodificare tutti i protocolli coinvolti in una chiamata H.323, e di verificare i valori di tutti i parametri.

    Va da sé che questo è lo strumento ideale per analizzare i pacchetti contenenti i messaggi, e controllare i risultati delle modifiche effettuate al codice di partenza.

        1. Il "motore" che muove i pacchetti: IPTables

    Un packet filter è un software che "guarda" nell'header dei pacchetti, e in base a quello che vi legge ne decide il fato; può decidere di scartarli, come se non fossero mai esistiti, oppure di accettarli, oppure ancora di respingerli (li scartiamo ma avvertiamo chi ce li ha spediti), e altre cose ancora.

    In Linux il packet filtering è inserito nel kernel, sotto forma di un modulo.

    Dalle versioni del kernel 2.4.x tale modulo fa parte di un ambiente più ampio detto NetFilter. NetFilter è configurato in 3 "tabelle", ognuna delle quali è costituita da vari filtri. A sua volta ogni filtro contiene delle regole: una regola è una definizione del tipo "Se l'header del pacchetto ha queste caratteristiche allora fai questa cosa"; l'azione da compiere sul pacchetto si chiama "target".

    Riassumiamo lo schema in una.tabella!.

    Tabelle

    Catene presenti nella tabella

    Target validi nella tabella

    FILTER

    INPUT

    FORWARD

    OUTPUT

    ACCEPT

    DROP

    REJECT

    RETURN

    QUEUE

    STOLEN

    REPEAT

    NAT

    OUTPUT

    PREROUTING

    POSTROUTING

    DNAT

    SNAT

    MASQUERADE

    REDIRECT

    MANGLE

    OUTPUT

    PREROUTING

    MARK

    TOS

     

    Esempio: come i pacchetti attraversano la tabella FILTER

     

     

     

     

    La tabella di filtro contiene altri tre filtri predefiniti, detti "catene del firewall", o semplicemente "catene".

    Le tre catene vengono chiamate INPUT, FORWARD e OUTPUT, e sono rappresentate in figura dagli ovali omonimi.

    Una catena consiste in una lista di regole: se il pacchetto non corrisponde alle caratteristiche cercate si passa alla regola successiva. Esaurita la lista di regole il kernel guarda qual è la "politica" predefinita della catena (ad esempio DENY, oppure ACCEPT), per decidere cosa fare del pacchetto. Il funzionamento si può riassumere nei seguenti punti:

      1. Per ogni pacchetto entrante (ad esempio attraverso l'interfaccia Ethernet) il kernel guarda dov'è diretto (routing)
      2. Se è diretto alla macchina stessa il pacchetto viene passato alla catena di Input: se riesce ad attraversarla un eventuale processo in attesa del pacchetto lo riceverà
      3. Se il pacchetto è diretto a un'altra macchina vi sono due possibilità:
        • Se la macchina locale non è abilitata al forwarding dei pacchetti il pacchetto viene scartato
        • Se il forwarding è abilitato, e il pacchetto è destinato ad un'altra interfaccia Ethernet (se ne avete più di una), il pacchetto viene passato alla catena Forward; se la attraversa verrà spedito "fuori"
      4. Anche un programma che gira localmente può spedire pacchetti: questi passano direttamente alla catena Output, e se la attraversano continueranno il percorso verso l'interfaccia alla quale sono destinati

    IPTables ci dà la possibilità di agire a diversi livelli, dalla singola regola alla creazione di una nuova catena. Vediamo qualche esempio

    Operazioni su una singola regola

    Ogni regola specifica un insieme di condizioni che il pacchetto deve soddisfare, e un "target", ovvero le azioni da compiere sul pacchetto se questo soddisfa le condizioni elencate.

    Ad esempio, per aggiungere una regola alla catena INPUT della tabella FILTER che scarti i pacchetti ICMP provenienti dall'host di indirizzo IP 10.244.116.50, il comando è:

    >iptables A INPUT s 10.244.116.50 p icmp j DROP

    e va interpretato nel modo seguente:

    Specifiche di filtraggio

    Operazioni su intere catene

    La tabella di NAT

    Questa è la tabella che ci interessa maggiormente, dato che ci offre la possibilità di cambiare l'indirizzo sorgente o destinazione di un pacchetto IP: è questa che useremo per far passare i pacchetti UDP che trasportano i dati real-time da una rete all'altra.

    Distingueremo tra DNAT, e cioè Destination NAT, e SNAT, cioè Source NAT; il primo andrà a intervenire nel campo destination e il secondo nel campo source del pacchetto IP esaminato.

    Le regole che aggiungeremo in questa tabella saranno aggiunte dal codice realizzato: vedremo i dettagli nel prossimo capitolo

     

     





    Page hosted at Laboratorio Telematico at Info-Com
    Last Update ven gen 31 18:03:32 CET 2003