首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一款比 Netstat 更强大、更牛逼的轻量级命令行工具!

一款比 Netstat 更强大、更牛逼的轻量级命令行工具!

作者头像
民工哥
发布2026-03-24 13:11:35
发布2026-03-24 13:11:35
660
举报

特色专栏

MySQL/PostgreSQL/MongoDB

ElasticSearch/Hadoop/Redis

Kubernetes/Docker/DevOps

Kafka/RabbitMQ/Zookeeper

监控平台/应用与服务/集群管理

Nginx/Git/Tools/OpenStack

大家好,我是民工哥!

对于程序员来讲,诊断和解决网络问题也是我们日常工作中必备技能之一。

因此,Netstat 这个命令行工具也成了我们日常必不可少的工具之一。

Netstat(network statistics) 是一个命令行工具,它用来显示网络连接(传入和传出),路由表和许多网络接口(网络接口控制器或软件定义的网络接口)和网络协议统计信息。也可用于查找网络中的问题,打印 Linux 中网络系统的状态信息,查看整个 Linux 系统的网络情况。

Netstat 的使用平很广,包括 OS X、Linux、Solaris 和 BSD,以及基于 Windows NT 的操作系统,包括 Windows XP、Windows Vista、Windows 7/8/10。

今天,给大家推荐一款比 Netsta 更强大、更牛逼的命令行工具!

简介

dish 是一款专为套接字(Socket)连接状态监控设计的轻量级命令行工具。能够快速执行检查任务,提高监控效率。

还可通过cron任务驱动,定期运行dish进行一次性检查,无需长时间运行的代理程序,适合自动化监控任务。

其核心能力包括以下几点:

连接状态检测

实时监控 TCP/UDP 套接字的以下状态:

  • 连接成功:确认目标端口是否可访问(如 HTTP 80 端口)。
  • 异常断开:检测连接被拒绝(Connection Refused)、超时(Timeout)或重置(RST)。
  • 🔄 僵死连接:识别处于 TIME_WAITCLOSE_WAIT 等半开/半闭状态的连接。
协议支持

支持 IPv4/IPv6TCP/UDP 协议,兼容常见服务(如 Web 服务、数据库连接)。

优势
  • 轻量级:不依赖任何外部库,是一个独立的工具,资源占用低。
  • 简单高效:专注于一次性检查HTTP和TCP套接字的健康状态,操作简便。
  • 灵活:支持分布式监控,在不同的主机上部署独立的dish实例,从一个公共API获取配置,实现去中心化的监控;还提供多种标志(flags)供用户配置通知方式和其他选项,满足不同场景需求。

技术原理

dish 作为轻量级命令行监控工具,其监控原理主要围绕套接字(Socket)连接的状态检测展开,通过模拟客户端行为、解析网络响应等方式,实时判断连接是否成功建立、异常断开或处于僵死状态。

模拟客户端行为:dish通过模拟客户端与目标服务器的连接过程,检测套接字连接的状态。它可能模拟TCP三次握手或UDP数据包交互,以判断目标端口是否可访问。

解析网络响应:在模拟连接过程中,dish会解析目标服务器返回的网络响应,包括连接是否成功建立、是否被拒绝(Connection Refused)、是否超时(Timeout)或是否被重置(RST)。这些响应信息是判断连接状态的关键依据。

状态机驱动:dish可能基于TCP/UDP协议的状态机模型,对套接字连接的状态进行跟踪和判断。例如,它会识别SYN_SENT、FIN_WAIT、TIME_WAIT等状态,以判断连接是否处于正常、异常或僵死状态。

超时与重试机制:为了确保监控的准确性,dish可能设置了超时时间和重试次数。当连接尝试在超时时间内未得到响应时,dish会判定连接失败,并可能进行重试以确认状态。

轻量化与低开销:dish作为轻量级工具,其监控过程对系统资源的占用极低。它可能通过优化网络请求、减少不必要的日志记录等方式,实现高效且低开销的监控。

典型应用场景

服务可用性监控:替代 telnetnc,批量检测多台服务器的端口连通性。

故障排查:快速定位网络中断、服务崩溃或防火墙规则异常。

自动化运维:集成到 CI/CD 流程中,作为服务启动后的健康检查工具。

安装与使用

