我必须根据正在运行的服务(IP+端口)来检测远程主机是否已启动。我不能使用 ping,因为即使 ICMP 端口被阻塞,我们也需要让它工作。
有时服务使用 TCP,有时使用 UDP(但是当我必须检查时,我知道服务器是否必须在 UDP 或 TCP 上运行,这取决于它的类型)。我检查 TCP 端口没有问题(基于https://stackoverflow.com/a/7605428/397830)。但是由于 UDP 不是一个面向连接的协议,我怎么能确定远程主机在这个端口上监听 UDP 呢?
谢谢!
我必须根据正在运行的服务(IP+端口)来检测远程主机是否已启动。我不能使用 ping,因为即使 ICMP 端口被阻塞,我们也需要让它工作。
有时服务使用 TCP,有时使用 UDP(但是当我必须检查时,我知道服务器是否必须在 UDP 或 TCP 上运行,这取决于它的类型)。我检查 TCP 端口没有问题(基于https://stackoverflow.com/a/7605428/397830)。但是由于 UDP 不是一个面向连接的协议,我怎么能确定远程主机在这个端口上监听 UDP 呢?
谢谢!
摘自 nmap 文档:
UDP 扫描通过向每个目标端口发送一个 UDP 数据包来工作。对于一些常见的端口,例如 53 和 161,发送特定于协议的有效负载,但对于大多数端口,数据包是空的。--data-length 选项可用于向每个端口发送固定长度的随机有效负载,或者(如果您指定值 0)禁用有效负载。如果返回 ICMP 端口不可达错误(类型 3,代码 3),则关闭端口。其他 ICMP 不可达错误(类型 3,代码 1、2、9、10 或 13)将端口标记为已过滤。有时,服务会响应一个 UDP 数据包,证明它是开放的。如果重传后没有收到响应,则端口被分类为打开|过滤。这意味着端口可能是打开的,或者可能是数据包过滤器阻止了通信。
您可以在此处阅读全文: 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 and host 172.17.0.1) 如果端口已关闭,您应该会看到类似这样的内容 IP 172.16.0.1 > xxx.local: ICMP 172.16.0.1 udp port 1900 unreachable, length 49 The没有这表明端口可能是开放的