用SOCK_RAW s进行TCP握手

2024-05-22 03:05:41 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我意识到这种情况有些不寻常,但是我需要建立一个TCP连接(三方握手),只使用原始套接字(在C语言中,在linux中)——也就是说,我需要自己构造IP头和TCP头。我正在写一个服务器(所以我必须首先对传入的SYN包做出响应),不管是什么原因,我似乎都没能把它弄对。是的,我知道SOCKúu流会帮我处理这个问题,但出于我不想进入的原因,这不是一个选择。

我在网上找到的使用原始套接字的教程都描述了如何构建SYN泛洪器,但这比实际建立TCP连接要容易一些,因为您不必基于原始数据包构造响应。我已经得到了SYN泛洪器的例子,我可以从原始套接字读取传入的SYN数据包,但是我仍然无法为来自客户端的传入SYN创建有效的SYN/ACK响应。

那么,有没有人知道一个关于使用原始套接字的好教程,它不仅仅是创建一个SYN泛洪器,或者有没有人有一些代码可以做到这一点(使用SOCK_raw,而不是SOCK_STREAM)?我将非常感激。


MarkR是绝对正确的——问题是内核正在发送重置包以响应初始包,因为它认为端口已关闭。内核正在攻击我的响应,连接就断了。我已经在使用tcpdump监视连接了——我应该更仔细地观察,并注意到有两个回复,其中一个是正在搞砸事情的重置,以及我的程序创建的响应。哦!

最有效的解决方案似乎是使用iptables规则,如MarkR所建议的,来阻止出站数据包。然而,有一种比使用mark选项更简单的方法,正如所建议的那样。我只匹配是否设置了重置TCP标志。在正常连接过程中,这是不可能需要的,而且如果我阻止来自正在使用的端口的所有出站重置数据包,这对我的应用程序来说并不重要。这有效地阻止了内核不需要的响应,但不是我自己的包。如果我的程序监听的端口是9999,那么iptables规则如下:

iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP

Tags: 端口程序iptables规则原因教程数据包内核
3条回答

我意识到这是一个旧线程,但这里有一个超出常规SYN泛洪器的教程:http://www.enderunix.org/docs/en/rawipspoof/

希望能对别人有所帮助。

我不能帮你做任何辅导。

但是我可以给你一些关于你可以用来帮助调试的工具的建议。

首先,正如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(或类似的)来减少所需的硬件数量。

抱歉,我不能推荐一个具体的教程。

祝你好运。

相关问题 更多 >