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

我正在为embedded式设备开发一个TCP / IP实现,我想使用原始套接字从Linux用户空间进程中进行testing。

生(7)说

原始套接字可以在Linux中使用所有的IP协议,甚至是在内核中有一个协议模块的ICMP或TCP协议。 在这种情况下,数据包被传递给内核模块和原始套接字。

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

内核默认处理TCP握手

尝试build立一个TCP连接

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

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

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

 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