tun/tap und raw sockets



  • Hallo,

    Ich baue mir eine TUN Schnittstelle mit der eine Application kommunizieren soll. Ankommende Pakete sollen je nach Bedarf an bestimmte IPs weitergeleitet werden, also z.B.

    App ---> tun0(172.16.0.1) ---> eth0 ---> Ziel
    from 172.16.0.1 analysieren event. an eth0 irgendeine
    to 172.16.0.20 DestIP umschreiben weiterreichen Ziel IP

    tun funktioniert soweit bestens, ich bekomme alle Pakete und kann die
    Header auslesen. Jetzt versuche ich die Pakete wieder auf eth0 auszugeben:
    Dazu brauche ich doch einen Raw Socket!?:

    int s1;
    int one = 1;
    struct sockaddr to;
    
    memset(&to, '\0', sizeof(to));
    to.sa_family = AF_INET;
    strcpy(to.sa_data, "eth0");
    
    s1=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
    setsockopt(s1, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one));
    bind(s1, &to, sizeof(struct sockaddr));
    

    wenn ich das eingehende Paket analysiert und umgeschrieben habe mach ich ein
    write auf s1.
    Schaue ich mir mit Wireshark die Pakete an passen diese auch soweit ab Layer 3,
    doch kommen die Pakete niemals am Ziel an.
    Liegt das Ziel im internen Netz (also IP eth0 und Ziel IP in einem privaten Subnetz) fällt auf, dass auf Layer 2 die Dest.MAC die MAC des Routers anstatt die des Ziels hat, auf einem anderen Rechner kommen die Pakete dann auch an, als Absender steht jedoch der Router (mit dessen IP!?) drin obwohl die Absender IP anders gesetzt war und das Paket wird nicht an die Applikation weitergereicht.

    Jetzt weiss ich im Moment nicht mehr wirklich weiter, hat jmd eine Idee? stimmt das mit dem Raw-Socket überhaupt?

    Vielen Dank schonmal für Eure Mühe!



  • ok es scheint an der Layer4-Checksum zu liegen,
    eigentlich sollte diese sich doch nicht verändern!?

    Mal nur UDP:
    wird die Checksum auf 0 gesetzt funktioniert alles, wird sie nicht
    geändert ist sie incorrect, aber warum? Sie bezieht sich doch nur auf
    den UDP-Header und die Daten und diese werden ja nicht verändert!?

    Wie kann man ide UDP-Checksum denn neu berechnen? Bei IP reichts
    ja wenn ich sie auf 0 setze (was ich auch mache) dann übernimmt das freundlicherweise der Kernel für mich



  • hm die Prüfsumme wird nicht über den UDP sondern über einen Pseudo-Header berechnet:
    http://de.wikipedia.org/wiki/User_Datagram_Protocol#Pseudo-Header



  • ok jetzt hab ich nur noch das Problem der falschen Mac-Adresse:

    --> tun0 --> eth0 --> auf Host 192.168.1.103
    umschreiben zu: kommt also Source IP:
    s: 172.16.0.1 s: 192.168.1.3 192.168.1.1 (der default GW)
    d: 172.16.0.20 d: 192.168.1.103

    Die Pakete die eth0 verlassen haben als Source noch 192.168.1.3
    allerdings wird automatisch in Layer2 alles an den Router geschickt
    der also default Gateway eingetragen ist, nehme ich den Routingeintrag raus
    funktioniert nichts mehr!?


Anmelden zum Antworten