检查远程端口是否在 UDP 上处于 UP(侦听)状态?

问题描述 投票:0回答:4

我必须根据正在运行的服务(IP+端口)来检测远程主机是否已启动。我无法使用 ping,因为即使 ICMP 端口被阻止,我们也需要使其正常工作。

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

谢谢!

c# .net udp
4个回答
2
投票

摘自 nmap 文档:

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

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


0
投票

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


0
投票

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 and host 172.17.0.1) 如果端口关闭,您应该看到类似这样的内容 IP 172.16.0.1 > xxx.local:ICMP 172.16.0.1 udp 端口 1900 无法访问,长度 49 如果没有这个表明端口可能是开放的


0
投票

我试过了。 这个:

import socket

IP = "109.XXX.X.X4"
PORT = 53
MESSAGE = "Hello"

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(MESSAGE.encode(), (IP, PORT))

如果我使用端口 53 nothink。如果我使用 52 或其他端口,它就可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.