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 IPtun 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.103Die 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!?