Leiten Sie den gesamten Datenverkehr über die TUN-Schnittstelle weiter

Leiten Sie den gesamten Datenverkehr über die TUN-Schnittstelle weiter

Ich möchte, dass mein gesamter Datenverkehr über TUNdie Schnittstelle läuft.

Hier ist das Flussdiagramm

Wie Sie sehen, wird der Datenverkehr von jedem Programm an die Adresse TUNiface unter weitergeleitet 10.0.0.1. Anschließend TUNmacht 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:

  1. Zuerst habe ich tunXdas 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);
  1. 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 tunfdden 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

iptablesIch habe mit und Programmen herumgespielt ip route, aber ich bin in all dem ein Neuling. Soweit ich verstanden habe, iptablesleitet 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/24Netzwerk 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/24Sie es senden, es sollte Ihr Programm erreichen.

verwandte Informationen