Wie verwende ich den TUN / TAP-Tunnel aus dem Benutzerprogramm?

9

Ich habe kürzlich die Existenz von Linux TUN / TAP-Schnittstellen entdeckt und versuche immer noch, sie zu verstehen. Ich glaube, ich verstehe das Grundkonzept: Es werden Pseudogeräte erstellt, die eine Netzwerkschnittstelle emulieren, und anstatt Daten an Hardware zu übergeben, werden sie an ein Userspace-Programm übergeben.

Wie würden Sie ein nicht verwandtes Programm anweisen, diesen Tunnel zu nutzen?

Zum Beispiel enthält mein System vor dem Erstellen des Tunnels nur eth0 und lo, die normale Ethernet-Schnittstelle (mit meinem lokalen Netzwerk verbunden) und die Loopback-Schnittstelle. Nachdem ein Programm einen Tunnel erstellt und konfiguriert hat, habe ich eine neue Schnittstelle gr0, der ich eine IP-Adresse gegeben habe, die sich in meinem lokalen Netzwerk befindet, aber nicht verwendet wird (wir befinden uns also alle im selben Subnetz). Wie würde ich ein nicht verwandtes Programm dazu bringen, diesen "Tunnel" zu nutzen? Angenommen, ich hatte eine einfache Python-Nachricht, die eine Client / Server-App übergibt und eine TCP-Verbindung verwendet. Wie kann ich sie für die Verwendung des Tunnels konfigurieren?

Ich entschuldige mich, wenn mir etwas Grundlegendes fehlt, aber wie immer habe ich es geschafft, mich im Schema der Dinge zu verwirren. Ich möchte nur, dass ein einfaches TCP-Programm diesen Tunnel nutzt.

Vielen Dank!

Mr. Shickadance
quelle

Antworten:

7

Es ist nicht immer "Tunnel". TUN / TAP sind nur bestimmte NIC-Treiber. Aus Sicht des Netzwerkstapels fungieren sie wie alle anderen Netzwerkschnittstellen: Sie können IP-Adressen haben, Punkt-zu-Punkt- oder Broadcast-Schnittstellen sein. Routing-Regeln gelten auch für sie. Der gesamte Datenverkehr, der auf eine dieser Netzwerkschnittstellen geschrieben wird, wird jedoch zur Verarbeitung an ein Userspace-Programm weitergeleitet, und alle vom Userspace-Programm direkt geschriebenen Daten sehen /dev/tunXaus wie eingehende Pakete für den Netzwerkstapel.

Im üblichen Tunneling-Setup haben Server und Client TUN-Geräte mit zugewiesenen Adressen. Auf beiden konfigurierte Routing-Tabellen leiten den benötigten Datenverkehr zu diesen TUN-Geräten. Wenn das Paket an tun0 weitergeleitet wird, sendet der Kernel es an das Userspace-Programm (Client), das dieses Paket beispielsweise über eine TCP-Verbindung an ein anderes Programm auf dem Remote-Computer (Server) sendet. Auf einem Remotecomputer empfängt ein anderes Programm (Server) ein Paket vom Client und schreibt es auf sein eigenes /dev/tunXGerät, wodurch dieses Paket in den Netzwerkstapel "injiziert" wird. Und getunneltes Paket wird wie jedes andere verarbeitet.

Gelraen
quelle
1
Die Antwort (für meine Zwecke) besteht also darin, die Routing-Tabelle so zu konfigurieren, dass der Datenverkehr zu diesen Schnittstellen geleitet wird. Das war der Punkt, den ich vermisse, aber jetzt sollte ich in der Lage sein, eine Lösung zu finden. Ich schätze auch die Erklärung, da sie die Dinge klärt. Vielen Dank!
Mr. Shickadance
2
Am Ende habe ich "route add <TUN IP ADDR> dev gr0" verwendet. Dadurch konnte ich den Datenverkehr über die neue Schnittstelle umleiten. Danke noch einmal!
Herr Shickadance