NAT

Aus

Was ist NAT ?

Network Adress Translation (NAT) oder deutsch Netzwerk Adressen Übersetzung/Transformation ist eine Funktion bei der Weiterleitung (Forwarding) von TCP/IP-Paketen. Bei einem Verbindungsaufbau wird dabei einem IP-Paket eine neue IP-Adresse und eine neue lokale Port-Nummer zugewiesen. Diese Übersetzung wird in einer Tabelle gespeichert und für die Dauer der Verbindung für alle Pakete identisch angewandt. Dabei wird die Tabelle in beide Richtungen (für eingehende und ausgehende Daten) so angewandt dass in der Gegenrichtung passend wieder zurück übersetzt wird.

Diese Technik (früher auch als Masquerading bezeichnet) wird praktisch überall angewandt wo Geräte mit lokalen nicht global eindeutigen und damit nicht global vermittelbaren Adressen trotzdem am globalen Datenverkehr teilnehmen sollen. Ein Router mit einer vermittelbaren Adresse (meist vom ISP zugewiesen) übersetzt für alle Teilnehmer am lokalen Netz deren Verbindungen mit NAT so, dass es für den Router des ISP so aussieht als kämen alle Verbindungen vom Router des Kunden selbst.

Beispiel: Mein Router hat vom ISP die global eindeutige Adresse 217.238.111.19 bekommen. Am Router angeschlossen arbeiten Geräte unter dem nicht für Weiterleitung geeigneten Subnetz 192.168.0.0/24. Will das Gerät mit der Adresse 192.168.0.2 eine Verbindung mit dem Port 80 von 74.125.229.81 aufbauen so sendet es eine Aufforderung zum Verbindungsaufbau von seinem für diesen Zweck neu reservierten Port 1027 an den als Standard-Gateway eingetragenen Router 192.168.0.1 zur Weitergabe an 74.125.229.81:80. Der Router macht NAT und übersetzt die lokale Adresse 192.168.0.2:1027 in die eigene globale Adresse und reserviert dafür einen neuen freien eigenen Port. Aus dem Verbindungsaufbau 192.168.0.2:1027 -> 74.125.229.81:80 wird danach 217.238.111.19:2096 -> 74.125.229.81:80 und der Router merkt sich in seiner NAT-Tabelle dass sein Port 2096 vom lokalen Gerät 192.168.0.2 auf dessen Port 1027 zu übersetzen ist. Kommt ein Datenpaket von 74.125.229.81:80 an 217.238.111.19:2096 wird es vom Router passend wieder zurück übersetzt und an 192.168.0.2:1027 weitergeleitet.

Weder das lokale Gerät noch die extern verwendeten Dienste merken von dem Vorgang etwas. Für die externen Dienste sieht es so aus als ob der Router alle Verbindungen selbst macht. Für die internen Geräte sieht es so aus als wäre ihre Adresse doch vermittelbar. Das ganz funktioniert natürlich nur für Verbindungen die von innen nach außen aufgebaut werden. Die internen Adressen sind weiterhin von Außen nicht erreichbar. Da auf der Welt hunderte von Netzen unter dem Adressbereich 192.168.0.0/24 laufen wäre das grundsätzlich auch nie möglich. Man verwendet daher auch extra Adressbereiche die per Definition niemals vermittelt werden dürfen (192.168.*.* oder 10.*.*.*). Man spricht dabei auch von privaten IP-Adressen.

Verbindungen von außen nach innen könne über Portmapping im Router eingestellt werden. Das ist quasi eine besondere Form von NAT mit statischer von Hand eingestellter Übersetzung der Adressen und Port-Nummern. Dieser Artikel befasst sich nur mit dynamischem NAT von einem privaten Subnetz nach Außen. Dabei muss "Außen" nicht unbedingt tatsächlich eine globale Adresse sein. Die Synology-Diskstation ist nur im Nebenberuf ab und zu ein Router und in der Regel selbst hinter einem NAT-Router. Der Job ist also in der Regel schon von einem dafür spezialisierten Gerät erledigt. Es stellt sich also die Frage:

Wozu NAT auf der Diskstation?

Weil man mit VPN und ähnlichem über physikalische Netze nochmal logische Netze legen kann die auch geroutet werden wollen. NAT ist kaskadierbar und hinter einem NAT-Router kann man also nochmal einen NAT-Router betreiben hinter dem weitere NAT-Router arbeiten. Eine sehr praktische Zusatzanwendung für die Diskstation ist der Betrieb als VPN-Router. Man ermöglicht mit passendem Portmapping den Aufbau von VPNs von externen Geräten zur Diskstation. Macht diese zusätzlich NAT kann man damit über die verschlüsselte und damit gesicherte Verbindung auf sein gesamtes lokales Netz zugreifen und ggf. von dort auch wieder nach außen.

