Pokud odešleme přes NAT UDP packet, zůstane po nějaký čas v NATu "díra" pro odpověď. Tuto "díru" může obvykle využít i jiný počítač, než ten, kterému byl UDP packet poslán. Jen se o ní musí dozvědět. K tomu slouží STUN server.
Full Cone NAT přiřazuje venkovní port na základě zdrojové IP adresy a portu. Pokud krátce po sobě přistoupím z jednoho portu (z počítače za NATem) na 2 venkovní IP adresy, použije se stejný venkovní port (port na vnější straně NATu). Tento venkovní port poté může využít libovolný počítač s libovolným zdrojovým portem.
Restricted Cone NAT funguje stejně jako Full Cone NAT, ale "díru" v NATU může využít jen ten počítač, kterému byl UDP packet směřován. Může ale posílat packety z libovolného portu.
Port Restricted Cone NAT se od Restricted Cone NATu liší v tom, že "díru" v NATU může využít jen ten počítač, kterému byl UDP packet směřován a musí použít jako zdrojový ten port, na který byl UDP packet poslán.
Symetric NAT funguje stejně jako Port Restricted Cone NAT, ale pokud krátce po sobě přistoupím z jednoho portu na 2 venkovní IP adresy, NAT použije 2 různé venkovní porty a do každé z těchto 2 "děr" může posílat UDP packety jen ten počítač, kterému je ta "díra" určena a musí použít jako zdrojový port ten port, na který mu byl UDP packet poslán.
STUN protokol slouží ke zjištění typu NATu a veřejné IP adresy a portu.
Well known port pro STUN je 3478.
STUN server umožňuje 2 typy žádosti - Binding Request a Shared Secret Request. Shared Secret Request (výhradně přes TCP s použitím TLS) slouží k získání username/password páru a k autentizaci následných Binding Requestů (do Binding Request uvedu username a server v Binding Response uvede příslušné password). Binding Request slouží ke zjištění veřejné IP adresy a portu. V základní variantě na Binding Request UDP packet server odpoví Binding Response packetem do jehož vnitřku nakopíruje IP adresu a port, ze které přišel Binding Request. To umožní zjistit klientovi, jestli je vůbec za NATem, či jestli není celý UDP provoz blokován. Ke zjištění typu NATu slouží příznaky "change IP" a "change port", které způsobí, že STUN server odpoví z jiné IP adresy, nebo portu. Dále si může klient v žádosti specifikovat na kterou IP adresu a port se má odpovídat (server v odpovědi uvede navíc i IP adresu ze které žádost přišla, aby se případně vědělo, kdo stojí za DOS útokem).
STUN packety jsou binární, obsahují v hlavičce typ packetu, délku a ID (ID odpovědi je vždy identická s ID žádosti). V těle jsou potom za sebou uvedeny jednotlivé atributy. Atribut se skládá z typu, délky a hodnoty.
Packety jsou typu:
Atributy jsou typu:
| 0x0001 | MAPPED-ADDRESS | V ní nám server sděluje naši veřejnou IP adresu a port. |
| 0x0002 | RESPONSE-ADDRESS | Kam se má poslat odpověd. |
| 0x0003 | CHANGE-REQUEST | Požadavek na odpověď z jiné IP adresy či portu. |
| 0x0004 | SOURCE-ADDRESS | Adresa ze které nám server odpovídá. |
| 0x0005 | CHANGED-ADDRESS | Odkud se poslala odpověď v případě CHANGE-REQUESTu. |
| 0x0006 | USERNAME | Mohu uvést v Binding Requestu, server potom odpoví PASSWORDem. |
| 0x0007 | PASSWORD | Server uvede do Binding Response, pokud bylo v žádosti USERNAME. |
| 0x0008 | MESSAGE-INTEGRITY | Kontrolní součet. Musí být uveden jako poslední atribut. |
| 0x0009 | ERROR-CODE | Chybový kód v Error packetech. |
| 0x000a | UNKNOWN-ATTRIBUTES | Seznam neznámých atributů v error packetech. |
| 0x000b | REFLECTED-FROM | V případě uvedení RESPONSE-ADDRESS informuje příjemce, kdo zaslal původní žádost. |
Detaily viz RFC 3489.
Držíme díru otevřenou posíláním UDP packetů (díra vydrží obvykle jen 30s), a domluvíme si konexi přes např. SIP kam uvedeme svoji veřejnou IP adresu a port do položky Contact. Pokud nejsme za Symetrickým NATem máme vyhráno.