Martin Hejna - STUN

Simple Traversal of UDP over NATs

Předneseno 30.5.2006 na Linuxovém semináři

UDP hole punching

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.

NATy si můžeme rozdělit do 4 skupin:

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.

Typy NATů

STUN

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.

Známe veřejnou IP adresu a port, co s tím?

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.

Další techniky pro průchod UDP NATem

Odkazy