Umgehung von NAT-Gateways mit nat-traverse [Bild: http://linide.sourceforge.net/nat-traverse/nat-traverse.png]
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.