TCP-Handshake mit SOCK_RAW-Socket

Ok, mir ist klar, dass diese Situation etwas ungewöhnlich ist, aber ich muss eine TCP-Verbindung (der 3-Wege-Handshake) nur mit Raw-Sockets (in C, unter Linux) herstellen - dh ich muss die IP-Header und die TCP-Header selbst erstellen . Ich schreibe einen Server (also muss ich zuerst auf das eingehende SYN-Paket antworten) und aus irgendeinem Grund kann ich es nicht richtig machen. Ja, mir ist klar, dass ein SOCK_STREAM dies für mich erledigt, aber aus Gründen, die ich nicht näher erläutern möchte, ist dies keine Option.

Die Tutorials, die ich online zum Verwenden von Raw-Sockets gefunden habe, beschreiben alle, wie ein SYN-Flooder erstellt wird. Dies ist jedoch etwas einfacher als das tatsächliche Herstellen einer TCP-Verbindung, da Sie keine Antwort auf der Basis des ursprünglichen Pakets erstellen müssen. Ich habe die SYN-Flooder-Beispiele zum Laufen gebracht und kann das eingehende SYN-Paket problemlos vom Raw-Socket lesen, habe jedoch weiterhin Probleme, eine gültige SYN / ACK-Antwort auf ein eingehendes SYN vom Client zu erstellen.

Kennt jemand ein gutes Tutorial zur Verwendung von Raw-Sockets, das über das Erstellen eines SYN-Flooders hinausgeht, oder hat jemand Code, der dies tun kann (mit SOCK_RAW und nicht mit SOCK_STREAM)? Ich wäre sehr dankbar.

MarkR hat vollkommen recht - das Problem ist, dass der Kernel als Antwort auf das ursprüngliche Paket Rücksetzpakete sendet, weil er denkt, der Port sei geschlossen. Der Kernel schlägt mich auf die Antwort und die Verbindung stirbt. Ich habe tcpdump bereits verwendet, um die Verbindung zu überwachen - ich hätte aufmerksamer sein müssen und feststellen müssen, dass es ZWEI Antworten gab, von denen eine ein Zurücksetzen war, das alles vermasselte, sowie die Antwort, die mein Programm erstellte. D'OH!

Die Lösung, die am besten zu funktionieren scheint, besteht darin, eine von MarkR vorgeschlagene iptables-Regel zu verwenden, um die ausgehenden Pakete zu blockieren. Es gibt jedoch eine einfachere Möglichkeit, als die vorgeschlagene Markierungsoption zu verwenden. Ich stimme nur überein, ob das Reset-TCP-Flag gesetzt ist. Während einer normalen Verbindung ist es unwahrscheinlich, dass dies erforderlich ist, und es spielt für meine Anwendung keine Rolle, wenn ich alle ausgehenden Rücksetzpakete von dem verwendeten Port blockiere. Dies blockiert effektiv die unerwünschte Antwort des Kernels, aber nicht meine eigenen Pakete. Wenn der Port, den mein Programm abhört, 9999 ist, sieht die iptables-Regel folgendermaßen aus:

iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP

Antworten auf die Frage(7)

Ihre Antwort auf die Frage