检查远程端口是否在UDP上(正在侦听)?
我必须根据它的服务(IP +端口)运行来检测远程主机是否为UP。我无法使用ping,因为即使ICMP端口被阻塞,我们也需要使其工作。检查远程端口是否在UDP上(正在侦听)?
有时服务使用TCP,有时UDP(但是当我必须检查时,我知道服务器是否必须在UDP或TCP上运行,这取决于它的类型)。我没有问题检查TCP端口(根据https://stackoverflow.com/a/7605428/397830)。但是由于UDP不是面向连接的协议,我怎么能确定远程主机在这个端口上监听UDP?
谢谢!
摘录:
UDP扫描通过发送一个UDP数据包到每个目标端口的。对于53和161等一些常用端口,会发送特定于协议的有效负载,但对于大多数端口来说,数据包是空的。 --data-length选项可用于向每个端口发送固定长度的随机有效负载,或者(如果指定值为0)禁用有效负载。如果返回ICMP端口不可达错误(类型3,代码3),则端口关闭。其他ICMP不可达错误(类型3,代码1,2,9,10或13)将端口标记为过滤。有时候,服务会以UDP数据包作为响应,证明它是开放的。如果重传后没有收到响应,端口将被分类为过滤。这意味着该端口可能是开放的,或者数据包过滤器阻塞了通信。版本检测(-sV)可用于帮助区分真正开放的端口和已过滤的端口。
你可以在这里阅读全文: NMAP port scanning
对于UDP,您可以将“hello数据包”集成到您的协议中,一旦在服务器端接收到,服务器就会发回另一个“hello数据包”,一旦客户端收到该数据包,就知道服务器已启动并跑步。从nmap的文档
不幸的是,这是为了大量的服务,我不能在这里实现一些东西。 – J4N 2013-04-25 14:49:48
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))
,运行$(tcpdump的ICMP和主机172.17.0.1)作为根 如果端口是关闭的,你应该看到像这样 IP 172.16.0.1> xxx.local:ICMP 172.16.0.1 UDP端口1900不可达,长度49 这种由于缺少指示该端口可以是开放
对不起,我必须使用C#代码 – J4N 2013-04-25 14:51:41
好吧,我看到了,我发现另一个链接,在相同的方向去比你的答案:http://stackoverflow.com/a/9265820/397830 – J4N 2013-04-25 14:51:03