Premessa: il protocollo SIP e’ un protocollo “birbo” e normalmente NON viene nattato correttamente se non configurando opportunamente il file sip.conf di Asterisk !
Due reti dedicate al VOIP:
– una rete privata 192.168.47.0/24
– una rete pubblica
Asterisk:
– un server asterisk locale (di cui ho il controllo)
– un server asterisk remoto (di cui non ho il controllo)
Firewall (Debian 7.x):
– scheda di rete eth7 con ip pubblico e relative regole di routing configurate correttamente
– scheda di rete eth2 con ip 192.168.47.254
– masq di shorewall configurato per nattare i pacchetti provenienti dal server asterisk interno sulla scheda eth7
Server asterisk:
– scheda di rete eth0 con ip 192.168.47.2 gw 192.168.47.254
Problema: il mio asterisk locale non riesce a connettersi tramite protocollo SIP al server asterisk remoto.
Note:
– le rotte sono corrette
– le regole di firewalling sono corrette
– masq configurato correttamente
– dal server asterisk locale verso quello remoto pingo senza problemi
– se lancio un nmap sulla porta 5060 udp (sip) dal server asterisk locale a quello remoto vedo che la porta è aperta
Questa la parte più curiosa lanciondo un tcpdump sulla porta eth7 del firewall:
– quando eseguo il comando nmap dal server asterisk locale, l’ip di origine è quello pubblico (e questo è corretto, dato che sto nattando)
– quando asterisk (il servizio asterisk) prova a connettersi tramite il protocollo sip al server asterisk remoto, tcpdump mostra come ip di origine l’indirizzo 192.168.47.2 (quello del server asterisk locale)
Quesito: perchè ?
Dalla versione 6.x di Debian alla versione 7.x alcune cose sono cambiate:
– la versione di shorewall, che uso per configurare opportunamente iptables
– alcuni moduli aggiuntivi del kernel particolarmente interessanti
Nello specifico, per quanto riguarda SIP: questi sono i moduli del kernel “nf_conntrack_sip” e “nf_nat_sip”.
Questi due moduli sono in grado di gestire il NAT del protocollo SIP al posto di Asterisk e a partire dal Kernel 3.5 e Shorewall 4.5.7 di poter restringere ulteriormente il numero di porte da mantenere aperte per consentire al protocollo SIP di funzionare.
”
Each helper monitors traffic to/from the default primary port used by the application and opens the firewall to accept temporary connections created by the primary session.
”
In sostanza, il compito di questi helper è quello di aprire dinamicamente le porte analizzando la “tipologia” di traffico… questo consente di restringere notevolmente il numero di regole statiche da configurare lato firewall.
Tornando alla domanda: perchè passando dalla versione 6.x di Debian alla versione 7.0 quello che prima andava (nat del protocollo SIP dal server Asterisk interno verso quello esterno) ora non funziona più ?
Risposta: perchè Asterisk, configurato per nattare il protocollo SIP, modifica i pacchetti (incapsulamento) e successivamente gli helper tornano a loro volta a modificare i pacchetti.
Soluzione 1:
– disabilitare gli helper e lasciare che Asterisk continui a “nattare” il protocollo SIP (copiare il file /usr/share/shorewall/helpers in /etc/shorewall e commentare le righe “loadmodule nf_conntrack_sip” e “loadmodule nf_nat_sip”
Soluzione 2:
– lasciare attivi gli helper e modificare Asterisk perchè i pacchetti SIP _NON_ vengano “nattati” (impostare il valore “nat=no” nella sezione “general” del file “sip.conf”)
Qui il giochino degli helper è spiegato molto bene:
http://shorewall.net/Helpers.html