首页 > 其他分享 >UDP端口探活的那些细节

UDP端口探活的那些细节

时间:2024-02-06 17:22:18浏览次数:39  
标签:ECONNREFUSED UDP err 端口 udp timeout 探活

一 背景

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

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的 ncat.png

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见链接

标签:ECONNREFUSED,UDP,err,端口,udp,timeout,探活
From: https://www.cnblogs.com/ulricqin/p/18010072

相关文章

  • nginx改变访问应用端口以及解决css,js或表单提交访问不到的问题
    场景如果原先某个网站是通过ip:8080直接访问的,现在想要加个前缀,并且去掉端口进行访问,比如ip/myapp去访问这个项目,可以通过nginx来实现这个过程。最近有个需求需要变更redmine的访问路径,从ip:8080改成ip/redmine,下面以redmine举例子。配置过程以ip/redmine来访问原先ip:8080的项......
  • Nginx配置TCP/UDP流量转发
    #usernobody;worker_processes1;#error_loglogs/error.log;#error_loglogs/error.lognotice;#error_loglogs/error.loginfo;#pidlogs/nginx.pid;events{worker_connections1024;}stream{log_formatmain'$remote_addr[$tim......
  • H3C 交换机端口安全实验
    H3C交换机端口安全实验实验拓扑​​实验需求按照图示配置IP地址在SW1所有连接PC的接口上配置开启802.1X验证,使接入的终端需要进行身份验证创建一个用户身份验证的用户。用户名为wangdaye​,密码为123456​创建一个端口隔离组,实现三台PC无法互相访问实验步骤PC配置IP(略)......
  • Eralng 学习笔记第六天, Fun,进程,电子邮件,数据库,端口
    ErlangFun  示例:-module(helloworld). -export([start/0]). start() ->    A = fun(X) ->       io:fwrite("~p~n",[X])       end,    A(5).输出5----------------------------------------------------module(helloworld). -export(......
  • centos系统安装mysql并开放端口外部使用
    查看安装包:https://dev.mysql.com/downloads/repo/yum/下载MySQL源:wgethttp://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm安装MySql源yum-yinstallmysql57-community-release-el7-11.noarch.rpm查看一下安装效果yumrepolistenabled|grepmysq......
  • WINDOW 下CMD 根据端口号、程序名称 查询 及杀死进程
     文章目录1.查询进程2.杀死进程3.实战:根据端口号查找进程再查找文件安装路径 1.查询进程#根据根据端口号查询进程netstat-ano|findstr端口号#根据进程号查询应用名tasklist|findstr进程号根据关键字查询进程名tasklist|finstr关键字......
  • windows查看端口占用,通过端口找进程号(查找进程号),通过进程号定位应用名(查找应用)(netstat
     文章目录通过端口号查看进程号`netstat`通过进程号定位应用程序`tasklist` 通过端口号查看进程号netstat在Windows系统中,可以使用netstat命令来查看端口的占用情况。以下是具体的步骤:打开命令提示符(CMD):按Win+R组合键打开运行对话框,输入cmd并按Enter键。......
  • DotNetty 封装的 UdpClient
    DotNetty资料较少,UdpClient和TcpClient略有不同publicclassUdpCommunicator:ICommunicator{privateIChannel?_ClientChannel;privateBootstrap?_Bootstrap;IEventLoopGroup?_LoopGroup;privateTaskCompletionSource<byte[]>_ResponseComp......
  • nginx实现一个对外端口同时支持http和https协议访问
    前言最近有一个需求,需要让一个非80端口的http服务支持https访问;但是业务牵扯太多没法将http直接改为https,因此需要一个端口同时支持http和https方案一.使用nginx的stream、stream_ssl_preread模块参考资料Modulengx_stream_ssl_preread_moduleModulengx_stream_core_......
  • Linux如何查询是哪些进程占用了端口
    Addressalreadyinuse这个提示,想必大家遇到过,怎么能快速找到问题并解决呢?下面有几种姿势可以了解一下.在对网络连接或特定于应用程序的问题进行故障排除时,首先要检查的事情之一应该是系统上实际使用了哪些端口,以及哪个应用程序正在侦听特定的端口。本文介绍了如何使用netstat,s......