我如何处理 Scapy 中关闭的端口?

How can I deal with closed ports in Scapy?

我试图通过在端口 22、53 和 80 上向本地路由器发送 TCP/IP 数据包来了解 Scapy 的工作原理。端口 53 和 80 是开放的 - 22 已关闭:

p = sr(IP(dst="192.168.1.1")/TCP(dport=[22, 53, 80]))

Begin emission:
.*Finished to send 3 packets.
.................................................
.................................................
.................................................
etc
.........................................^C
Received 24571 packets, got 2 answers, remaining 1 packets

如果我只将数据包发送到端口 53 和 80 - 不会出现问题:

In [5]: p = sr(IP(dst="192.168.1.1")/TCP(dport=[53, 80]))
Begin emission:
.*Finished to send 2 packets.
*
Received 3 packets, got 2 answers, remaining 0 packets

Scapy 版本 -> 2.3.1(最新)


更新 感谢 @pss 的评论,这里是使用过滤器 host 192.168.1.1:

捕获的 wireshark 数据
In [28]: p = sr(IP(dst="192.168.1.1")/TCP(dport=[53, 80, 1111]))
Begin emission:
.**Finished to send 3 packets.
..........................................
..........................................
..........................................
etc
.........................^C
Received 313 packets, got 2 answers, remaining 1 packets

似乎端口 22 和 1111 被过滤了:它们可能在系统上关闭或打开,但某些东西(防火墙)阻止我们得到答案。

如果你希望sr()在某些数据包没有收到任何应答时终止,你可以添加一个timeout=值(以秒为单位):

p = sr(IP(dst="192.168.1.1")/TCP(dport=[22, 53, 80]), timeout=2)