# Hole punching

L'hole punching (o talvolta punch-through) è una tecnica di attraversamento NAT utilizzata nelle reti informatiche per stabilire una connessione diretta tra due parti in cui una o entrambe si trovano dietro un firewall o dietro un router che utilizza la tecnica NAT. Per eseguire il punching (bucherellamento), ciascun client si connette a un server di terze parti senza restrizioni che memorizza temporaneamente le informazioni sugli indirizzi esterni ed interni e sulle porte per ciascun client. Il server poi trasmette le informazioni di ogni client all'altro, e utilizzando queste informazioni ciascun client tenta di stabilire una connessione diretta; come risultato delle connessioni che utilizzano numeri di porta validi, i firewall o i router accettano e inoltrano i pacchetti in ingresso sulla rete privata.
L'hole punching non richiede alcuna conoscenza della topologia della rete per funzionare, poiché utilizzano a seconda dei casi l'Internet Control Message Protocol, l'User Datagram Protocol o il Transmission Control Protocol.

## Panoramica

I dispositivi di rete con indirizzi IP pubblici o globalmente accessibili possono creare facilmente connessioni tra di loro. I client con indirizzi privati possono anche connettersi facilmente ai server pubblici, purché sia il client dietro un router o un firewall a iniziare la connessione. Tuttavia sono necessarie delle tecniche di attraversamento NAT, come appunto l'hole punching, per stabilire una connessione diretta tra due client che si trovano dietro firewall o router differenti che utilizzano il NAT.
Entrambi i client iniziano una connessione verso un server senza restrizioni, che annota le informazioni sulle connessioni, incluso l'indirizzo IP pubblico e la porta, insieme all'indirizzo IP privato ed alla porta. I router annotano anch'essi gli endpoint per consentire alle risposte del server di tornare ai rispettivi. Il server invia quindi le informazioni sugli endpoint e sulla sessione di ciascun client all'altro client (o peer). Ogni client tenta di connettersi al peer tramite l'indirizzo IP e la porta specificati che il router del peer ha aperto per il server. Il nuovo tentativo di connessione "buca" il firewall del client, poiché l'endpoint diventa ora aperto per ricevere una risposta dal peer. A seconda delle condizioni della rete, uno o entrambi i client potrebbero ricevere una richiesta di connessione. L'avvenuto scambio di un nonce di autenticazione tra entrambi i client indica il completamento della procedura di hole punching.

## Esempi

Le applicazioni VoIP, giochi di rete e software basati sull'architettura di rete P2P possono utilizzare tecniche di hole punching.
* L'applicazione VoIP Skype utilizza l'hole punching per consentire agli utenti di comunicare con uno o più utenti vocalmente.
* I giochi online multigiocatore veloci possono utilizzare una tecnica di hole punching o richiedere che gli utenti creino un pinhole (cioè una porta aperta nel firewall) per ridurre la latenza di rete.
* Le applicazioni di VPN come LogMeIn Hamachi, ZeroTier e Tailscale utilizzano l'hole punching per consentire agli utenti di connettersi direttamente ai dispositivi presenti dietro firewall.
* I software peer-to-peer di file sharing decentralizzato si affidano allhole punching per la distribuzione di file.