python中try-TCP三方握手时系统为什么发送RST标志

python中try-TCP三方握手时系统为什么发送RST标志,python,ubuntu,networking,tcp,scapy,Python,Ubuntu,Networking,Tcp,Scapy,我想在我的ubuntu中创建一个TCP-3方式的握手。 我在虚拟机中使用了kali linux。在kali linux(IP-172.16.28.130)的终端中,我以“侦听”模式打开了一个端口,以获得与该机器的连接 nc -l -p 1025 我在ubuntu主机上运行的python代码 #!/usr/bin/python from scapy.all import * import logging logging.getLogger("scapy.runtime").setLevel(lo

我想在我的ubuntu中创建一个TCP-3方式的握手。 我在虚拟机中使用了kali linux。在kali linux(IP-172.16.28.130)的终端中,我以“侦听”模式打开了一个端口,以获得与该机器的连接

nc -l -p 1025
我在ubuntu主机上运行的python代码

#!/usr/bin/python
from scapy.all import *
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

#if i send to broadcast address : 192.168.1.255 what will happen?
def sendPacket(src, dst):
   ip = IP(dst = dst)
   port = RandNum(1024, 65535)
   SYN = ip / TCP(sport=port, dport=1025, flags="S", seq = 42)
   SYNACK = sr1(SYN, verbose=0)

   ACK = ip / TCP(sport = SYNACK.dport, dport=80, flags="A", seq = SYNACK.ack, ack = SYNACK.seq + 1)
   send(ACK)

   print "Done!!\n"

src = '1.2.3.4'
dst = '172.16.28.130'
sendPacket(src, dst)
使用wireshark捕获数据包

3      172.16.28.1   172.16.28.130   TCP   54   64865 > blackjack [SYN] Seq=0 Win=8192 Len=0

4      172.16.28.130   172.16.28.1   TCP   60   blackjack > 64865 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460

7      172.16.28.1   172.16.28.130   TCP   54   64865 > blackjack [RST] Seq=1 Win=0 Len=0

8      172.16.28.1   172.16.28.130   TCP   54   64865 > http [ACK] Seq=1 Ack=1 Win=8192 Len=0

9      172.16.28.130   172.16.28.1   TCP   60   http > 64865 [RST] Seq=1 Win=0 Len=0
在运行代码之前,我更改了IPtable

iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.1.20 -j DROP
当我将目标更改为,dst=“www.google.com”,目标端口更改为,dport=80时,工作正常

但是现在,, 1) 我可以发送SYN包 2) 目的地使用SYN、ACK数据包进行响应 3) 我的系统发送RST 4) 我回信了 5) 目标系统用RST应答 所以我无法建立连接!! 问题: 1)如何成功建立连接 2) 我的来源ip=“1.2.3.4”, *但当我发送到虚拟机时,它显示172.16.28.1(广播ip)。为什么?

1) 我怎样才能成功地建立联系

这里有一个猜测。将
iptables
命令更改为:

iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 172.16.28.1 -j DROP
当您连接到google.com时,您是通过物理以太网设备进行连接的,该设备具有IP 192.168.x.y,因此
-s
参数匹配

当您连接到Kali时,您是通过地址为172.16.x.y的虚拟以太网设备连接的,因此
-s
不匹配

您需要从正确的输出队列中删除RST数据包

2) 我的源ip=“1.2.3.4”*,但当我发送到虚拟机时,它显示172.16.28.1(广播ip)。为什么?

首先,172.16.28.1不是您的广播IP。它是主机虚拟以太网设备的IP

源IP没有出现的原因是您没有使用它:

ip = IP(dst = dst)
指定目标地址,但不指定源地址。某些实体(scapy或主机操作系统IP堆栈,我不确定)正在为您选择一个合理的源地址。您可以尝试:

ip = IP(dst = dst, src = src)

看看那里发生了什么。

src问题解决了。谢谢但我还不能建立联系。我以各种方式更改了iptables,比如,“iptables-A OUTPUT-ptcp-tcp标志RST-s 192.168.1.7-j DROP”,iptables-A OUTPUT-ptcp-tcp标志RST-s 172.16.28.1-j DROP,“iptables-A OUTPUT-ptcp-tcp标志RST-s 172.16.28.130-j DROP”……但没有区别。我的系统发送RST。我需要在卡利改变什么吗?