scapy不需要的RST TCP数据包

问题描述:

为了理解TCP是如何工作的,我尝试伪造我自己的TCP SYN/SYN-ACK/ACK(基于教程:http://www.thice.nl/creating-ack-get-packets-with-scapy/)。scapy不需要的RST TCP数据包

问题是,无论我的计算机何时从服务器收到SYN-ACK,它都会生成一个RST数据包,用于停止连接过程。

我尝试在OS X Lion和Ubuntu 10.10 Maverick Meerkat上重置连接。我发现这个:http://lkml.indiana.edu/hypermail/linux/net/0404.2/0021.html,我不知道是不是原因。

有没有人可以告诉我可能是什么原因?以及如何避免这个问题?

谢谢。

+0

我认为这个代码片段使这个问题更明显:'ans = scapy.all。SR1(generate_tcp_syn_pkt()); ack_pkt = generate_tcp_ack_pkt(ans); scapy.all.send(ack_pkt)' – diabloneo 2013-09-26 17:12:28

+0

您是如何解决OS X的这个问题的? – user1505986 2015-11-08 11:10:11

你所引用的文章,使这很清楚......

既然你没有完成完整的TCP握手您的操作系统可能会试图采取控制,并可以开始发送RST(复位)数据包,以避免这一点,我们可以用iptables:

iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.1.20 -j DROP 

本质上说,问题是,scapy在用户空间,而Linux内核运行将首先收到SYN-ACK。内核将发送一个RST,因为在您有机会对scapy执行任何操作之前,它将不会在端口号上打开一个套接字。

该解决方案(如博客提到的)是防止您的内核发送RST数据包。

+0

感谢您提供这些有用的附加信息。 – user1177093 2012-02-09 12:55:48

+0

非常欢迎 – 2012-02-09 13:04:40

+4

有没有没有IPTables的解决方案?我真的不能更改我的机器上的iptables配置。除此之外,我还想从我的实现中发出RST(也为测试目的创建自己的TCP流) – KillianDS 2012-12-10 11:21:47

我没有非iptables的答案,但可以解决重置问题。而不是试图筛选过滤表中的传出重置,而是过滤来自原始表中目标的所有传入数据包。这可以防止来自目标的返回数据包甚至被内核处理,尽管scapy仍然会看到它们。我使用的语法如下:

iptables -t raw -A PREROUTING -p tcp --dport <source port I use for scapy traffic> -j DROP 

该解决方案确实强迫我使用我的业务相同的源端口;随意使用你自己的iptables-fu来识别你的目标的返回数据包。

其他答案中引用的博客文章并不完全正确。这不仅是因为你没有完成三次握手,而是因为内核的IP栈并不知道发生了连接。当它收到SYN-ACK时,它发送一个RST-ACK,因为它是意外的。第一次或最后一次接收真的没有进入它。该堆栈收到SYN-ACK是问题所在。

使用IPTables丢弃出站RST数据包是一种常见且有效的方法,但有时需要从Scapy发送RST。一个更多参与但非常可行的方法是降低,使用与主机不同的MAC生成并响应ARP。这使您可以在不受主机干扰的情况下发送和接收任何内容。

显然这是更多的努力。就我个人而言,当我真的需要自己发送一个RST时,我只采取这种方法(而不是RST丢弃方法)。