NAT e Firewall traversal
NAT: Network Address Translation

Motivazione: la rete locale usa un solo IP per comunicare con
l’esterno:

non è più necessario richiedere un IP per ogni host
collegato

posso cambiare gli indirizzi interni senza che il mondo
esterno ne risenta

posso cambiare ISP senza dover cambiare gli IP di
tutte le macchine

è una prima forma di firewalling: i dispositivi interni
non sono direttamente raggiungibili (192.168.0.1
Network Layer
oppure 10.0.0.1 non sono
indirizzi validi all’esterno). 4-2
NAT: Network Address Translation
2: Il router NAT
cambia i datagrammi
uscenti da
10.0.0.1, 3345 a
138.76.29.7, 5001,
e aggiorna la tabella
NAT translation table
WAN side addr
LAN side addr
1: l’host 10.0.0.1
manda datagramma a
128.119.40.186, 80
138.76.29.7, 5001 10.0.0.1, 3345
……
……
S: 10.0.0.1, 3345
D: 128.119.40.186, 80
10.0.0.1
1
2
S: 138.76.29.7, 5001
D: 128.119.40.186, 80
138.76.29.7
S: 128.119.40.186, 80
D: 138.76.29.7, 5001
3: Arriva risposta
destinata a:
138.76.29.7, 5001
3
10.0.0.4
S: 128.119.40.186, 80
D: 10.0.0.1, 3345
10.0.0.2
4
10.0.0.3
4: Il router NAT cambia
l’indirizzo e porta di destinazione
138.76.29.7, 5001 to 10.0.0.1, 3345
Network Layer
4-3
NAT: Network Address Translation
Implementazione: Un router NAT deve:

datagrammi uscenti: cambiare IP sorgente, numero di porta
con (Indirizzo router NAT, nuovo num. di porta)
i client remoti rispondono credendo di avere a che fare con
una connessione aperta su
(Indirizzo router NAT, nuovo num. di porta)

ricordare (in una tabella speciale detta NAT translation table)
ogni coppia (indirizzo interno, porta) <->(nuova porta)

datagrammi entranti: cambiare
(Indirizzo router NAT, nuova porta) nei campi destinazione in
base alla tabella di traduzione
Network Layer
4-4
NAT: Network Address Translation

Non più di 16 bit per indicare il num di porta:


Tutta la sottorete può avere al più 60000 porte
simultanee
Contraddizioni e incongruenze:



I router non dovrebbero alterare i protocolli di livello
4 (trasporto)
I P2P soffrono. In generale ci può essere un solo
server su ogni porta (e.g. un solo server web su
porta 80, ecc.)
Risolve temporaneamente il problema dei pochi
indirizzi
Network Layer
4-5
Port Forwarding
4: Il router NAT
cambia i datagrammi
uscenti da
10.0.0.1, 80 a
138.76.29.7, 80
NAT forwarding table
WAN side addr
LAN side addr
3: l’host 10.0.0.1
manda datagramma a
128.119.40.186, 501
138.76.29.7, 80 10.0.0.1, 80
……
……
S: 10.0.0.1, 80
D: 128.119.40.186,501
10.0.0.1
3
4
S: 138.76.29.7, 80
D: 128.119.40.186, 501
138.76.29.7
S: 128.119.40.186, 501
D: 138.76.29.7, 80
1: Arriva richiesta
destinata a:
138.76.29.7, 80
10.0.0.4
S: 128.119.40.186, 501
D: 10.0.0.1, 80
10.0.0.2
2
1
2: Il router NAT cambia
l’INDIRIZZO di destinazione
138.76.29.7 a 10.0.0.1
Questa tabella è fissata manualmente. Il server interno deve avere IP FISSATO.
10.0.0.3
NAT e altri protocolli di trasporto
NAT e ICMP

Non è possibile basarsi sul numero di porta, si
usa il campo “ident” proprio dei messaggi ICMP
NAT e GRE