安装

可以通过 go install 或 Homebrew 安装,命令如下:

代码语言:javascript
复制
go install go.vxn.dev/dish/cmd/dish@latest
代码语言:javascript
复制
brew install dish

待检查的Socket列表可以通过本地JSON文件或远程JSON API端点提供。例如:

使用本地JSON文件检查的命令为

代码语言:javascript
复制
dish /opt/dish/sockets.json

使用远程JSON API检查的命令为

代码语言:javascript
复制
dish http://restapi.example.com/dish/sockets/:instance
配置通知

可进行Telegram通知配置,命令示例为

代码语言:javascript
复制
dish -telegramChatID "-123456789" -telegramBotToken "123:AAAbcD_ef" sockets.json;

也可进行Pushgateway更新配置,命令示例为

代码语言:javascript
复制
dish -target https://pushgw.example.com/ https://api.example.com/dish/sockets。
语法格式
代码语言:javascript
复制
dish [FLAGS] SOURCE

FLAGS

代码语言:javascript
复制
dish -h
Usage of dish:
  -cache
        a bool, specifies whether to cache the socket list fetched from the remote API source
  -cacheDir string
        a string, specifies the directory used to cache the socket list fetched from the remote API source (default ".cache")
  -cacheTTL uint
        an int, time duration (in minutes) forwhich the cached list of sockets is valid (default 10)
  -hname string
        a string, name of a custom additional header to be used when fetching and pushing results to the remote API (used mainly for auth purposes)
  -hvalue string
        a string, value of the custom additional header to be used when fetching and pushing results to the remote API (used mainly for auth purposes)
  -machineNotifySuccess
        a bool, specifies whether successful checks with no failures should be reported to machine channels
  -name string
        a string, dish instance name (default "generic-dish")
  -target string
        a string, result update path/URL to pushgateway, plaintext/byte output
  -telegramBotToken string
        a string, Telegram bot private token
  -telegramChatID string
        a string, Telegram chat/channel ID
  -textNotifySuccess
        a bool, specifies whether successful checks with no failures should be reported to text channels
  -timeout uint
        an int, timeout in seconds for http and tcp calls (default 10)
  -updateURL string
        a string, API endpoint URL for pushing results
  -verbose
        a bool, console stdout logging toggle
  -webhookURL string
        a string, URL of webhook endpoint
示例
代码语言:javascript
复制
# 检查 80 端口是否可访问(TCP)
dish --host example.com --port 80 --protocol tcp
###输出信息
Connected to example.com:80 (TCP) - Status: SUCCESS
代码语言:javascript
复制
# 检查 DNS 查询(UDP)
dish --host 8.8.8.8 --port 53 --protocol udp --timeout 2
##输出信息
Sent UDP packet to 8.8.8.8:53 - Status: TIMEOUT (No response)
代码语言:javascript
复制
# 批量检测多个端口(通过脚本循环)
for port in 80 443 3306; do
  dish --host api.example.com --port $port && echo "Port $port: OK" || echo "Port $port: FAIL"
done

对比同类工具

工具

核心优势

适用场景

劣势

dish

轻量、专注套接字状态

快速排查连接问题

无图形界面

netcat

支持数据交互

简单测试或端口扫描

功能单一,无状态统计

nmap

全面网络扫描(端口、服务、漏洞)

深度安全审计

资源占用高

telnet

交互式连接测试

手动调试

已过时,不安全

局限性
  • 无历史数据存储:需结合外部工具(如 Prometheus + Grafana)实现长期监控。
  • 不支持 HTTPS:仅检测底层 TCP 连接,不解析应用层协议。

总结

dish 是一款专为套接字连接状态诊断设计的轻量级工具,适合快速定位网络问题。其优势在于低开销、高精度和易用性,但需注意其功能边界(如不处理应用层协议)。对于需要深度监控的场景,建议搭配专业工具(如 Prometheus)使用。

Github: https://github.com/thevxn/dish

👍 如果你喜欢这篇文章,请点赞并分享给你的朋友!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 民工哥技术之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
    • 连接状态检测
    • 协议支持
    • 优势
  • 技术原理
  • 典型应用场景
  • 安装与使用
    • 安装
    • 示例
  • 对比同类工具
    • 局限性
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档