检查C++中开放的UDP端口

5
如何使用本地C++检查远程UDP端口是否开放?由于UDP是无连接的,调用connect()没有帮助。我不能尝试绑定它,因为它不是本地的。 nmap也不能指示(但是netstat可以找到,但我认为它查看有关打开端口/文件的内部信息)。有没有办法检测它?如果我在网络层下降一层,是否可能通过C++发送ICMP消息来检查端口不可达状态?我的意思是,那会给出足够的端口状态信息吗?
平台是Linux。

本地的C++在哪些操作系统/平台上? - 0xC0000022L
语言并不是问题,关键是你的代码执行的特权级别。例如,你可以像 nmap 一样从你的 C++ 代码中使用 libpcap 库。此外,如果你尝试 nmap 的所有选项,即使在某些情况下不能百分之百确定端口是否开放或被过滤,至少也会得到一个指示。你使用了哪些 netstatnmap 选项? - 0xC0000022L
netstat -lptun 表明在1060端口有一个UDP端口处于打开状态,但是我好像忘记了在nmap中加上-sU选项。它需要root访问权限才能找到(并且它可以正确地找到),为什么? - Mustafa
@EJP:哦?请向我解释为什么某些套接字操作只允许特权用户进行?例如,某些系统上的“traceroute”就因为这个原因而受到限制。我真的很好奇。 - 0xC0000022L
@STATUS_ACCESS_DENIED 该问题也不相关。他在谈论远程端口的状态。本地系统的特权与此无关。他需要与远程系统通信,而这并不需要特权。 - user207421
显示剩余2条评论
2个回答

5
我假设您正在尝试确定远程计算机上的UDP端口是否通过防火墙并/或有应用程序在运行。
您无法可靠地确定这一点。最接近的方法是尝试向该地址和端口发送一系列小数据报,间隔约为1秒,持续约10秒。
如果没有阻止端口的防火墙和没有运行的应用程序,则远程系统可能会发送回ICMP_UNREACH_PORT(端口不可达)。如果没有阻止防火墙,且远程系统已关闭,则路由器可能会发送回 ICMP_UNREACH_HOST ICMP_UNREACH_NET。如果防火墙阻止您,则它可能会发送回ICMP_UNREACH_FILTER_PROHIB,但大多数防火墙不会发送任何信息。
得到任何反馈的可能性非常小,因为大多数防火墙都会阻止这种类型的ICMP反馈。即使收到ICMP消息,Linux通常也不会让您看到它,除非您以root身份运行。一些操作系统将报告ICMP错误作为下一个sendto()到相同地址/端口的失败,这就是为什么需要重复发送消息几次的原因。但某些操作系统不会这样做,在这种情况下,您必须打开特定的ICMP端口并解析任何返回消息。
即使您以某种方式获取了ICMP消息,也要理解它们并不可靠。例如,即使应用程序不仅正在侦听而且还主动向您发送数据,您仍可能收到 ICMP_UNREACH_PORT 。(这很少见,但我见过发生过。)
如果正在给定端口上运行应用程序,如果您知道那个应用程序是什么,如果您知道如何制作一条消息,该消息将导致该应用程序向您响应,则这样做并获得响应是表明该端口已打开的最佳指示。但是,未收到响应意味着什么都没有:也许端口被阻止了,也许应用程序没有运行,或者也许它只是不喜欢您的消息。
底线:实际上不行。

0

检查远程端口是否准备好接收UDP数据报的方法并不是百分之百可靠的。由于UDP是无连接的,你只能判断远程主机是否对你发送的内容做出了有意义的回应。虽然可能有一些方法可以获得提示(如端口扫描器所做的),但在生产代码中我不会依赖这些方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接