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.