为什么在python中尝试TCP三路握手时系统要发送RST标志

2024-10-06 16:25:39 发布

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

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

nc -l -p 1025

我在ubuntu主机上运行的python代码

^{pr2}$

用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)。为什么?


Tags: 代码httplenubuntu系统rstwinseq
1条回答
网友
1楼 · 发布于 2024-10-06 16:25:39

1) how can i success full establish a connection

猜猜看。将iptables命令更改为:

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

当您连接到谷歌,您正通过物理以太网设备进行连接,该设备的IP为192.168.x.y,因此-s参数匹配。在

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

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

2) my source ip = "1.2.3.4", * but when i sent to virtual machine it shows 172.16.28.1(Broadcast ip). why?

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

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

^{pr2}$

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

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

看看会发生什么。在

相关问题 更多 >