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.



June 1st, 2009 on 12:23 am