Un solo tunnel GRE nei router più semplici
iptables –A FORWARD –p 47 –j ACCEPT
iptables –A FORWARD –i eth0 –p tcp –-dport 1723 –m state –state ESTABLISHED,
RELATED –j ACCEPT
iptables –FORWARD –o eth1 –p tcp –-sport 1723 –m state –state ESTABLISHED,
RELATED–j ACCEPT
NAT e connessioni P2P

Considerate due peer, Alice e Bob

Alice e Bob fuori NAT (con IP pubblico):


Alice e Bob dentro NAT (senza IP pubblico o Port
Forwarding):


Possono aprire liberamente connessioni reciproche
I due non possono aprire una mutua connessione TCP,
né dialogare direttamente via UDP
Alice dentro NAT, Bob fuori NAT

Alice può aprire connessioni verso Bob, non viceversa
(ma Bob può usare il “callback” via server)
Network Layer
4-8
Come Skype & Co. Riescono ad
aggirare un firewall/router NAT?
Firewall


Per assicurare protezione dalle possibili
minacce delle rete i computers vengono in
genere posizionati dietro un firewall, la cui
funzione è tipicamente svolta da un router
Questo implica che non è possibile per un
malintenzionato indirizzare un PC direttamente
dall'esterno (le connessioni devono essere
instaurate dall'interno)
Un Firewall è un problema…

Quando 2 computers (dietro firewalls NAT)
devono comunicare direttamente tra di loro

Ad esempio se i rispettivi utenti vogliono chiamarsi
usando software VoIP


chiunque tra le due parti avvii una chiamata, il firewall del
destinatario
bloccherà
l‘apparente
attacco
semplicemente ignorando i pacchetti di dati
Almeno questo è quanto un amministratore di rete si
aspetterebbe...
Firewall hole punching


In realtà sappiamo che Skype funziona anche
dietro un firewall NAT, così come se fosse
direttamente connesso ad internet
Il motivo è che questi tipi di software hanno
escogitato una soluzione per il problema..
Osservazioni

Un firewall deve normalmente far si che i pacchetti possano
attraversare la rete locale


Un firewall deve inoltrare i dati provenienti dall'esterno su una
workstation nella LAN


gli utenti devono poter visitare siti web, usare la posta etc..
fa questo solo se ha la certezza che un pacchetto è la risposta ad un
pacchetto di dati in uscita
Un router firewall/NAT mantiene informazioni su quali macchine
interne hanno comunicato con quale computer esterno e su
quali porte (connection tracking)
The trick


Il trucchetto usato dal software VoIP consiste nel
“convincere” il firewall che è stata stabilita una
connessione alla quale dovrebbe associare i
successivi pacchetti in ingresso
Il fatto che dati audio per VoIP siano inviati usando il
protocollo UDP (che non è orientato alla connessione)
costituisce un vantaggio per software come Skype

con UDP un firewall vede solo indirizzi e porte
sorgente/destinazione e se per un pacchetto UDP in
ingresso corrisponde una entry della tabella NAT, il
pacchetto viene inoltrato sul computer interno
Switching


Lo switching server, con cui ambo le parti sono in
costante contatto, gioca un ruolo rilevante
nell'instaurare una connessione tramite Skype

Ciò avviene tramite una connessione TCP che gli stessi
clients stabiliscono

Il server Skype perciò sa sempre sotto quale indirizzo un
utente Skype è in quel momento disponibile su internet
Ove possibile le connessioni telefoniche non vengono
effettuate tramite il server Skype (o tramite altri peer)
ma piuttosto i clients si scambiano i dati direttamente
Esempio

Alice vuole chiamare Bob

Il suo client Skype lo comunica al server Skype

Il server Skype conosce già qualcosa di Alice


Dalla richiesta in ingresso vede che Alice è registrata con
l'indirizzo IP 1.1.1.1 e un controllo rivela che i suoi dati audio
provengono sempre dalla porta UDP 1414
Il server Skype passa questa informazione al client
Skype di Bob

