16
Banda Larga / Re: Problemi di NAT
« il: 22 Gennaio 2008, 20:18:43 »
Ciao a tutti.
Dunque, dopo aver letto il post di Andrea, mi sono messo a pensare, ed ho tirato fuori la teoria che vi espongo qui. E' solo una mia teoria, se avete voglia leggetevela e sappiatemi dire che ne pensate. Io attualmente non ho più tempo (ne ho già speso troppo vicino a questa storia), quindi la verifica di questa teoria la farò più in là.
Prima di tutto, preciso che la telefonia VoIP è basata principalmente su due flussi di informazioni: quello che gestisce lo stabilimento di una connessione tra i due utenti che si chiamano (gestito dal protocollo SIP), e quello che regola il trasporto della voce (protocollo RTP). Giacchè il funzionare / non funzionare del mio ATA è determinato principalmente dalla porta impostata come ascolto / generazione di pacchetti SIP, ne deduco che il problema sta in questo protocollo, mentre l'RTP funziona bene.
La prima fase della telefonia VoIP consiste nella registrazione della linea su un server SIP. Per compiere questo scopo, il mio ATA genera un pacchetto SIP di registrazione, contenente tra le altre cose un header VIA. In tale header, l'ATA deve inserire l'indirizzo (IP:porta) a cui è raggiungibile, ovvero a cui il SIP Proxy deve inviare la risposta alla registrazione. Servendosi dello STUN Server, l'ATA riesce ad ottenere l'informazione su quale sia il suo indirizzo pubblico, ed inserisce questo indirizzo all'interno dell'header VIA.
Supponiamo che lo STUN Server non sia in grado di adempiere completamente al suo compito, ovvero sia in grado di fornire all'ATA l'indirizzo IP pubblico, ma non la porta pubblica.
Caso A (quello che non funziona):
l'indirizzo privato dell'ATA 192.168.1.2:5060 viene sostituito dall'indirizzo pubblico 89.202.179.222:5060.
Caso B (quello che funziona):
l'indirizzo privato dell'ATA 192.168.1.2:4444 viene sostituito dall'indirizzo pubblico 89.202.179.222:4444.
Il pacchetto SIP di registrazione viene a questo punto spedito al mio router. Esso cambia l'indirizzo IP sorgente nel pacchetto IP che incapsula la richiesta SIP:
192.168.1.2 => 172.16.x.y
Quanto alla porta, supponiamo che il mio router la mappi sullo stesso numero di porta SE QUESTO NON E' ANCORA STATO ASSEGNATO AD ALTRE RICHIESTE. Nel mio caso è così, quindi nel pacchetto IP si hanno queste sorgenti:
Caso A: 172.16.x.y:5060
Caso B: 172.16.x.y:4444
Il pacchetto giunge a questo punto al router di Unipex, che supponiamo adotti la stessa politica del mio router circa la mappatura della porta. Il caso B risulta "avantaggiato", perchè la porta 4444 difficilmente è utilizzata da altre richieste di altri utenti. Il caso A invece risulta "svantaggiato", perchè l'utente medio che si trova a configurare un ATA come il mio tende a lasciare sull'ATA la porta privata di default, ovvero la 5060. Il che significa che è possibile che la porta pubblica 5060 sia già stata assegnata a qualcun altro. Il pacchetto IP uscente dal router di Unipex avrà allora questi valori di indirizzo sorgente:
Caso A: 89.202.179.222:4704
Caso B: 89.202.179.222:4444
ove si è supposto che la 4704 sia la porta pubblica assegnata dal router di Unipex alla richiesta partita dalla porta privata 5060 del mio ATA.
La richiesta SIP giunge al SIP Proxy, che se la vede arrivare da questi indirizzi:
Caso A: 89.202.179.222:4704
Caso B: 89.202.179.222:4444
(ovviamente gli stessi di prima). Tuttavia, nel caso A c'è una discrepanza tra questo indirizzo pubblico, e quello che è stato inserito inizialmente dall'ATA (tramite STUN) nell'header VIA della richiesta SIP.
Il server SIP consente la registrazione (se le credenziali sono esatte), e genera la risposta "AUTORIZZATO" per l'ATA. Supponiamo che il SIP Proxy sia stato impostato per inviare la risposta alla richiesta, in caso di discrepanza, non (come si dovrebbe fare normalmente) all'indirizzo letto nell'header VIA della richiesta, bensì all'indirizzo da cui la richiesta è arrivata (questo è possibile, lo prevede il protocollo SIP). Supponiamo anche (altra cosa prevista dal protocollo) che il SIP Proxy sia stato impostato in modo tale da segnalare all'ATA la discrepanza negli indirizzi in questione.
Caso A:
il SIP Server inserisce, nell'header VIA della risposta, questo parametro: rport=4704, ad indicare che si è visto arrivare la richiesta dalla porta 4704, quando nell'header VIA l'ATA aveva specificato come porta pubblica la 5060.
La risposta viene inviata all'indirizzo 89.202.179.222:4704.
Caso B:
non c'è alcuna discrepanza negli indirizzi, il SIP Server spedisce la risposta a 89.202.179.222:4444.
In entrambi i casi, il router di Unipex sarà in grado di indirizzare il pacchetto al mio IP 172.16.x.y:5060/4444, dal momento che l'associazione nelle tabelle di NAT è presente per opera della richiesta di registrazione partita dall'ATA.
Il pacchetto raggiunge infine il mio router, che di nuovo sarà (in entrambi i casi) in grado di spedirlo all'ATA, che a questo punto si considera registrato. Il SIP Proxy sa (essendo l'ATA registrato, con ad esempio il numero di telefono 1234) che per raggiungere il numero 1234, deve spedire richieste agli indirizzi:
Caso A: 89.202.179.222:4704 (perchè così è stato impostato in caso di discrepanze)
Caso B: 89.202.179.222:4444 (nessuna discrepanza)
Il mio problema si manifestava solo ed esclusivamente nelle chiamate in entrata.
Supponiamo quindi che un fisso chiama il numero 1234. Una tabella reindirizza questo numero al gateway VoIP più vicino, ovvero il chiamante viene messo in contatto con questo gateway. Il gateway in questione si darà da fare per cercare presso chi è registrato il numero 1234, lancerà apposite richieste ai vari servers SIP, e una tra esse raggiungerà il mio SIP Proxy. Esso si accorge che il numero richiesto dal fisso è registrato presso di se, e sa come raggiungerlo. Pertanto inoltra la richiesta all'indirizzo:
Caso A: 89.202.179.222:4704
Caso B: 89.202.179.222:4444
La richiesta raggiunge il mio ATA (perchè le tabelle di NAT hanno ancora il "percorso" aperto grazie a dei messaggi di Keep-Alive, inviati appositamente e periodicamente dall'ATA verso il SIP Proxy). Il mio telefono squilla.
Io alzo la cornetta. L'ATA si accorge che ho acconsentito alla chiamata, quindi spedisce un messaggio di conferma al mio SIP Proxy (stesso discorso visto per la spedizione della richiesta di registrazione), e dal canto suo il SIP Proxy trasmetterà la conferma al gateway VoIP da cui è partita la chiamata.
A questo punto, il SIP Proxy si chiama fuori, dal momento che se la devono sbrigare il mio ATA, ed il gateway VoIP. Essi devono sapere come raggiungersi, e per poter fare ciò il SIP Proxy ha fornito all'ATA l'indirizzo del gateway (durante la segnalazione dal proxy all'ATA che qualcuno mi stava chiamando), ed ha fornito al gateway l'indirizzo (pubblico) dell'ATA (durante l'invio dal proxy al gateway della conferma che il numero 1234 ha accettato la chiamata). Ma quale indirizzo viene spedito al gateway? Supponiamo che il SIP Proxy fornisca l'indirizzo che trova nella mia conferma, inviata dopo il sollevamento della cornetta:
Caso A: 89.202.179.222:5060 (perchè STUN non ha mai fatto bene il suo lavoro)
Caso B: 89.202.179.222:4444 (neanche qui STUN ha fatto il suo lavoro, ma la porta è stata rimappata sullo stesso numero)
Supponiamo infine che sia il chiamante a dover cominciare la conversazione SIP (mi pare lo faccia realmente, con un messaggio di Acknowledgement). I pacchetti SIP dovrebbero a questo punto servire per negoziare il codec, le porte UDP per il trasporto della voce, ... . Il gateway deve spedire i pacchetti SIP al mio ATA, e lo farà a questi indirizzi:
Caso A: 89.202.179.222:5060
Caso B: 89.202.179.222:4444
Ma nel caso A l'indirizzo è errato, dal momento che il router di Unipex non detiene la corrispondenza.
Quindi nel caso A la comunicazione SIP tra gateway e ATA è compromessa, pertanto non si avrà neanche il corrispondente transito di RTP, nonostante io abbia sentito il telefono squillare.
Il caso B invece funziona, ammesso però che comunque sia il mio ATA (che è sotto NAT) ad inviare preventivamente un messaggio al gateway (che per esempio viene ignorato da questo), giusto per far sì che il router di Unipex possa ricevere (sugli indirizzi 89.202.179.222:4704 del caso A e 89.202.179.222:4444del caso B) pacchetti dal gateway, che altrimenti sarebbero scartati.
Nel caso fossi stato io a chiamare, invece, avrei dovuto lanciare io l'ACK al gateway, e sempre nell'ipotesi che il gateway inviasse poi risposte all'indirizzo da cui si vede arrivare le richieste, il dialogo sarebbe stato correttamente stabilito.
Sono solo ipotesi, ma alcune cose mi sono state confermate dai pacchetti SIP che ho avuto modo di esaminare, in entrata ed in uscita dall'ATA, come ad esempio l'inserimento da parte del SIP Proxy del parametro rport.
Concorda con questa teoria anche il fatto che, nel caso A, tutto funzionava se bypassavo ciò che STUN trovava, ovvero inserendo nel parametro "Mapped SIP Port" il valore statico 4704. Questo confermerebbe che la porta viene effettivamente mappata dal router di Unipex, ma STUN non funziona completamente.
Se avete tempo di darci una letta...
Ciao ciao.
P.S.: se la teoria fosse valida, non servirebbe fare uso di un IP pubblico (come vi ripeto, io sono sotto NAT ed attualmente non ho problemi di alcun tipo, se non un po' di eco ogni tanto). Basterebbe far sì che STUN funzioni (cosa impossibile da compiere dalla mia parte), o basterebbe far sì che l'ATA bypassi lo STUN, inserendo nell'header VIA non l'indirizzo fornito da STUN, bensì la coppia "received:rport" fornita dal SIP Proxy all'ATA durante la registrazione di quest'ultimo. Questo può essere fatto.
Grazie ancora!
Dunque, dopo aver letto il post di Andrea, mi sono messo a pensare, ed ho tirato fuori la teoria che vi espongo qui. E' solo una mia teoria, se avete voglia leggetevela e sappiatemi dire che ne pensate. Io attualmente non ho più tempo (ne ho già speso troppo vicino a questa storia), quindi la verifica di questa teoria la farò più in là.
Prima di tutto, preciso che la telefonia VoIP è basata principalmente su due flussi di informazioni: quello che gestisce lo stabilimento di una connessione tra i due utenti che si chiamano (gestito dal protocollo SIP), e quello che regola il trasporto della voce (protocollo RTP). Giacchè il funzionare / non funzionare del mio ATA è determinato principalmente dalla porta impostata come ascolto / generazione di pacchetti SIP, ne deduco che il problema sta in questo protocollo, mentre l'RTP funziona bene.
La prima fase della telefonia VoIP consiste nella registrazione della linea su un server SIP. Per compiere questo scopo, il mio ATA genera un pacchetto SIP di registrazione, contenente tra le altre cose un header VIA. In tale header, l'ATA deve inserire l'indirizzo (IP:porta) a cui è raggiungibile, ovvero a cui il SIP Proxy deve inviare la risposta alla registrazione. Servendosi dello STUN Server, l'ATA riesce ad ottenere l'informazione su quale sia il suo indirizzo pubblico, ed inserisce questo indirizzo all'interno dell'header VIA.
Supponiamo che lo STUN Server non sia in grado di adempiere completamente al suo compito, ovvero sia in grado di fornire all'ATA l'indirizzo IP pubblico, ma non la porta pubblica.
Caso A (quello che non funziona):
l'indirizzo privato dell'ATA 192.168.1.2:5060 viene sostituito dall'indirizzo pubblico 89.202.179.222:5060.
Caso B (quello che funziona):
l'indirizzo privato dell'ATA 192.168.1.2:4444 viene sostituito dall'indirizzo pubblico 89.202.179.222:4444.
Il pacchetto SIP di registrazione viene a questo punto spedito al mio router. Esso cambia l'indirizzo IP sorgente nel pacchetto IP che incapsula la richiesta SIP:
192.168.1.2 => 172.16.x.y
Quanto alla porta, supponiamo che il mio router la mappi sullo stesso numero di porta SE QUESTO NON E' ANCORA STATO ASSEGNATO AD ALTRE RICHIESTE. Nel mio caso è così, quindi nel pacchetto IP si hanno queste sorgenti:
Caso A: 172.16.x.y:5060
Caso B: 172.16.x.y:4444
Il pacchetto giunge a questo punto al router di Unipex, che supponiamo adotti la stessa politica del mio router circa la mappatura della porta. Il caso B risulta "avantaggiato", perchè la porta 4444 difficilmente è utilizzata da altre richieste di altri utenti. Il caso A invece risulta "svantaggiato", perchè l'utente medio che si trova a configurare un ATA come il mio tende a lasciare sull'ATA la porta privata di default, ovvero la 5060. Il che significa che è possibile che la porta pubblica 5060 sia già stata assegnata a qualcun altro. Il pacchetto IP uscente dal router di Unipex avrà allora questi valori di indirizzo sorgente:
Caso A: 89.202.179.222:4704
Caso B: 89.202.179.222:4444
ove si è supposto che la 4704 sia la porta pubblica assegnata dal router di Unipex alla richiesta partita dalla porta privata 5060 del mio ATA.
La richiesta SIP giunge al SIP Proxy, che se la vede arrivare da questi indirizzi:
Caso A: 89.202.179.222:4704
Caso B: 89.202.179.222:4444
(ovviamente gli stessi di prima). Tuttavia, nel caso A c'è una discrepanza tra questo indirizzo pubblico, e quello che è stato inserito inizialmente dall'ATA (tramite STUN) nell'header VIA della richiesta SIP.
Il server SIP consente la registrazione (se le credenziali sono esatte), e genera la risposta "AUTORIZZATO" per l'ATA. Supponiamo che il SIP Proxy sia stato impostato per inviare la risposta alla richiesta, in caso di discrepanza, non (come si dovrebbe fare normalmente) all'indirizzo letto nell'header VIA della richiesta, bensì all'indirizzo da cui la richiesta è arrivata (questo è possibile, lo prevede il protocollo SIP). Supponiamo anche (altra cosa prevista dal protocollo) che il SIP Proxy sia stato impostato in modo tale da segnalare all'ATA la discrepanza negli indirizzi in questione.
Caso A:
il SIP Server inserisce, nell'header VIA della risposta, questo parametro: rport=4704, ad indicare che si è visto arrivare la richiesta dalla porta 4704, quando nell'header VIA l'ATA aveva specificato come porta pubblica la 5060.
La risposta viene inviata all'indirizzo 89.202.179.222:4704.
Caso B:
non c'è alcuna discrepanza negli indirizzi, il SIP Server spedisce la risposta a 89.202.179.222:4444.
In entrambi i casi, il router di Unipex sarà in grado di indirizzare il pacchetto al mio IP 172.16.x.y:5060/4444, dal momento che l'associazione nelle tabelle di NAT è presente per opera della richiesta di registrazione partita dall'ATA.
Il pacchetto raggiunge infine il mio router, che di nuovo sarà (in entrambi i casi) in grado di spedirlo all'ATA, che a questo punto si considera registrato. Il SIP Proxy sa (essendo l'ATA registrato, con ad esempio il numero di telefono 1234) che per raggiungere il numero 1234, deve spedire richieste agli indirizzi:
Caso A: 89.202.179.222:4704 (perchè così è stato impostato in caso di discrepanze)
Caso B: 89.202.179.222:4444 (nessuna discrepanza)
Il mio problema si manifestava solo ed esclusivamente nelle chiamate in entrata.
Supponiamo quindi che un fisso chiama il numero 1234. Una tabella reindirizza questo numero al gateway VoIP più vicino, ovvero il chiamante viene messo in contatto con questo gateway. Il gateway in questione si darà da fare per cercare presso chi è registrato il numero 1234, lancerà apposite richieste ai vari servers SIP, e una tra esse raggiungerà il mio SIP Proxy. Esso si accorge che il numero richiesto dal fisso è registrato presso di se, e sa come raggiungerlo. Pertanto inoltra la richiesta all'indirizzo:
Caso A: 89.202.179.222:4704
Caso B: 89.202.179.222:4444
La richiesta raggiunge il mio ATA (perchè le tabelle di NAT hanno ancora il "percorso" aperto grazie a dei messaggi di Keep-Alive, inviati appositamente e periodicamente dall'ATA verso il SIP Proxy). Il mio telefono squilla.
Io alzo la cornetta. L'ATA si accorge che ho acconsentito alla chiamata, quindi spedisce un messaggio di conferma al mio SIP Proxy (stesso discorso visto per la spedizione della richiesta di registrazione), e dal canto suo il SIP Proxy trasmetterà la conferma al gateway VoIP da cui è partita la chiamata.
A questo punto, il SIP Proxy si chiama fuori, dal momento che se la devono sbrigare il mio ATA, ed il gateway VoIP. Essi devono sapere come raggiungersi, e per poter fare ciò il SIP Proxy ha fornito all'ATA l'indirizzo del gateway (durante la segnalazione dal proxy all'ATA che qualcuno mi stava chiamando), ed ha fornito al gateway l'indirizzo (pubblico) dell'ATA (durante l'invio dal proxy al gateway della conferma che il numero 1234 ha accettato la chiamata). Ma quale indirizzo viene spedito al gateway? Supponiamo che il SIP Proxy fornisca l'indirizzo che trova nella mia conferma, inviata dopo il sollevamento della cornetta:
Caso A: 89.202.179.222:5060 (perchè STUN non ha mai fatto bene il suo lavoro)
Caso B: 89.202.179.222:4444 (neanche qui STUN ha fatto il suo lavoro, ma la porta è stata rimappata sullo stesso numero)
Supponiamo infine che sia il chiamante a dover cominciare la conversazione SIP (mi pare lo faccia realmente, con un messaggio di Acknowledgement). I pacchetti SIP dovrebbero a questo punto servire per negoziare il codec, le porte UDP per il trasporto della voce, ... . Il gateway deve spedire i pacchetti SIP al mio ATA, e lo farà a questi indirizzi:
Caso A: 89.202.179.222:5060
Caso B: 89.202.179.222:4444
Ma nel caso A l'indirizzo è errato, dal momento che il router di Unipex non detiene la corrispondenza.
Quindi nel caso A la comunicazione SIP tra gateway e ATA è compromessa, pertanto non si avrà neanche il corrispondente transito di RTP, nonostante io abbia sentito il telefono squillare.
Il caso B invece funziona, ammesso però che comunque sia il mio ATA (che è sotto NAT) ad inviare preventivamente un messaggio al gateway (che per esempio viene ignorato da questo), giusto per far sì che il router di Unipex possa ricevere (sugli indirizzi 89.202.179.222:4704 del caso A e 89.202.179.222:4444del caso B) pacchetti dal gateway, che altrimenti sarebbero scartati.
Nel caso fossi stato io a chiamare, invece, avrei dovuto lanciare io l'ACK al gateway, e sempre nell'ipotesi che il gateway inviasse poi risposte all'indirizzo da cui si vede arrivare le richieste, il dialogo sarebbe stato correttamente stabilito.
Sono solo ipotesi, ma alcune cose mi sono state confermate dai pacchetti SIP che ho avuto modo di esaminare, in entrata ed in uscita dall'ATA, come ad esempio l'inserimento da parte del SIP Proxy del parametro rport.
Concorda con questa teoria anche il fatto che, nel caso A, tutto funzionava se bypassavo ciò che STUN trovava, ovvero inserendo nel parametro "Mapped SIP Port" il valore statico 4704. Questo confermerebbe che la porta viene effettivamente mappata dal router di Unipex, ma STUN non funziona completamente.
Se avete tempo di darci una letta...
Ciao ciao.
P.S.: se la teoria fosse valida, non servirebbe fare uso di un IP pubblico (come vi ripeto, io sono sotto NAT ed attualmente non ho problemi di alcun tipo, se non un po' di eco ogni tanto). Basterebbe far sì che STUN funzioni (cosa impossibile da compiere dalla mia parte), o basterebbe far sì che l'ATA bypassi lo STUN, inserendo nell'header VIA non l'indirizzo fornito da STUN, bensì la coppia "received:rport" fornita dal SIP Proxy all'ATA durante la registrazione di quest'ultimo. Questo può essere fatto.
Grazie ancora!


