VoIP and Hacking

Crittare il VoIP di Asterisk con Zebedee

by admin on May.31, 2009, under Asterisk, Hacking, Linux, Sicurezza, Telefonia, Tools, VoIP

Ho parlato in un post precedente di come si possa utilizzare un channel IAX2 su OpenVPN per crittare il VoIP di Asterisk.
Questa volta voglio presentare un secondo metodo, concettualmente simile, ma in grado di offrire alcuni vantaggi in termini di leggerezza e velocità.

Zebedee è un programma in grado di stabilire un tunnel compresso e criptato di traffico TCP/IP o UDP tra due sistemi.
Solitamente sono due i sistemi coinvolti quando si imposta un tunnel tramite Zebedee. Tuttavia, i differenti sistemi interessati potrebbero essere anche quattro, come mostra lo schema seguente:

[source] <===> [client] <=====> [server] <===> [target]

Il client Zebedee opera sul sistema “client” ed il server opera sul “server” host. La iniziale connessione che fa in modo che sia stabilito un tunnel tra client e server, origina dalla macchina “source”. Potrebbe trattarsi di un sistema differente da quello sul quale è in esecuzione il client Zebedee, sebbene sia solitamente lo stesso. Il server comunicherà a sua volta col sistema “target”. Server e target sono di solito la stessa macchina, ma non necessariamente.

In un tunnel Zebedee sono previsti differenti tipi di chiave per rendere sicura la connessione. Client e server generano o vengono provvisti con chiave private. Queste vengono utilizzate per calcolare una chiave pubblica che viene scambiata ed usata per ricavarne una chiave segreta condivisa tramite il meccanismo di negoziazione Diffie-Hellman. Da questa chiave condivisa viene ricavata una chiave di sessione per proteggere una singola connessione tra client e server.

Il comportamento di Zebedee può venire meglio controllato tramite l’ uso di un file di configurazione. Questo può venire specificato con la opzione -f della linea di comando.

Per stabilire il tunnel necessario a criptare il traffico IAX ho impostato:

su asterisk_host1 (server)

# cat /etc/zebedee/zeb_server.conf
verbosity 3
logfile /var/log/zeb_server.log
server true
udpmode true
target localhost:4569:udp
compression zlib:9
maxbufsize 4100

su asterisk_host2 (client)

# cat /etc/zebedee/zeb_client.conf
verbosity 3
logfile /var/log/zeb_client.log
server false
udpmode true
serverhost 192.168.1.10
serverport 11230
compression zlib:9
maxbufsize 4100
tunnel 4570/udp:192.168.1.10:4569

Le keywords coinvolte ed il loro significato sono descritti di seguito:

server (parametro -s della riga di comando)
Valore boolean indicante se il programma debba operare da client o da server. Per default opera come client se questa keyword non viene specificata. La opzione -s della linea di comando equivale a impostare tale keyword a true.

verbosity (parametro -v)
Un intero  che specifica il livello di logging, con 0 a rappresentare unicamente i messaggi di errore, e 5 a offrire dettagli significativi del traffico. Il livello di default è 1 (generalmente il più adeguato).
I messaggi vengono scritti sullo standard error (stderr), a meno che non vengano rediretti usando l’opzione -o della linea di comando o la keyword logfile.

udpmode (parametro -u)
Per default Zebedee gestisce traffico TCP/IP. Se questa keyword è impostata a true Zebedee gestisce invece traffico UDP/IP.
Il tunnel tra clients e servers Zebedee utilizza comunque una connessione TCP/IP .

target
Specifica un target host ed, opzionalmente, una lista di porte verso cui il server accetterà di redirigere i dati. É quindi una stringa consistente nel nome del target host seguito dal simbolo dei due punti e da una lista di porte.

compression (parametro -z)
Indica il livello di compressione
Zebedee supporta sia la compressione zlib che, se abilitata in fase di compilazione, quella bzip2. Tale valore viene espresso nella forma tipo:livello dove tipo è “zlib” oppure “bzip2″ e livello è un intero compreso fra 0 e 9. Un integro senza alcun prefisso implicitamente seleziona un livello di compressione zlib.
Il livello di compressione usato è il minore tra i valori di client e server. Tutti i livelli bzip2 (eccetto 0) sono considerati più grandi di tutti i livelli zlib cosicché, nel caso in cui il client, oppure il server, non supporti bzip2 il protocollo utilizzi zlib. Il valore di default relativo alla compressione è “zlib:6″.

serverhost
Rappresenta il nome (o l’indirizzo IP) del server Zebedee cui connettersi.

serverport (parametro -T)
Rappresenta la porta sulla quale il server Zebedee è in ascolto per connessioni tunnellizzate. Quella di default è la 11965 operando in TCP mode o modalità mista. È la 11230 in UDP-only mode.