che in accordo al suo database, è registrato con l'indirizzo IP
2.2.2.2 e che utilizza la porta UDP 2828
Passo 1: Alice (visibile in rete con IP 1.1.1.1) vorrebbe chiamare Bob.
Bob viene notificato di questo tramite lo Skype Server
Step 2: Bob cerca di contattare Alice su IP e porta noti. Il
router/firewall di Bob consente questo marcando il datagramma
uscente come NEW. Successive risposte di Alice saranno
marcate come ESTABLISHED (legate al primo datagramma di
Bob)
Esempio


Il programma Skype di Bob a questo punto crea un
buco nel firewall della sua rete dovuto all’invio di un
pacchetto UDP all’indirizzo 1.1.1.1 sulla porta 1414
Quest’ultimo viene scartato dal firewall di Alice,
all’insaputa del firewall di Bob

a questo punto il firewall di Bob pensa che quel che proviene
dall’indirizzo 1.1.1.1 sulla porta 1414 ed è indirizzato a Bob
(indirizzo 2.2.2.2 e porta 2828) è legittimo (cioè deve essere
una risposta correlata alla conversazione iniziata da Bob)
Esempio


A questo punto il server Skype passa le
coordinate di Bob ad Alice, il cui programma
Skype cercherà di contattare Bob all'indirizzo
2.2.2.2:2828
Il firewall di Bob associa i datagrammi di Alice
ad una conversazione nota ed iniziata da Bob,
e invia la risposta sul PC di Bob (il cui telefono
Skype squilla)
Step 3: Alice finally reaches Bobs computer through the hole.
Nota

Questa descrizione semplificata dipende dalle
caratteristiche specifiche del firewall usato e
corrisponde al comportamento che si registra
durante il setup di una connessione tra due
clients Skype, ciascuno dietro un firewall Linux
(firewalls NAT per una LAN che consentono
traffico in uscita di tipo UDP)
Linux NAT

Le funzioni di Linux NAT hanno la proprietà VoIP friendly di non
modificare, almeno inizialmente, le porte dei pacchetti in uscita


Il router NAT semplicemente rimpiazza l'indirizzo IP locale con il proprio
indirizzo, mentre la porta sorgente UDP selezionata da Skype viene
mantenuta
Solo se più clients sulla rete locale usano la stessa porta
sorgente allora il router NAT resetta il valore della porta ad uno
non utilizzato in precedenza

ogni assegnamento di indirizzi IP e porte deve poter essere assegnato
attribuito in modo non ambiguo ad una connessione tra due computer

Il router deve ricostruire in seguito l'indirizzo IP interno del mittente
originario dalla porta di destinazione della risposta
Altri routers NAT

Altri routers NAT cercano di assegnare le porte
in un range di valori specifici


ad esempio si usano porte da 30.000 in poi e
trasformano la porta UDP 1414, se possibile, sulla
31414
Questo tuttavia non è un problema per Skype

La procedura descritta continua a funzionare senza
limitazioni, purchè sia possibile ricostruire dal valore
di porta di Alice il valore di porta sostituito dal suo
router.
Complicazione

Diventa più complesso se un firewall semplicemente
assegna le porte in sequenza

Check Point's FireWall-1: la prima connessione è asseganta
a 30001, poi 30002, etc.

Il server Skype è in grado di sapere che Bob sta parlando
con lui dalla porta 31234, ma la connessione con Alice verrà
effettuata tramite una porta diversa
NAT Testing
Come un router NAT commerciale rialloca le
porte?

http://nattest.net.in.tum.de/?mod=publications
Complicazione

Ma anche in questo caso Skype è in grado di superare
il firewall
1.
Tentando di attraversare tutte le porte sopra la 31234 in
sequenza, nella speranza di trovare quella giusta
2.
Se la prima strada fallisce, il programma Skype di Bob può
aprire una nuova connessione con il server Skype, la porta
sorgente del quale viene usata per una ulteriore sequenza
di probes
Skype can do port scans. Here it suceeds on port 38901 and
connects through the firewall.
Problema: necessità di predire i
due numeri di porta





