我需要发送一个fin包来关闭一个具有ip和端口信息(以及previus包中的其他信息)的连接。
我已经看到,通过3路握手创建新连接是可行的(请参见3 way handshake in Scapy),但连接关闭时没有。
最佳答案
如RFC所述,您需要发送一个fin段,然后等待端点的确认(ack)+fin段,然后为它发送最后一个ack段。
下面是一个使用scapy的简单示例:
from scapy.all import *
conf.L3socket=L3RawSocket
sport=10000
dport=45000
pkt=IP(src="1.2.3.4", dst="4.5.6.7")
SYN=pkt/TCP(sport=sport, dport=dport, flags="S")
SYNACK=sr1(SYN)
ACK=pkt/TCP(sport=sport, dport=dport, flags="A", seq=SYNACK.ack, ack=SYNACK.seq + 1)
send(ACK)
# ...
FIN=pkt/TCP(sport=sport, dport=dport, flags="FA", seq=SYNACK.ack, ack=SYNACK.seq + 1)
FINACK=sr1(FIN)
LASTACK=pkt/TCP(sport=sport, dport=dport, flags="A", seq=FINACK.ack, ack=FINACK.seq + 1)
send(LASTACK)