我正在为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