【问题标题】:Check if a remote port is UP(listening) on UDP?检查远程端口是否在 UDP 上处于 UP(侦听)状态?
【发布时间】:2013-04-25 14:10:36
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: c# .net udp


    【解决方案1】:

    nmap 文档节选:

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

    您可以在此处阅读全文: NMAP port scanning

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不幸的是,它是针对大量服务的,我在这里无法实现。
    【解决方案3】:

    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 没有这个表示端口可能是开放的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多