Ich habe eine harte Zeit, dieses Problem herauszufinden - ich versuche, ein Programm zu schreiben, das mit dem Linux-Tunnel-Treiber interagieren wird. Auf einer sehr einfachen Ebene möchte ich einfach eine Anwendung erstellen, die in der Lage ist, Daten über einen Netzwerk-Tunnel zu übertragen. Ich bin jedoch völlig ratlos, wie ich den Tunneltreiber richtig einrichten kann, um dies zu erreichen.Wie man mit dem Linux tun Treiber eingeht
Ich entwickle auf Ubuntu 9.04, und ich habe den Tunnel-Treiber Kernel-Modul geladen.
Es gibt das Gerät /dev/net/tun
, jedoch gibt es keine /dev/tunX
Geräte. Ich bin nicht in der Lage, diese Geräte mit ifconfig
zu schaffen - wenn ich /sbin/ifconfig tun0 up
laufen, zum Beispiel, bekomme ich folgende Fehlermeldung:
tun0: ERROR while getting interface flags: No such device.
Wenn ich an dem /dev/net/tun
Gerät zu suchen versuche, wird der folgende Fehler dargestellt:
cat: /dev/net/tun: File descriptor in bad state.
Versuch /dev/tunX
über ein kleines Programm zu öffnen, im Grunde einfach ein retu
tun_fd = open("/dev/tun0", O_RDWR)
rns -1: Die Anwendung läuft als root und kann dieses Tunnelgerät immer noch nicht öffnen. Es ist möglich, /dev/net/tun
zu öffnen, jedoch scheint dies kein neues /dev/tunX
Gerät zu generieren, das stattdessen verwendet werden kann.
So in der Zusammenfassung - wie geht man über eine Anwendung zu schreiben, die den Linux-Tunnel-Treiber verwenden möchte? Alle Einsichten würden sehr geschätzt werden.
Danke; ~ Robert
@rmbrobins; Was hast du getan, um das wirklich funktionieren zu lassen? Ich glaube, ich habe ein sehr ähnliches Problem mit Ihrer ursprünglichen Frage. Ich habe das/dev/net/tun Gerät sichtbar, aber das Öffnen dieses erzeugt keine Netzwerkschnittstelle. Ich habe versucht, die Beispiele br_select.c und br_sigio.c zu verwenden. – simon
Wie oben erwähnt, öffnen Sie/dev/net/tun. Dann wird ein ioctl verwendet, um die eigentliche Schnittstelle selbst zu erstellen. Das ioctl heißt TUNSETIFF und das Argument hat den Typ struct ifreq. Die Flags der ifreq-Struktur sollten auf IFF_TUN gesetzt sein. Sobald das ioctl zurückgegeben wurde, wird das ifr_name-Feld der ifreq-Struktur mit dem Namen der geöffneten Schnittstelle festgelegt. Hoffe das hilft! – rmrobins