Ich habe versucht, mit Python Pakete an eine Tap-Schnittstelle zu senden. Ich überwache die Tap-Schnittstelle mit Wireshark und es werden keine Pakete empfangen. Ich mache das hauptsächlich als Übung, um mein Verständnis von VPNs, Ethernet-Bridging und Socket-Programmierung in Python zu verbessern.
Mein System-Setup ist wie folgt:
Ubuntu Desktop 11.10
Python 2.7
eth0 ip: 192.168.1.6
tap0 ip: 10.0.0.1
Ich habe den Wasserhahn zunächst wie folgt eingerichtet:
sudo openvpn --mktun --dev tap0
sudo ifconfig tap0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 promisc up
Dadurch wird die tap0-Schnittstelle gestartet und eine Kernel-Routing-Regel zu 10.0.0.1/24 über tap0 erstellt.
Hier ist die Routentabelle:
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.0 * 255.255.255.0 U 0 0 0 tap0
192.168.1.6 * 255.255.255.0 U 1 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
Als nächstes starte ich Python Interactive und erstelle einen einfachen UDP-Socket.
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('helloworld',('10.0.0.2',12345))
Ich führe den Befehl sendto mit Wireshark-Überwachung auf tap0 aus. Jetzt gibt es in meinem Netzwerk keinen Host unter 10.0.0.2, aber ich sollte zumindest etwas ausgehenden Datenverkehr auf der tap0-Schnittstelle sehen. Ich habe dies in Windows repliziert und es scheint einwandfrei zu funktionieren.
Ich kann mir nur vorstellen, dass das Problem irgendwo im Setup der Tap0-Schnittstelle unter Linux liegt. Das oder mein mittelmäßiges Verständnis dieses Zeugs.
Danke
Antwort1
ist tap
für Bridged Tunneling unter OpenVPN gedacht - Sie sollen es in eine Bridge einbinden, beispielsweise br0
mithilfe von brctl
.
Die Idee ist, dass Sie beispielsweise tap0
und in eine Brücke einfügen können - dann läuft der Broadcast-Verkehr über diese Brücke. (Broadcast-Verkehr, der von eingeht, wird an weitergeleitet und umgekehrt, während dies in einer gerouteten Standardsituation nicht der Fall wäre.) Ihr OpenVPN-Tunnel über wird dann in "geschaltet" statt "geroutet". Das Ganze erhält eine IP und Sie behandeln mit statt mit oder . eth0
br0
tap0
eth0
tap0
eth0
br0
br0
eth0
tap0
Es ist durchaus möglich, eine Brücke mit nur einer Schnittstelle zu haben und nach brctl
Bedarf weitere Schnittstellen hinzuzufügen/entfernen.
Also entweder tap0
in eine Brücke einfügen und stattdessen mit der Brückenschnittstelle umgehen oder tun
Schnittstellen verwenden.
Es ist auch möglich, iptables
dass Regeln stören.
Update - siehe hier:http://backreference.org/2010/03/26/tuntap-interface-tutorial/- insbesondere dieser Auszug:
Der Unterschied zwischen einer Tap-Schnittstelle und einer Tun-Schnittstelle besteht darin, dass eine Tap-Schnittstelle vollständige Ethernet-Frames ausgibt (und erhalten muss), während eine Tun-Schnittstelle reine IP-Pakete ausgibt (und erhalten muss) (und vom Kernel keine Ethernet-Header hinzugefügt werden). Ob eine Schnittstelle wie eine Tun-Schnittstelle oder wie eine Tap-Schnittstelle funktioniert, wird beim Erstellen der Schnittstelle mit einem Flag angegeben.
Es sieht also so aus, als ob es aus dem oben genannten Grund nicht wie erwartet funktioniert, wenn Sie keine vollständigen Ethernet-Frames an tap0 senden.