Umgehung von NAT-Gateways mit nat-traverse
Wer mehrere Netzwerke betreut, kennt das Problem: Nur die jeweiligen Router besitzen öffentliche IPv4-Adressen, die restlichen Computer müssen mit privaten Adressen (wie z.B. 192.168.x.x) auskommen.
Damit diese Computer trotzdem Verbindungen ins Internet herstellen können, nutzt der Router NAT (Network Address Translation). Dabei schreibt er die IP-Pakete so um, dass sie als Absenderadresse seine öffentliche IP-Adresse enthalten. Die Zieladresse eines Antwort-Pakets wird dann wieder durch die private IP-Adresse des ursprünglichen Computers ersetzt und an ihn weitergereicht.
Nun möchte man aber eine direkte Verbindung zwischen zwei Computern aufbauen, die beide hinter NAT-Gateways sitzen. Wenn zumindest einer der Rechner eine öffentliche IP-Adresse hätte, könnte man einfach SSH einsetzen, um einen Tunnel aufzubauen. Sitzen jedoch beide Computer hinter NAT-Gateways, ist man bei SSH auf einen vermittelnden Server mit öffentlicher IP-Adresse angewiesen.
Da auch mich das geärgert hat, habe ich ein Programm geschrieben, nat-traverse, welches einen Tunnel zwischen zwei Computern aufbauen kann, die beide keine öffentlichen IP-Adressen besitzen. Dabei wird weder ein vermittelnder Server noch eine Umkonfigurierung der NAT-Gateways benötigt!
nat-traverse erfordert keine Installation, man kann sich einfach den Tarball holen, mit tar xvjf
entpacken und dann das Programm nat-traverse
direkt nutzen.
Dann können wir einen einfachen Tunnel aufsetzen. Im Beispiel sind links
und rechts
die Rechner, die beide hinter NAT-Gateways sitzen, und natgw-von-links
und natgw-von-rechts
die entsprechenden Router.
Um nun einen Tunnel aufzusetzen, müssen wir nur zwei Befehle eingeben:
user@links /tmp/nat-traverse-0.3 $ ./nat-traverse 60001:natgw-von-rechts:60002 user@rechts /tmp/nat-traverse-0.3 $ ./nat-traverse 60002:natgw-von-links:60001
Daraufhin sieht man die nat-traverse auf links
und rechts
einige Dummy-Pakete versenden, um die NAT-Gateways zu umgehen, und dann eine Meldung, dass der Tunnel erfolgreich aufgebaut sei:
> Connection established. > Type ahead.
Nun werden Eingaben auf links
nach rechts
durch die NAT-Gateways weitergeleitet, und umgekehrt.
Wenn man nun nicht nur einfache Daten übertragen, sondern ein echtes Netzwerk durch den Tunnel aufsetzen will, kann man den Point-to-Point Protocol Daemon, pppd, nutzen. Der pppd baut auf dem von nat-traverse aufgebauten Daten-Tunnel auf und ergänzt ihn zu einem vollwertigen PPP-Link. Ähnlich wie bei der Anwendung von PPP bei DSL- oder ISDN-Modems erhält man ein neues Interface, ppp0
oder ppp1
, über das man dann IP-Verkehr abwickeln kann:
root@links /tmp/nat-traverse-0.3 # ./nat-traverse \ --cmd="pppd updetach noauth passive notty \ ipparam vpn 10.0.0.1:10.0.0.2" 40000:natgw-von-rechts:40001 root@rechts /tmp/nat-traverse-0.3 # ./nat-traverse \ --cmd="pppd nodetach notty noauth" 40001:natgw-von-links:40000
Nun kann man über 10.0.0.2
rechts
und über 10.0.0.1
links
erreichen. Anwendungen müssen dabei, wie bei PPP üblich, nichts vom Tunnel oder nat-traverse wissen. Liefe also zum Beispiel ein Webserver auf rechts
, könnte man diesen über http://10.0.0.2/
von links
aus erreichen.
Ich hoffe mal, dass dieser Tipp für einige wertvoll war. Wer mehr über die Technik von nat-traverse erfahren will, sei auf die Webseite von nat-traverse und zu einem Vortrag über nat-traverse verwiesen, den ich vor kurzem bei einem Treffen der Linux User Group Augsburg gehalten habe.