Beispiel: Ich bin mit meinem mobilen Gerät (Notebook, Netbook, iPhone, N900, ...) im Cafe um die Ecke mit einem öffentlichen WLAN-AP verbunden. Dort möchte ich gerne neue Inhalte auf meine Web-Seite stellen aber mein Provider erlaubt das bei der billig Web-Präsenz die ich verwendet nur per FTP. FTP schickt mein Passwort unverschlüsselt über das Netz und jeder der dieses öffentliche WLAN belauscht (siehe airodump und Co.) kann ganz einfach mein Passwort mitlesen. Also baue ich eine Verbindung zu meiner Diskstation Daheim auf und konfiguriere sie als Default-Route. Wer jetzt den AP belauscht sieht von mir nur noch eine verschlüsselte VPN-Verbindung zu einem Port meines heimischen Routers. Wer das Passwort jetzt noch lesen möchte muss meinen heimischen DSL-Anschluss belauschen, was schon erheblich schwieriger ist. Besser wäre es natürlich alle Verbindungen bis zum Dienstgeber zu verschlüsseln aber das wir oft nicht angeboten oder nur gegen Gebühren.

NAT oder statische Routen ?

Man könnte den NAT-Job aber auch dem dafür vorgesehenen Gerät überlassen und das zusätzliche vom VPN verwaltete Subnetz als statische Route im Router eintragen. Diese Lösung ist etwas schneller und einfacher einzurichten. Einfach OpenVPN auf die Diskstation und einen Eintrag in die Tabelle des lokalen NAT-Routers. Fertig. Diese Lösung funktioniert in der Regel und ist schnell umgesetzt. Warum also dann nochmal NAT auf der Diskstation?

  • Wenn mehrere Router (z.B, für weitere Subnetze in Firmen) vorhanden sind müsste ich in jedem die Routing-Tabelle ändern. Mit NAT sind alle Zugriffe exakt so als kämen sie von der Diskstation selbst und niemand benötigt extra Einstellungen.
  • Wenn ich die VPN-Konfiguration ändere (weitere Subnetze oder andere Adressen) muss ich auch die Tabellen im allen Routern ändern. Es ist im Allgemeinen ungünstig eine Information (wo ist mein VPN-Netz) über mehrere Geräte verteilt administrieren zu müssen.
  • Wird der Router getauscht (weil kaputt) denk keiner mehr dran dass da noch eine statische Route für das VPN der Diskstation eingetragen war. Allerdings muss das Portmapping für den VPN-Server ohnehin auch wieder eingerichtet werden. Daran führt nichts vorbei, das betrifft aber auch immer nur das Standard-GW.
  • Der Aufwand NAT einzurichten ist nicht wirklich groß (siehe unten).
  • Es ist sogar möglich VPN mit NAT ganz ohne Änderungen am Router einzurichten. Das würde hier aber den Rahmen deutlich sprengen.

NAT auf der Diskstation einrichten

Vorbereitung

Um NAT benutzen zu können sollte IPKG installiert sein und modprobe funktionieren. Die bereits installierte Version von iptables genügt nicht. Wir installieren daher noch die Version aus der Optware:

ipkg install iptables

Die benötigten Module für den Kern sollten sich schon in /lib/modules finden:

iptable_nat
ip_nat
ip_tables
ip_conntrack

Um uns nicht selbst um die Abhängigkeiten untereinander und die Reihenfolge des Ein- und Aushängens kümmern zu müssen laden wir die Module mit modprobe und nicht mit insmod. Dazu bitte die Anleitung in modprobe lesen.

In Betrieb nehmen

Danach kann NAT mit zwei Zeilen in Betrieb genommen werden.

modprobe iptable_nat
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 192.168.0.123

Die erste Zeile läd alle benötigten Module indem das wichtigste mit allen Abhängigkeiten geladen wird. Das wichtigste Modul für NAT ist die nat-Tabelle für iptables.

Der zweite Befehl läd in die iptables-Tabelle "nat" in der Kette "POSTROUTING" eine Regel die alle Pakete mit Adressen im Netz 10.8.0.0/24 in die Kette "SNAT" weiterleitet. Dort werden sie mit neuen Source-Adressen versehen und weiter geschickt. Die neue Source-Adresse ist in der Regel die eigene IP-Adresse der Diskstation.

Abstellen

Abstellen kann man das Ganze mit

iptables -t nat -F
modprobe -r iptable_nat

Der erste Befehl löscht (flush) alle Einträge in der iptabels-Tabelle "nat" und stellt damit NAT ab. Der zweite Befehl entfernt alle danach nicht mehr benötigten Module aus dem Kern. Wie das ganze in einem Optware-Start-Script aussieht kann man hier sehen.