我所做的:
这很好,但是,在成功接收到数据报之后,客户端总是发送ICMP“目标不可达(端口不可达)”。 Scapy命令在客户端上运行:
pkt = IP(dst='192.168.1.2')/UDP(sport=49000, dport=50991)/Raw(udp_command_bytes)
rec = sr1(pkt)
我有一个基于POXIS的应用程序使用套接字执行相同的操作,并且没有发送ICMP响应。上面的scapy命令有什么问题?不应该在端口49000上听取响应吗?
Scapy并不是要在UDP端口上“监听”,而是“嗅探/监视”它(参见https://scapy.readthedocs.io/en/latest/introduction.html#scapy-decodes-it-does-not-interpret)
这意味着正在运行的TCP / IP堆栈不知道scapy也在接收数据包,因此,如果它没有看到消费者,这取决于你的堆栈配置(参见https://serverfault.com/questions/522709/disable-icmp-unreachable-replies),它可以决定发送一个指示UDP数据包未到达消费者(包含UDP端口不可达指示的额外ICMP消息)。
作为一种解决方法,您只需打开一个shell即可:
netcat -lkfu 49000
这将确保您的系统具有此端口的使用者,您仍然可以使用scapy来处理所有传入流量。