
Ich arbeite an einem TCP/IP-Stack, der derzeit aus dem Linux-Benutzerbereich unter Verwendung von Raw Sockets ausgeführt wird.
Um dies zu testen, muss ich den TCP-Code des Linux-Kernels für einen bestimmten Port deaktivieren, damit der Kernel meine Implementierung nicht durcheinanderbringt (z. B. wenn der Kernel auf einen Handshake reagiert).
Ich habe verwiesenDas, das besagt, dass Raw Sockets Netfilter umgehen, aber während meiner Tests wurde das Paket nicht vom Raw Socket empfangen.
Nach weiteren Recherchen entdeckte ich, dassmein AF_INET-Socket ist immer noch im TCP/IP-Stack, ich möchte jedoch keine Ethernet-Frames implementieren.
Gibt es eine Möglichkeit, die Kernelverarbeitung auf einem bestimmten Port zu deaktivieren, ohne AF_PACKET zu verwenden?
BEARBEITEN:
Ich erstelle meinen Socket folgendermaßen: socket(AF_INET, SOCK_RAW, IPPROTO_TCP)
. Dann stelle ich HDRINCL ein:setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on))
Antwort1
Sie können hierfür die RAW-Tabelle in IPTables verwenden. Verwenden Sie eine Regel wie:
iptables -t raw -A PREROUTING -p tcp --dport <your port> -j DROP
Dies sollte dazu führen, dass der Kernel Ihr Paket ignoriert und nicht auf den Handshake reagiert.