Ich möchte, dass mein gesamter Datenverkehr über TUN
die Schnittstelle läuft.
Wie Sie sehen, wird der Datenverkehr von jedem Programm an die Adresse TUN
iface unter weitergeleitet 10.0.0.1
. Anschließend TUN
macht das an die Adresse angeschlossene Programm etwas mit den Paketen, und dann werden sie an meinen Router unter gesendet 192.168.1.1
. Anschließend werden sie über das Internet weitergeleitet (zum Beispiel an meinen Proxyserver, aber für mein Problem ist das eigentlich nicht so wichtig).
Mein Ziel besteht also darin, den Verkehr einfach folgendermaßen umzuleiten: $any_program
<--> tunX
<--> 192.168.1.1 (the router)
( <-->
was bedeutet, dass der Verkehr sowohl ein- als auch ausgeht).
Was ich bisher getan habe:
- Zuerst habe ich
tunX
das Gerät mit dieser Funktion initialisiert:
int tun_open(char *device)
{
struct ifreq ifr;
int fd, err;
fd = open("/dev/net/tun", O_RDWR);
if (fd == -1)
{
perror("opening /dev/net/tun");
exit(1);
}
memset(&ifr, 0, sizeof (ifr));
ifr.ifr_flags = IFF_TUN;
strncpy(ifr.ifr_ifrn.ifrn_name, device, IFNAMSIZ);
err = ioctl(fd, TUNSETIFF, (void *) &ifr);
if (err == -1)
{
perror("ioctl TUNSETIFF");
close(fd);
exit(1);
}
return fd;
}
Und dann:
tunfd = tun_open("tun6");
Außerdem habe ich Folgendes aktiviert TUNSETPERSIST
:
ioctl(tunfd, TUNSETPERSIST, 1) < 0);
- Anschließend habe ich das Gerät mit folgenden Befehlen eingerichtet:
$ sudo ip addr add 10.0.0.1/24 dev tun6
$ sudo ip link set tun6 up
Das Programm liest tunfd
den Inhalt und gibt ihn aus. Bisher liest es nur Folgendes:
:B\{k
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 1
ST: urn:dial-multiscreen-org:service:dial:1
USER-AGENT: Google Chrome/86.0.4240.198 Linux
% N%*.%K%M%P%M%M%M%HP%,%M%*K%(aP%>O%M%LqP%@K%`P%P%Ҵ u@=U繤湤}=UoK%0=U
ssdp:discover? Warum gelangt das durch meine Tun-Schnittstelle?
Ausgabe von route -n
:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 600 0 0 wlp2s0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun6
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlp2s0
192.168.1.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp2s0
iptables
Ich habe mit und Programmen herumgespielt ip route
, aber ich bin in all dem ein Neuling. Soweit ich verstanden habe, iptables
leitet die Pakete nicht wirklich weiter, sondern filtert sie (ich kann mich sehr irren). Gibt es also eine Möglichkeit, die Pakete mit weiterzuleiten ip route
?
Antwort1
Normales Routing basiert auf Zielen und nicht auf Schnittstellen (es sei denn, Sie konfigurieren richtlinienbasiertes Routing). Daher müssen Sie den gesamten ausgehenden Datenverkehr an das 10.0.0.0/24
Netzwerk weiterleiten:
ip route del default
ip route add default via 10.0.0.254
Eigentlich ist es egal, über welche Adresse 10.0.0.0/24
Sie es senden, es sollte Ihr Programm erreichen.