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.