NAT Traversal
Note: work in progress
Overview
NAT (Network Address Translation) is widely used to connect private networks to the internet. The main idea is to map several private IP addresses to only one public IP address. Having in mind that P2P network clients should be able to communicate with each other, one basic question comes into mind: how can internet hosts communicate with a host in a private network? We will first have a look at NAT itself and problems it brings. Then, we show how to traverse NATs by either changing router's configuration or by using other tricks.
Network Address Translation
A network address is simply the IP address ( + Port number for UDP/TCP). A NAT router receives an incoming IP packet, saves the address in its NAT table, rewrites sender address to one of its public addresses and sends the packet to the destination address. Now, the NAT router accepts incoming packets on this public address (NAT endpoint). These packets are forwarded to the private host. The most important facts are:
- The mapping depends on the sender's port number. If the private host uses two different outgoing port numbers, the NAT endpoints will differ.
- The private host has to send first. Otherwise no incoming packets will be forwarded to the private host.
- The client does not know all that... (NAT should be completely transparent to the client)
The behavior of the NAT router is not standardized. The only thing that works with every NAT router is simple request and answer. That means the remote host answers a request using the port number the client used for its request. Some NATs allow replies from other ports or even hosts, some use different endpoint mappings for every session.
According to their behavior, NATs can be classified into four types:
- Full Cone
- Restricted Cone
- Port Restricted Cone
- Symmetric
Full Cone NAT |
Restricted Cone NAT |
Port Restricted Cone NAT |
Symmetric NAT |
Router configuration
todo
Port forwarding
Ein probates Mittel für NAT-Traversal ist die manuelle Konfiguration des NAT-Routers. Dabei wird der NAT-Router so konfiguriert, dass er bestimmte Datenpakete an einen bestimmtem lokalen Rechner weiterleitet. Die Weiterleitung bestimmt der NAT-Router in der Regel auf Grund des Zielportes im Datenpaket. Der NAT-Router benötigt somit für das Port-Forwarding eine Portnummer (bzw. einen Portbereich) und die IP-Adresse des lokalen Rechners. Über diese feste Weiterleitung anhand der Portnummer ist der lokale Rechner außerhalb des Netzwerkes über diesen festgelegten Port (bzw. Portbereich) erreichbar (NAT-Traversal).
Der grosse Vorteil vom Port-Forwarding ist, dass es für viele Anwendungsfälle die einzig wirklich funktionierende NAT-Traversal-Technik darstellt. Demgegenüber stehen jedoch einige Nachteile:
- Andere lokale Rechner können durch die feste Zuordnung von einer Portnummer zu einen bestimmten Rechner, diesen Port nicht nutzen
- viele Anwendungen wählen den Port dynamisch, so dass dieser vorher schwer bestimmbar ist oder wählen einen Port aus einem grossen Port-Bereich
- Port-Forwarding setzt einen Zugang zum Router und technisches Verständnis voraus
UPnP
Eine andere Möglichkeit, ausgehend vom Port-Forwarding, ist den Vorgang der Routerkonfiguration zu automatisieren. Der Gedanke hierbei ist, dass Anwendungen auf den lokalen Rechnern den NAT-Router nach ihren Bedürfnissen steuern können. Die Bedürfnisse hierbei sind vor allem das Port-Forwarding und die Kenntnis darüber welche öffentliche IP-Adresse der NAT-Router besitzt. Es wird bei dieser Technik davon ausgegangen, dass sich im lokalen Netzwerk, indem sich die loklalen Rechner und der NAT-Router befinden, niemand mit böswilliger Absicht aufhält und der Zugang zum lokalen Netzwerk entsprechend gesichert ist. Durch diese Technik werden einige Nachteile des manuellen Port-Forwarding behoben. Realisiert werden kann diese NAT-Traversal-Technik durch "Universal Plug and Play" (UPnP). UPnP wurde 1999 durch das UPnP-Forum spezifiziert und wird von diesem ständig weiterentwickelt. UPnP wurde nicht für NAT-Traversal entwickelt, sondern für eine herstellerunabhängige Steuerung von elektronischen Geräten über ein IP-Netzwerk und kann somit für NAT-Traversal benutzt werden. UPnP wurde so entworfen, dass es bereits vorhandene Netzwerkprotokolle und Datenformate, wie HTTP, SSDP, XML, usw. benutzt. Voraussetzung für die Implementierung von UPnP auf einem Gerät ist, dass auf diesem ein Betriebssystem und eine Netzwerkschnittstelle vorhanden ist. Viele im Handel erhältliche NAT-Router unterstützen bereits UPnP, sodass NAT-Traversal mittels UPnP bereits in Anwendung ist. Der allgemeine Ablauf für eine Kommunikation zwischen einem UPnP-Gerät (z.B. NAT-Router) und einem UPnP-Kontrollpunkt (z.B. lokaler Rechner) sieht im Groben folgendermaßen aus:
- Das UPnP-Gerät macht sich und seine Dienste im lokalen Netzwerk über Multicast bekannt. Der UPnP-Kontrollpunkt erhält über diese Multicast-Nachrichten (Simple Service Discovery Protocol) Information darüber, um was für ein Gerät es sich handelt (z.B. Internet Gateway Device, Printer Device, HVAC (heating, ventilation, air conditioning) usw.) und unter welcher Adresse er detaillierte Informationen über das Gerät erhalten kann.
- Der UPnP-Kontrollpunkt kann sich über diese Adresse die detaillierte Geräte- und Dienstbeschreibung (XML) vom Gerät holen.
- Anhand dieser Informationen wird der Kontrollpunkt in die Lage versetzt, das Gerät zu steuern. Der Kontrollpunkt kann nun über spezielle Nachrichten (SOAP) Aktionen aufrufen (z.B. AddPortMapping).
Aufgrund der vom UPnP-Forum standardisierten Geräte kann diese Kommunikation mit einem UPnP-Gerät durch eine Client-Anwendung ausgeführt werden.
STUN
todo
TURN
todo
Hole punching
Hole punching deals with the problem that two clients have behind NAT routers, when they want to establish direct connections. Here, a client A cannot establish a connection with client B, because B is behind a NAT and vice versa. However, using a slightly modified STUN server enables both clients to obtain the public NAT endpoint addresses and the clients' private addresses. Now hole punching can be tried: both clients send messages to one another. Now, the following happens: client A's message is the first one. It will be rejected or dropped at B's NAT. Hence, A's NAT opened a public endpoint for A's connection. Now, B sends his message. This message will be forwarded by A's NAT. As a result, both NATs have open endpoints; direct communication is established. One special case is when A and B send their messages synchronously. Here, both messages will reach their targets. What about Symmetric NAT? That's the problem case hole punching cannot handle. We require public endpoint addresses obtained by STUN; so here is the failure. Symmetric NAT assigns different endpoints to different communication partners, so connection attempts from other servers than the STUN server automatically fail. |
|
Since hole punching works for two clients behind different NATs, we now focus on a special case when two clients are behind the same NAT. Remember the restrictions to the STUN protocol: the clients may find out they are behind the same NAT, but they actually do not know whether they are in the same private network (--> cascaded NATs). |
Conclusion: hole punching is not a cure-all for traversing NATs, but works fine for Cone-type NATs. Symmetric NATs cannot be traversed by using these simple methods.
Hairpin translation is a special case for hole punching and may allow direct communication for clients behind the same symmetric NAT. If all that does not work, the fallback strategy is to establish relayed connections using the TURN protocol.
NAT and Voice over IP
NAT-Traversal bei Voice over IP (VoIP) gilt als sehr problematisch und wird daher kurz für SIP/SDP-basiertes Voice over IP vorgestellt. Die Problematik für VoIP besteht darin, dass die NAT-Traversal-Technik die Latenzzeiten für Signalisierungs- und Sprachdaten nicht erhöhen sollte, da sonst die Qualität des Gespräches darunter leidet. Des Weiteren wird VoIP zunehmend als kommerzielles Produkt angeboten, womit NAT-Traversal für den Absatz eine wichtige Rolle spielt. Gerade im privaten Bereich werden zunehmend NAT-Router eingesetzt. Die NAT-Traversal-Technik darf somit kein technisches Verständnis voraussetzen. Auch die Trennung beim SIP basiertem Voice over IP zwischen dem Aufbau eines Gesprächs und dem Gespräch selber stellt hohe Anforderungen an die NAT-Traversal-Technik.
Allgemeine Ablauf bei VoIP
Ein VoIP-Client nutzt einem ihm vorher bekannten Server (SIP-Proxy des VoIP-Anbieters), um sich bei ihm zu registrieren. Diese Registration ist wichtig für die Signalisierung von eingehenden Anrufen. Bei einem Verbindungsaufbauwunsch sendet der Client eine entsprechende Nachricht an seinen SIP-Proxy, der diese dann entsprechend der VoIP-Zieladresse weiterleitet. Der Angerufene empfängt daraufhin den Verbindungsaufbauwunsch von seinem SIP-Proxy und hat die Möglichkeit das Gespräch anzunehmen. Bei Gesprächsannahme, wird die Annahme wieder über die SIP-Proxies dem Anrufer mitgeteilt und eine direkte Kommunikation zwischen den beiden Parteien beginnt.
Problematik anhand eines Beispiels
Um die Problematik bei VoIP mit NAT zu verdeutlichen, wird in einem Beispiel vereinfachend angenommen, dass sich nur ein Rechner hinter einem NAT-Router befindet. Bei diesem Rechner (Rechner A) besteht nun die Problematik, dass er sich mit einer öffentlichen IP-Adresse beim SIP-Proxy registrieren muss (Punkt 1 in Figure 7). Dem Rechner A ist aber ohne Hilfmittel nur seine lokale, private IP-Adresse bekannt und nicht die des NAT-Routers unter der er für den SIP-Proxy erreichbar wäre. Bei einem Anruf von A nach B mittels SIP-Nachricht, befindet sich im Payload der SIP-Nachricht das Session Description Protocol (SDP), in dem unter anderem die IP-Adresse von A zur direkten Kommunikation mit B verzeichnet ist (Punkt 2 in Figure 7). In der Regel wird zur direkten Kommunikation das Real Time Protocal (RTP) eingesetzt, das aber wiederrum einen extra Port zu Steuerung der Datenstroms benötigt. Die Schwierigkeit für A besteht nun darin, beim Verbindungsaufbau dem Rechner B eine IP-Adresse sowie zwei Portnummern mitzuteilen über die er zur direkten Kommunikation erreichbar ist (Punkt 2 in Figure 7). Dies bedeutet, dass der Rechner A sicherstellen muss, dass Datenpakete, die an diese Adresse geschickt werden, der NAT-Router an ihn weitergeleit. Bei Gesprächsannahme von B (Punkt 3 in Figure 7) schickt dieser nämlich sofort Sprachdaten an A (Punkt 4 in Figure 7). Ein weiteres Problem besteht darin, dass das NAT-Binding zum SIP-Proxy, das bei der Registrierung von A entsteht, am NAT-Router nach einer gewissen Zeit auslaufen kann und der NAT-Router Datenpakete vom SIP-Proxy (z.B. ankommende Anrufe) nicht an A weiterleitet. Die Schwierigkeit für NAT-Traversal erhöht sich natürlich, wenn sich z.B. beide Gesprächspartner hinter einem oder sogar demselben NAT-Router befinden. Neben diesen Problemen besteht zusätzlich die Anforderung, dass die NAT-Traversal-Technik die Qualität des Gespräches nicht herabsetzt, also Signalisierungsdaten oder Sprachdaten nicht verzögert. |
Aktuelle Lösung
Bekannte VoIP-Anbieter (z.B. Sipgate, 1und1, Nikotel, usw.) benutzen vor allem STUN für NAT-Traversal. Dazu stellen die Anbieter STUN-Server zur Verfügung (z.B. stun.1und1.de, stun.sipgate.net), die den VoIP-Clients bekannt sind. Die STUN-Server der Anbieter führen in der Regel keine Authentifizierung durch, so dass sie allgemein nutzbar sind. Sie werden vor allem dazu genutzt die öffentliche IP-Adresse des NAT-Routers herauszufinden (Punkt 1 in Figure 7) und zum Erzeugen von NAT-Bindings am NAT-Router, die dann je nach NAT-Typ zur direkten Kommunikation dienen sollen (Punkt 4 in Figure 7). Neben STUN werden meist ergänzend andere Techniken eingesetzt. Hierzu zählt vor allem keep-alive Nachrichten an den SIP-Proxy (Aufrechterhaltung des NAT-Bindings), SIP-Protokollerweiterungen für NAT (siehe NAT-friendly SIP, link) und UPnP (siehe oben). Der populäre Ansatz mittels STUN funktioniert je nach NAT-Typ mehr oder weniger gut. Auf den FAQ-Seiten der VoIP-Anbieter wird bei Problemen in der Regel auf Port-Forwarding verwiesen, was zu den oben genannten Nachteilen führen kann.
Refereces
- Ford, Srisuresh, Kegel: Peer-to-Peer Communication Across Network Address Translators (link)
- Rosenberg, Huitema, Mahy: Traversal using relay NAT (TURN), Internet Draft (link)
- Rosenberg, Weinberger, Huitema, Mahy: STUN – simple traversal of user datagram protocol (UDP) through network address translators (NATs), March 2003, RFC3489 (link)
- Rosenberg: Interactive Connection Establishment (ICE), Internet Draft (link)
- Schulzrinne: diverse documents concerning NAT and SIP, e.g. NAT Types.pdf (NAT and SIP)
- STUN Client und Server (link)