登录
首页 >  Golang >  Go问答

区分远程端口的关闭和过滤方法

来源:stackoverflow

时间:2024-03-14 23:36:25 400浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《区分远程端口的关闭和过滤方法》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我正在使用 Go 在我的应用程序中为远程服务器设置端口扫描器。我正在使用 Go net 包中的 DialTimeout 函数来检查远程主机端口是否打开。结果很好,有成功案例。但是,如果发生 i/o 超时,我需要确定是否发生

  1. 端口已关闭(没有服务正在运行)或
  2. 端口被阻止(防火墙已过滤)或
  3. 由于运行应用的本地系统的互联网连接中断。

尝试过 nmap cli 命令,我可以准确区分这 3 种失败情况。 尝试过 nmap 命令:nmap -sA -p port_number host_ip

我找到了一个 Go 3rd party 库来使用 nmap。 但是,我不想在我的应用程序中使用 nmap。 Go 中是否有其他替代方案可以准确区分这 3 种情况?


解决方案


在简单的世界

假设您要扫描 Linux 系统。

如果您收到 ICMP message type 3 code 3,防火墙明确告诉您:

如果您没有得到上述答案并且无法建立连接,则端口将关闭。因此,我强烈建议使用 context.WithTimeout 进行连接。

在现实世界中

但是,这仅适用于目标主机的管理员未更改要响应的 ICMP 消息类型 -​​ 或选择仅丢弃来自不允许访问相应服务的源的任何数据包。在后一种情况下,您无法知道端口是关闭还是被过滤。

以上所有内容仅适用于我们在目标系统上使用默认设置谈论基于 iptables 的防火墙的情况。

现在假设更可能的情况:边界防火墙加上本地防火墙。边界防火墙可能会发送其他 ICMP 消息(或者再次简单地丢弃您的包)。这些规则还适用于本地防火墙的规则。因此,您实际上是在扫描主机,这是一种误解。更准确的说法是扫描特定IP可访问的服务。

编辑

为什么要发送 ICMP 消息明确拒绝连接尝试?

做出这一决定有多种原因。有一个good answer on serverfault.com

理论要掌握,实操不能落!以上关于《区分远程端口的关闭和过滤方法》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>