我正在开发一个 TCP/IP 堆栈,该堆栈当前使用原始套接字从 Linux 用户空间运行。
为了测试这一点,我需要禁用特定端口的 Linux 内核 TCP 代码,以便内核不会干扰我的实现(例如,内核响应握手)。
我已经参考过这,它表示原始套接字绕过 netfilter,但在我的测试过程中,原始套接字未收到数据包。
经过更多研究后我发现我的 AF_INET 套接字仍在 TCP/IP 堆栈中,但是我不想实现以太网帧。
是否有办法在不使用 AF_PACKET 的情况下禁用特定端口上的内核处理?
编辑:
我正在像这样创建我的套接字socket(AF_INET, SOCK_RAW, IPPROTO_TCP)
:然后我设置 HDRINCL:setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on))
答案1
您可以使用 IPTables 中的 RAW 表来执行此操作。使用如下规则:
iptables -t raw -A PREROUTING -p tcp --dport <your port> -j DROP
这应该会导致内核忽略您的数据包,并且不会响应握手。