Tuttavia, in una rete attiva Alice potrebbe non trovare
la giusta porta aperta
Lo stesso si verifica per un particolare tipo di firewall,
che assegna ogni nuova connessione a una porta
sorgente casuale
In questi casi il server Skype non è in grado di dire ad
Alice dove individuare un buco nel firewall di Bob
In questi casi un server Skype (o un cosiddetto superpeer) è usato come un relay
https://secure.wikimedia.org/wikipedia/en/wiki/Network
_address_translation
Server Skype come relay

Accetta le connessioni entranti sia da Alice che da
Bob e trasmette i pacchetti progressivamente

Questa soluzione è fattibile a patto che il firewall consenta
traffico UDP in uscita

Implica tuttavia un carico aggiuntivo sulla infrastruttura
perchè tutti i dati audio devono essere gestiti dai server di
Skype

Il tempo di trasmissione inoltre può anche provocare uno
sgradevole ritardo
UDP hole punching

Questo tipo di procedura non è limitata a Skype
ed è nota sotto il nome di "UDP hole punching“

Altri servizi di rete come l’applicazione VPN Hamachi
gaming, che si basa sulla comunicazione peer-to-peer tra
computers dietro firewalls usa procedure simili

RFC 3489 "Simple Traversal of UDP through NAT" (STUN)
descrive un protocollo che con 2 STUN clients può aggirare
le restrizioni di NAT con l’aiuto di un server STUN
DIY hole punching

Per provare UDP hole punching:

hping3 + netcat (Linux)

Local è un computer dietro un firewall Linux (local-
fw) con un firewall stateful che consente solo
connessioni in uscita UDP

Per semplicità, nel nostro esperimento il computer
di prova remote è direttamente connesso a internet
DIY hole punching

Avviare il listener UDP sulla porta UDP 14141 sulla
console local/1 dietro il firewall:
local/1# nc -u –l 14141 oppure
local/1# nc -u –l -p 14141

Un computer esterno remote tenta di contattarlo:
remote# echo "hello" | nc -p 53 -u local-fw 14141


Ovviamente nulla viene ricevuto su local/1 e, grazie al firewall,
nulla viene restituito a remote.
Ora su una seconda console, local/2, hping3 crea un buco nel
firewall:
local/2# hping3 -c 1 --udp -s 14141 -p 53 remote
DIY hole punching

Finchè remote non riuscirà ad effettuare il comando
nc, riceverà una risposta di "port unreachable" tramite
ICMP. Ma al secondo tentativo:
remote# echo "hello" | nc -p 53 -u local-fw 14141

Il listener netcat sulla console local/1 sputa un
"hello" (il pacchetto UDP che dall’esterno ha
attraversato il firewall ed è arrivato al calcolatore dietro
di esso)
DIY hole punching

Amministratori di rete che non gradissero
questo tipo di comportamento nei loro firewall o
preoccupati per eventuali abusi hanno una
unica opzione: bloccare il traffico UDP in uscita
o limitarlo a casi specifici

UDP non è essenziale per il normale traffico
internet (web, e-mail usano TCP, ma non DNS)

Streaming protocols (voIP, etc.) potrebbero avere
problemi perche utilizzano UDP

Resta possibile fare hole punching via TCP…
Sorpresa!





hole punching funziona anche con TCP
Dopo un pacchetto in uscita di tipo SYN il firewall o router NAT
inoltrerà i pacchetti in ingresso con gli opportuni indirizzi IP e
porte verso la LAN anche se non confermano, o confermano un
numero di sequenza errato (ACK).
I firewalls Linux non riescono a valutare questa informazione in
modo consistente
Instaurare una connessione TCP non è così semplice, perché
Alice non ha il numero di sequenza inviato nel primo pacchetto
di Bob
Il pacchetto contenente questa informazione è stato scartato
dal suo firewall
Scarica

server Skype