我需要发送一个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)

10-08 16:08