好吧,我意识到这种情况有点不寻常,但我需要建立一个TCP连接(3次握手)只使用原始套接字(在C中,在linux中) - 即我需要自己构建IP头和TCP头.我正在写一个服务器(所以我必须先响应传入的SYN数据包),无论出于什么原因我似乎无法正确使用它.是的,我意识到SOCK_STREAM会为我处理这个,但由于我不想进入的原因,这不是一个选择.
我在网上找到的使用原始套接字的教程都描述了如何构建SYN flooder,但这比实际建立TCP连接要容易一些,因为您不必根据原始数据包构建响应.我已经让SYN flooder示例工作了,我可以从原始套接字读取传入的SYN数据包,但是我仍然无法从客户端创建对传入SYN的有效SYN/ACK响应.
那么,有没有人知道使用原始套接字的好教程不仅仅是创建SYN flooder,还是有人有一些代码可以做到这一点(使用SOCK_RAW,而不是SOCK_STREAM)?我会很感激.
MarkR是绝对正确的 - 问题是内核正在发送重置数据包以响应初始数据包,因为它认为端口已关闭.内核正在击败我的响应并且连接终止.我正在使用tcpdump监视连接 - 我本来应该更加敏锐,并注意到有两个回复,其中一个是重置,搞砸了事情,以及我的程序创建的响应.D'OH!
似乎最有效的解决方案是使用MarkR建议的iptables规则来阻止出站数据包.但是,正如建议的那样,使用标记选项比使用标记选项更容易.我只是匹配是否设置了重置TCP标志.在正常连接过程中,这不太可能是需要的,如果我阻止来自正在使用的端口的所有出站重置数据包,对我的应用程序来说并不重要.这有效地阻止了内核的不需要的响应,但不是我自己的数据包.如果我的程序正在侦听的端口是9999,那么iptables规则如下所示:
iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP
Run Code Online (Sandbox Code Playgroud)