Il tunnel viene attuato impartendo semplicemente su entrambe:

# zebedee -f /etc/zebedee/zeb.conf

Il riscontro dell’ avvenuta operazione la si ha, lato server, tramite:

# cat /var/log/zeb_server.log
zebedee(18557/84512):    detaching from terminal
zebedee(18558/84512):  waiting for connection on port 11230

e lato client:

# cat /var/log/zeb_server.log
zebedee(7885/4272):    client listener routine entered
zebedee(7885/4272):    creating local listener socket for port 4570
zebedee(7885/4272):  Listening on local port 4570
zebedee(7885/4272):    detaching from terminal
zebedee(7886/4272):  listening for client data

Una volta stabilito il tunnel l’impostazione dei due nodi Asterisk perché potessero comunicare attraverso di esso è stata la seguente:

# cat /etc/asterisk/iax.conf (su asterisk_host1)
[...]
[iaxline]
type=friend
context=from_host2
username=iaxline
secret=shared_password
host=dynamic
qualify=yes
allow=alaw
[...]


# cat /etc/asterisk/iax.conf (su asterisk_host2)
[...]
register => iaxline:shared_password@127.0.0.1:4570
[iaxline]
type=friend
context=fron_host1
username=iaxline
secret=shared_password
host=127.0.0.1
qualify=yes
allow=alaw
[...]

Al lancio dei due servizi Asterisk, il nodo asterisk_host2 si registra regolarmente sul nodo asterisk_host1, come riscontrabile sulla console di quest’ultimo:

*CLI>     -- Registered IAX2 'iaxline' (AUTHENTICATED) at 127.0.0.1:34056
*CLI> iax2 show peers
Name/Username    Host                 Mask             Port          Status
iaxline/iaxline  127.0.0.1       (D)  255.255.255.255  34056         OK (11 ms)
1 iax2 peers [1 online, 0 offline, 0 unmonitored]

contemporaneamente, una connessione TCP risulta stabilita tra le due macchine:

# netstat -t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address             Foreign Address            State
tcp        0      0 asterisk_host1:11230      asterisk_host2:35170       ESTABLISHED

I test di chiamata effettuati tra i due pbx, attraverso il tunnel ed in rete locale, hanno dato sempre risultati ottimi anche impostando il massimo livello di compressione.
È proprio qui che si evidenziano alcuni dati interessanti relativamente alla occupazione di banda:

senza compressione:

192.168.1.10     => 192.168.1.200      78.1Kb  78.3Kb  77.6Kb
192.168.1.200 <= 192.168.1.10 78.1Kb  78.2Kb  77.5Kb
192.168.1.10     => 192.168.1.3        85.6Kb  85.4Kb  84.5Kb
192.168.1.3 <= 192.168.1.10 85.7Kb  85.4Kb  84.5Kb

con compressione zlib (livello 9)

192.168.1.10     => 192.168.1.200      78.9Kb  78.4Kb  77.4Kb
192.168.1.200 <= 192.168.1.10 78.9Kb  78.4Kb  77.4Kb
192.168.1.10     => 192.168.1.3        43.3Kb  43.1Kb  42.2Kb
192.168.1.3 <= 192.168.1.10 85.7Kb  84.2Kb  83.2Kb

con compressione bzip2 (livello 9)

192.168.1.10     => 192.168.1.200      78.5Kb  78.3Kb  77.9Kb
192.168.1.200 <= 192.168.1.10 78.4Kb  78.2Kb  77.9Kb
192.168.1.10     => 192.168.1.3        56.3Kb  56.2Kb  54.2Kb
192.168.1.3 <= 192.168.1.10 85.1Kb  84.9Kb  84.5Kb

Se in tutti i tre test l’occupazione di banda relativa al terminale SIP che origina la chiamata (192.168.1.200) è coerentemente identica e simmetrica, i risultati migliori vengono stranamente ottenuti con compressione zlib e denotano una ripartizione asimmetrica nel consumo di banda, come se i dati risultassero compressi solamente in una direzione.
Incuriosito, ho provato anche ad utilizzare un secondo tunnel speculare, e variando di conseguenza le varie configurazioni, ma ottenendo risultati pressoché analoghi.
A parte questo il tunnel iax/zebedee si qualifica come una ottima soluzione, molto leggera e veloce, in grado di assicurare una privacy pressoché totale.

Send post as PDF to PDF | PDF Creator | PDF Converter
:, , , , , ,

Cerchi qualcosa in particolare?

Usa il form qui sotto per cercare nel sito:

Blogroll!

Alcuni links...

Archives

Tutte le entries, in ordine cronologio...