UDP端口探活的那些细节

这篇具有很好参考价值的文章主要介绍了UDP端口探活的那些细节。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 背景

商业客户反馈用categrafnet_response插件配置了udp探测, 遇到报错了,如图 

UDP端口探活的那些细节,Categraf,udp,Categraf

udp是无连接的,无法用建立连接的形式判断端口。 插件最初的设计是需要配置udp的发送字符,并且配置期望返回的字符串,

[[instances]]
targets = [
      "127.0.0.1:161",
]

protocol = "udp"

## string sent to the server
  send = "hello"
## expected string in answer
  expect = "hello"

通过返回字符与期望字符是否相等,来判断端口是否连通。用户随即发了另一张图 ,用ncat 来探测端口是ok的 

UDP端口探活的那些细节,Categraf,udp,Categraf

ncat 探测逻辑

先看下 ncat的udp探测逻辑

/*
 * udptest()
 * Do a few writes to see if the UDP port is there.
 * Fails once PF state table is full.
 */
int
udptest(int s)
{
    int i, t;

    if ((write(s, "X", 1) != 1) ||
        ((write(s, "X", 1) != 1) && (errno == ECONNREFUSED)))
        return -1;

    /* Give the remote host some time to reply. */
    for (i = 0, t = (timeout == -1) ? UDP_SCAN_TIMEOUT : (timeout / 1000);
         i < t; i++) {
        sleep(1);
        if ((write(s, "X", 1) != 1) && (errno == ECONNREFUSED))
            return -1;
    }
    return 1;
}

先理一下代码片段的探测逻辑,先向目标写入一个X,观察是否有ECONNREFUSED, 如果有,则表示端口没有打开; 如果没有ECONNREFUSED,>则看一下timeout是否设置,没有设置,则for循环3次(UDP_SCAN_TIMEOUT),如果设置了timeout, 则for循环timeout的次数(以秒计 )。再看下for循环里面,依然是每次写入一个 X ,观察是否有 ECONNREFUSED

简单来说,就是向探测目标发送一个X,观察是否有connection refused,没有的话表明目标端口是打开的(即使对端没有返回任何内容导致超时 )。

实现

看完这个逻辑就简单了,我们可以用go照着实现。网络上的udp port scanner 除了发送X , 还有发送0的, 也有根据已知端口,按照协议发送数>据的。简单和通用起见,还是按照ncat的逻辑来。

       msg := []byte("X")
        t := math.Max(float64(time.Duration(ins.ReadTimeout)/time.Second), 3)
        for i := 0; i < int(t); i++ {
            time.Sleep(1 * time.Second)
            _, err = conn.Write(msg)
            if err != nil && config.Config.DebugMode {
                log.Printf("E! write udp failed, address: %s, error: %s", address, err)
            }
            if err != nil && strings.Contains(err.Error(), "refused") {
                fields["result_code"] = ConnectionFailed
                return tags, fields, nil
            }
    }

完整PR见链接文章来源地址https://www.toymoban.com/news/detail-831579.html

到了这里,关于UDP端口探活的那些细节的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • socket端口复用之TCP和UDP

    目录 1.什么是端口复用? 2.多个socket可以绑定同一个端口吗? 3.绑定同一端口的多个套接字如何接收数据? 4.SO_REUSEADDR和SO_REUSEPORT选项设置 5.SO_REUSEADDR和SO_REUSEPORT在实际中的运用? 5.1 解决TCP套接字处于TIME_WAIT状态占用端口号问题。 5.2 程序重启后后,端口未释放导致程序重启

    2024年02月07日
    浏览(42)
  • Windows NC 测试 UDP 端口是否连通

    背景 检测服务器的udp端口是否开放,最好的测试方法就是,服务端开启一个 UDP 监听,客户端向服务端发送 UDP 数据包,服务器查看是否能接收到。 举例 链接:https://eternallybored.org/misc/netcat/ 在window上解压netcat,并且配置环境变量: 在服务器端安装nc命令,并且监听某个udp端

    2024年02月11日
    浏览(31)
  • 云服务器:开放TCP、UDP端口

            众所周知,电脑设备有些端口默认是不开放的,我们使用TCP或者UDP去连接没有开放端口时就会被防火墙拦截,所以就需要到电脑防火墙设置里面把需要用到的端口开放出来。操作如下:         1.打开防火墙(可以直接搜索)         2.新建规则       

    2024年02月03日
    浏览(54)
  • powershell udp源端口范围转发到目的端口范围中的同一端口

    在PowerShell中实现UDP源端口范围转发到目的端口范围中的同一端口,你需要为每个源端口和目标端口对创建一个独立的转发规则。由于PowerShell的限制,这通常涉及创建多个独立的监听线程或异步任务。以下是一个示例脚本,展示了如何使用PowerShell实现这一功能: 在这个脚本中

    2024年02月19日
    浏览(46)
  • C#学习系列之UDP同端口收发问题

    想测试自己的程序问题,建立了两个UDP程序,一个往端口中接到数就传出去,另一个从这个端口接数据来解析。 出现的问题是 每次打开端口,另一个程序就无法接入。 最后通过调试发现,当两个程序都使用一下句子,只要添加多播组就会出现问题。 替换方案 只要简单声明

    2024年02月09日
    浏览(39)
  • UDP和TCP可以使用同一个端口吗?

    之前有读者在面试的时候,被问到: TCP 和 UDP 可以同时监听相同的端口吗? 关于端口的知识点,还是挺多可以讲的,比如还可以牵扯到这几个问题: 多个 TCP 服务进程可以同时绑定同一个端口吗? 客户端的端口可以重复使用吗? 客户端 TCP 连接 TIME_WAIT 状态过多,会导致端

    2023年04月08日
    浏览(92)
  • CentOS7系统放行TCP/UDP端口教程

    在使用CentOS7操作系统时,您需要放行某些端口,以便应用程序能够正常运行。下面是如何放行TCP/UDP端口的步骤。 步骤1:SSH连接服务器 使用SSH方式连接服务器,如果您不知道如何SSH连接服务器,可以查看该教程:SSH远程连接 Linux 服务器教程 步骤2:确定要放行的端口 在放行

    2024年02月11日
    浏览(42)
  • 使用ICMP协议来判断UDP端口的存活状态

            我们使用了原始套接字(socket.SOCK_RAW)来发送和接收ICMP消息,也就是通过模拟ICMP协议来进行UDP端口的探测。我们构造了一个简单的ICMP数据包,并将其发送到目标主机的特定端口。然后,我们等待接收目标主机返回的ICMP消息,并判断其类型和代码是否为端口不可

    2024年02月10日
    浏览(39)
  • 校园网免认证登录的方法-利用udp53端口

    原理 (不想了解原理直接点击步骤跳转) 首先想要上网的先决条件就是要有一个属于自己的IP地址,我们的校园网都是链接WIFi后验证身份的,但请注意,这个时候我们已经连接上了学校装的路由器。所以我们先查看在不登录的情况下,学校的路由器是否给我们分配了IP(在后

    2024年02月08日
    浏览(41)
  • 关于socket的地址复用和端口复用技术与UDP并发

     一. socket五元组 linux: setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,(const void *)reuse , sizeof(int)); setsockopt(fd, SOL_SOCKET, SO_REUSEPORT,(const void *)reuse , sizeof(int)); windows: setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR,(const char*)reuse , sizeof(int));  socket是系统级资源(区别于进程级和线程级,在本机上是全局唯一的

    2024年02月05日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包