检查远程端口在UDP上是否UP(侦听)

本文关键字:UP 侦听 是否 程端口 UDP 检查 | 更新日期: 2023-09-27 18:11:04

我必须检测远程主机是否UP,基于它的服务(IP+端口)运行。我不能使用ping,因为我们需要使它工作,即使ICMP端口被阻止。

有时服务是使用TCP,有时UDP(但当我要检查,我知道如果服务器必须运行在UDP或TCP,这取决于它的类型)。我检查TCP端口(基于https://stackoverflow.com/a/7605428/397830)没有问题。但是,由于UDP不是面向连接的协议,我怎么能确定远程主机在这个端口上监听UDP ?

谢谢!

检查远程端口在UDP上是否UP(侦听)

节选自nmap文档:

UDP扫描通过向每个目标端口发送UDP数据包来工作。对于一些常见的端口,如53和161,发送特定于协议的有效载荷,但对于大多数端口,数据包是空的。——data-length选项可用于向每个端口发送固定长度的随机有效载荷,或者(如果指定值为0)禁用有效载荷。如果返回ICMP端口不可达错误(类型3,代码3),则端口关闭。其他ICMP不可达错误(类型为3,编码为1、2、9、10或13)表示端口被过滤。偶尔,服务将响应一个UDP数据包,证明它是打开的。如果重传后未收到响应,则将端口分类为打开/过滤。这意味着端口可能是打开的,或者数据包过滤器正在阻止通信。版本检测(-sV)可以用来帮助区分真正开放的端口和过滤的端口。

你可以在这里阅读全文:NMAP端口扫描

对于UDP,您可以将"hello数据包"集成到您的协议中,一旦在服务器端接收到,服务器发送回另一个"hello数据包",一旦客户端接收到该数据包,它就知道服务器已启动并运行。

UDP主要是先发后忘。如果您没有得到端口不可达的响应,则端口可能已打开…试试这个python脚本:

import socket
IP = "172.16.0.1"
PORT = 1900
MESSAGE = "Hello"
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(MESSAGE, (IP, PORT))

在执行此命令时,以root身份运行$(tcpdump icmp和host 172.17.0.1)如果端口关闭,您应该看到如下所示的内容IP 172.16.0.1> xxx。local: ICMP 172.16.0.1 udp端口1900不可达,长度49如果没有,则表示端口可能是打开的