禁用原始套接字的 TCP 数据包的内核处理

禁用原始套接字的 TCP 数据包的内核处理

我正在为嵌入式设备开发 TCP/IP 实现,我想使用原始套接字从 Linux 用户空间进程进行测试。

raw(7) 表示

原始套接字可以利用 Linux 中的所有 IP 协议,甚至包括内核中具有协议模块的 ICMP 或 TCP 等协议。在这种情况下,数据包将同时传递到内核模块和原始套接字。

我需要禁用此内核处理(至少在特定目标端口上)以测试我的实现。我认为有一些涉及 iptables 的操作可以做到这一点,但坦率地说,我不是 Linux 专家。我很感激任何帮助。

答案1

内核默认处理 TCP 握手

尝试建立 TCP 连接

$ telnet localhost 8877
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

这里连接被内核直接拒绝。

要停止内核处理 TCP 连接,可以添加 netfilter 规则。以下命令使内核忽略进入端口的 TCP 数据包8877

sudo iptables -A INPUT -p tcp --destination-port 8877 -j DROP

现在尝试再次建立 TCP 连接

$ telnet localhost 8877
Trying 127.0.0.1...
^C (Killed by me as it gets stuck here)

内核现在不进行 TCP 握手,你应该能够在用户空间实现 TCP,因为你仍然会看到数据包1

完成后要清理 netfilter 规则,请使用

sudo iptables -D INPUT -p tcp --destination-port 8877 -j DROP

相关内容