带SOCK_RAW套接字的TCP握手
好的,我意识到这种情况有些不寻常,但是我需要仅使用原始套接字(在C中,在Linux中)-i.e建立TCP连接(三向握手)。我需要自己构造IP标头和TCP标头。我正在编写服务器(因此我必须首先响应传入的SYN数据包),无论出于什么原因,我似乎都无法正确处理它。是的,我意识到SOCK_STREAM会为我处理这个问题,但是由于某些原因,我不想进入该选项是不可行的。
我在网上找到的有关使用原始套接字的教程都描述了如何构建SYN Flooder,但这比实际建立TCP连接要容易一些,因为我们不必基于原始数据包构造响应。我已经开始使用SYN Flooder示例,并且可以从原始套接字读取传入的SYN数据包,但是我仍然无法为从客户端传入的SYN创建有效的SYN / ACK响应。
因此,有谁知道关于使用原始套接字的优秀教程,而不仅仅是创建SYN泛洪器,或者没有人有一些可以做到这一点的代码(使用SOCK_RAW,而不是SOCK_STREAM)吗?我会很感激。
MarkR绝对正确-问题在于内核正在发送重置数据包以响应初始数据包,因为它认为端口已关闭。内核让我为响应而战,连接中断。我已经在使用tcpdump监视连接了-我应该更加观察并注意到,有两个回复,其中之一是重置,这使事情搞砸了,以及我的程序创建的响应。 D'OH!
似乎效果最好的解决方案是使用MarkR建议的iptables规则来阻止出站数据包。但是,正如建议的那样,有一种比使用mark选项更简单的方法。我只是匹配是否设置了重置TCP标志。在正常连接的过程中,这不太可能需要,并且如果我阻止正在使用的端口上的所有出站重置数据包,则对我的应用程序并不重要。这有效地阻止了内核的有害响应,但阻止了我自己的数据包。如果我的程序正在侦听的端口是9999,则iptables规则如下所示:
iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP
解决方案
我没有教程,但是最近我使用Wireshark调试了我正在做的一些原始套接字编程,效果很好。如果捕获了要发送的数据包,wireshark会很好地向我们显示它们是否格式错误。与正常连接相比也很有用。
我无法在任何教程上为我们提供帮助。
但是,我可以为我们提供一些建议,以进行调试。
首先,正如bmdhacks所建议的那样,给自己准备一份wireshark副本(或者tcpdump,但wireshark更易于使用)。握手良好。确保我们保存此。
捕获失败的握手之一。 Wireshark具有相当不错的数据包解析和错误检查功能,因此,如果存在直接错误,它可能会告诉我们。
接下来,获取一份tcpreplay副本。它还应包括一个名为" tcprewrite"的工具。
通过tcprewrite,我们可以将以前保存的捕获文件分成两部分,分别用于握手的每一侧。
然后,我们可以使用tcpreplay播放握手的一侧,这样我们就可以使用一组一致的数据包。
然后,我们再次使用wireshark检查响应。
我们想在用户空间中实现TCP堆栈的一部分...没关系,其他一些应用程序也可以做到这一点。
我们会遇到的一个问题是,内核将对传入的数据包发出(通常是负面的,无助的)回复。这将搞砸我们尝试启动的所有通信。
避免这种情况的一种方法是使用内核没有自己的IP堆栈的IP地址和接口,这很好,但是我们需要自己处理链路层的内容(特别是arp)。那将需要一个低于IPPROTO_IP的套接字,而SOCK_RAW则需要一个数据包套接字(我认为)。
也可以使用iptables规则来阻止内核的响应,但是我宁愿怀疑规则也将以某种方式应用于我们自己的数据包,除非我们可以设法对它们进行不同的处理(也许对自己的数据包使用netfilter"标记"包?)
阅读手册页
插座(7)
ip(7)
包(7)
其中解释了适用于套接字类型的各种选项和ioctl。
当然,我们将需要诸如Wireshark之类的工具来检查正在发生的事情。我们将需要多台计算机进行测试,我建议使用vmware(或者类似软件)以减少所需的硬件数量。
抱歉,我不能推荐特定的教程。
祝你好运。
netinet / ip.h和netinet / tcp.h中分别声明了IP和TCP标头的结构。我们可能需要查看此目录中的其他标头,以获取可能有用的额外宏和内容。
我们发送设置了SYN标志和一个随机序列号(x)的数据包。我们应该从另一端收到SYN + ACK。该数据包将具有一个确认号(y),用于指示对方希望接收的下一个序列号以及另一个序列号(z)。我们发回具有序列号x + 1和ack号z + 1的ACK数据包以完成连接。
我们还需要确保计算适当的TCP / IP校验和,并为发送的数据包填写标头的其余部分。另外,不要忘记主机和网络字节顺序之类的东西。
TCP在RFC 793中定义,可在以下位置找到:http://www.faqs.org/rfcs/rfc793.html
根据我们要尝试执行的操作,使现有软件为我们处理TCP握手可能更容易。
段落数量不匹配