《没有架构图?用 netstat、ss、tcpdump 还原服务连接与数据流向》

📢 你是否遇到过这些问题?

  • 接手一个老项目,只有服务器账号,没有架构图?
  • 服务突然异常,但不知道它依赖哪些外部系统?
  • 想画数据流向图,却找不到文档?

别担心!只要你有 shell 权限,就能用几个 Linux 命令,逆向还原出整个系统的通信拓扑

本文将带你一步步:

  1. 查看谁在监听
  2. 分析谁在连接你
  3. 抓包看 UDP 数据来源
  4. 统计出站连接目标
  5. 最终拼出一张“事实上的架构图”

无需任何外部工具,全是系统自带命令(netstatsslsoftcpdump),拿来即用,实战有效

💡 适用场景:运维排查、系统交接、安全审计、自研服务调试

本文帮你彻底搞懂:如何排查“谁在连我”、“我连了谁”,适用于 Java、Nginx、MySQL、自研服务等所有网络程序


一、核心概念:先搞懂这些术语

概念说明
监听端口(LISTEN)你的服务正在等待别人来连接(如 Web 服务监听 80)
入站连接(Inbound)外部机器连接你的服务 → “谁在连我”
出站连接(Outbound)你的程序主动连接外部服务 → “我连了谁”
UDP 通信UDP 是无连接协议,没有“连接状态”,只能通过抓包看“谁发了包给我”

📌 关键区别

  • TCP 有连接状态(ESTABLISHED, LISTEN),可直接查
  • UDP 无连接,必须用 tcpdump 抓包分析

二、常用命令速查表(建议收藏)

目的命令
查看所有监听端口ss -lntupnetstat -lntup
查看某进程的连接lsof -p <PID>
查看谁在连某个端口ss -tnp | grep :端口
抓包看 UDP 谁在发数据tcpdump -i any -n udp dst port <端口>
统计连接来源 IPss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c

✅ 推荐使用 ss 替代老旧的 netstat(更快、更现代)


三、如何查看“我的程序被谁连接”(入站连接)

1. 查看本机监听了哪些端口

ss -lntup
# 或(旧系统)
netstat -lntup

输出示例:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program
tcp6       0      0 10.104.2.184:20007      :::*                    LISTEN      1182/java
udp6       0      0 10.104.2.184:20009      :::*                                1182/java

👉 说明:

  • java 进程(PID 1182)在监听 20007(TCP)和 20009(UDP)
  • 10.104.2.184 是内网 IP,表示允许内网访问

2. 查看谁在连接 TCP 端口(如 20007)

ss -tnp | grep ':20007'

输出示例:

ESTAB 0 0 10.104.2.184:20007 10.104.11.178:51865 users:(("java",pid=1182,fd=12))

👉 说明:

  • 10.104.11.178 正在连接你的 20007 端口
  • 这是典型的“服务间调用”场景

3.ss 命令参数详解

ss 的参数是 单字母选项,可以组合使用。以下是常见参数说明:

参数全称(含义)说明
-l--listening显示监听状态的端口(LISTEN)
-n--numeric显示数字形式的地址和端口,不解析成域名或服务名(如不把 80 解析为 http)
-t--tcp显示 TCP 协议的连接
-u--udp显示 UDP 协议的连接
-p--processes显示使用该连接的进程信息(PID 和程序名)

3. 查看谁在向 UDP 端口发数据(如 20009)

UDP 没有“连接状态”,必须用 tcpdump 抓包:

tcpdump -i any -n -c 10 'udp and dst port 20009'

输出示例:

IP 10.104.11.178.51865 > 10.104.2.184.20009: UDP, length 1440
IP 10.104.33.6.59928 > 10.104.2.184.20009: UDP, length 144

👉 说明:

  • 10.104.11.17810.104.33.6 正在向你发送数据
  • 你的服务是 UDP 服务端(如心跳、配置同步)

4. 抓多个 UDP 端口(批量监控)

tcpdump -i any -n -c 10 'udp and (port 20009 or port 20010 or port 20012 or port 20013)'

⚠️ 注意:不要写成 200010(这是 20万10),正确是 20010(2万零10)


5. 只看“入站”流量(别人发给你)

# 只抓目标是你服务器的包
tcpdump -i any -n 'udp and (dst port 20009 or dst port 20010)'

6. 排除自己发出的包(避免干扰)

# 排除从本机发出的 UDP 包
tcpdump -i any -n 'udp and (port 20009 or port 20010) and not src host 10.104.2.184'

7. 统计 UDP 数据来源 IP(批量分析)

timeout 10 tcpdump -i any -n -nn -l udp 'dst port 20009' 2>/dev/null | \
awk '{print $3}' | cut -d'>' -f1 | sort | uniq -c | sort -nr

输出:

     8 10.104.11.1785 10.104.33.63 10.104.5.35

👉 表示:

  • 10.104.11.178 发了 8 次包,是主要客户端

四、如何查看“我的程序连接了谁”(出站连接)

1. 使用 lsof 查看某进程的连接

lsof -p 1182 | grep ESTABLISHED

输出示例:

java 1182 root 15u IPv6 123456 0t0 TCP 10.104.2.184:54220->10.104.7.2:20009 (ESTABLISHED)

👉 说明:

  • 你的 Java 程序正在连接 10.104.7.2:20009
  • 这可能是上报、转发或服务发现

2. 使用 ss 查看出站连接

ss -tnp | grep '1182'

或按目标 IP/端口过滤:

ss -tnp | grep '10.104.7.2:20009'

3. 使用 netstat(旧系统)

netstat -tnp | grep 1182

五、tcpdump 实战:谁在连接我?我在连谁?

场景 1:抓“谁在连我”(入站)

# TCP:谁在连接我的 20007 端口(SYN 包)
tcpdump -i any -n 'tcp and dst port 20007 and (tcp[tcpflags] & tcp-syn) != 0'# UDP:谁在向 20009 发包
tcpdump -i any -n 'udp and dst port 20009'

场景 2:抓“我在连谁”(出站)

# 我的程序从本地 54220 端口发起连接
tcpdump -i any -n 'src port 54220'# 或看我连了哪个外部 IP
tcpdump -i any -n 'dst host 10.104.7.2'

场景 3:监控双向通信

# 监控与某个服务的全部通信
tcpdump -i any -n 'host 10.104.7.2 and port 20009'

六、一键诊断脚本:check_connections.sh

#!/bin/bash
echo "=== 当前时间 ==="
dateecho -e "\n=== 监听端口 ==="
ss -lntupecho -e "\n=== TCP 入站连接统计(来源 IP)==="
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10echo -e "\n=== UDP 数据来源(最近10秒)==="
echo "抓包中...(请稍等)"
timeout 10 tcpdump -i any -n -nn -l udp 'dst port 20009 or dst port 20010' 2>/dev/null | \
awk '{print $3}' | cut -d'>' -f1 | sort | uniq -c | sort -nr || echo "无 UDP 流量"echo -e "\n=== 出站连接(ESTABLISHED)==="
ss -tn | grep ESTAB | awk '{print $5}' | sort | uniq -c | sort -nr | head -10echo -e "\n=== 本地监听服务 ==="
ss -lntup | grep -v '127.0.0.1' | grep -v '::1' || echo "无非本地监听"

使用方法:

chmod +x check_connections.sh
./check_connections.sh  

七、附录:常见端口用途参考

端口协议常见用途
22TCPSSH
80/443TCPHTTP/HTTPS
3306TCPMySQL
6379TCPRedis
9092TCPKafka
20007~20013UDP/TCP自定义监控、游戏、配置服务

总结:一句话记住

你想知道使用命令
我监听了哪些端口?ss -lntup
谁在连我的 TCP 服务?ss -tnp | grep :端口
谁在向我的 UDP 端口发数据?tcpdump -i any -n udp dst port <端口>
我的程序连接了谁?lsof -p <PID>ss -tnp
统计连接来源?ss / tcpdump + awk + sort + uniq

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96732.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis列表(List):实现队列/栈的利器,底层原理与实战

Redis列表&#xff08;List&#xff09;&#xff1a;实现队列/栈的利器&#xff0c;底层原理与实战 1. Redis列表概述 1.1 什么是Redis列表 Redis列表&#xff08;List&#xff09;是一个有序的字符串元素集合&#xff0c;支持在头部和尾部进行高效的插入和删除操作。它可以…

OpenCV 图像双三次插值

文章目录 一、简介 二、实现代码 三、实现效果 参考资料 一、简介 在数学中,双三次插值是三次样条插值(一种将三次插值应用于数据集的方法)的扩展,用于在二维规则网格上插值数据点。插值曲面(指核形状,而非图像)比通过双线性插值或最近邻插值获得的相应曲面更平滑。双三…

【Java实战㊲】Spring Security:为Spring Boot应用筑牢安全防线

目录 一、Spring Security 概述 1.1 Spring Security 核心功能 1.2 Spring Security 与 Shiro 对比 二、Spring Boot 整合 Spring Security 基础 2.1 整合依赖导入 2.2 默认安全配置 2.3 自定义用户认证 2.4 自定义登录与注销 三、Spring Security 授权控制 3.1 基于角色的授权…

linux命令—stat

命令简介 stat是Linux中用于查看文件或文件系统的详细状态信息的强大命令。它比ls -l更全面&#xff0c;其输出信息包括但不限于&#xff1a;文件大小、权限、所有者、最后访问/修改/状态变更时间、inode号、所在设备信息等。 用法 stat命令的语法格式如下 stat [选项] 文件…

解决串口数据乱序问题

环境&#xff1a;jetson nano ubuntu 20.04python 3.12终于是找到解决串口乱序的最佳解决办法了&#xff0c;先来看看什么是串口乱序&#xff1a;这就是一个典型的串口乱序&#xff0c;我的发送端发送 的协议为0x55 0x51 ...0x55 0x52 ...0x55 0x53 ...0x55 0x54 ...在这四条协…

Spring的注解

声明Bean的注解 Component Controller Service Repository 后三种为Component的别名&#xff0c;之所以不同是因为可读性的考虑 Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Component public interface Controller {AliasFor(//别名an…

UVM寄存器模型与通道机制

接续UVM基础入门文章。前言重点讲述UVM常用的接口连接方式。寄存器模型&#xff1a;UVM寄存器模型&#xff08;Register Model&#xff09;是一组高级抽象的类&#xff0c;用于对DUT&#xff08;Design Under Test&#xff09;中具有地址映射的寄存器和存储器进行建模&#xff…

12.NModbus4在C#上的部署与使用 C#例子 WPF例子

一、Modbus TCP/IP是什么Modbus TCP/IP是一种基于TCP/IP协议的工业自动化通信协议。它在Modbus协议的基础上&#xff0c;利用TCP/IP网络进行数据传输&#xff0c;使得工业设备之间的通信更加便捷和高效。常用的Modbus功能码包括0x03&#xff08;读保持寄存器&#xff09;、0x06…

硬件开发2-汇编1(ARMv7-A)- 基本概要

一、汇编基本概要1、ARM数据和指令类型2、ARM字节顺序即可大端存储也可小端存储&#xff0c;默认小端存储&#xff08;不建议修改&#xff09;、kernel&#xff08;内核&#xff09;中的&#xff0c;CPSR&#xff08;当前程序状态寄存器&#xff09;可修改大小端存储3、ARM处理…

Linux中进程和线程常用的API详解

进程与线程基础及 Linux 进程间通信&#xff08;IPC&#xff09;详解 一、程序与进程 1. 程序&#xff08;静态文件&#xff09; 程序是存储在磁盘上的可执行文件&#xff0c;是静态实体&#xff0c;不占用 CPU、内存等运行时资源&#xff0c;仅占用磁盘空间。不同操作系统的可…

VS Code 插件开发教程

VS Code 插件开发教程 概述 Visual Studio Code&#xff08;简称 VS Code&#xff09;是一款由 Microsoft 开发的开源轻量级编辑器&#xff0c;支持跨平台&#xff08;Windows、macOS、Linux&#xff09;。 其最大的优势之一是强大的插件系统&#xff0c;开发者可以通过编写扩…

Docker技术解析

1.Docker安装 1.如果Ubuntu自带的Docker版本太低&#xff0c;我们需要卸载旧版本并安装新的 sudo apt-get remove docker docker-engine docker.io containerd runc2. 备份原有软件源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak3.选择合适的镜像源 # 或者使用…

TCP套接字的使用

Java中使⽤TCP协议通信,使用ServerSocket来建立链接,使用Socket进行通信.ServerSocketServerSocket是创建TCP服务端Socket的api,主要方法:方法签名说明ServerSocket(int port)创建一个服务端流套接字Socket,并绑定指定端口Socket accpet()开始监听指定端口,有客户端链接后,返回…

linux执行systemctl enable xxxxx 报 Failed to execute operation: Bad message

linux执行systemctl enable redis.service 报 Failed to execute operation: Bad message 如果在执行 systemctl enable 命令时遇到 "Failed to execute operation: Bad message" 错误&#xff0c;可能是由于以下几个原因导致的。你可以按照以下步骤进行排查和解决&a…

终端之外:解锁Linux命令行的魔法与力量

Linux命令行的核心理念 在记忆具体的指令之前&#xff0c;先理解它的哲学&#xff1a; 一切皆文件 &#xff1a;硬件设施&#xff0c;进程&#xff0c;目录…在Linux中几乎所有资源都被抽象为文件&#xff0c;这意味着你可以通过同样的指令&#xff08;如 ench ,cat&#xff…

CSS 动画实战:实现电商中“加入购物车”的抛物线效果

引言 在电商网站中&#xff0c;“加入购物车”动画 是提升用户体验的经典交互之一。一个小小的商品图标从页面飘向购物车&#xff0c;不仅直观地反馈了操作结果&#xff0c;还能增加趣味性与沉浸感。 实现这一效果的方式有很多&#xff0c;比如 JavaScript 计算路径 动画&…

深度学习之损失函数

深度神经网络由多层网络连接而成&#xff0c;网络连接处防止线性直接相关&#xff0c;采用非线性函数进行逐层隔离&#xff0c;真正实现每层参数的独立性&#xff0c;也就是只对本层提取到的特征紧密相关。因为如果是线性函数直接相连就成了一层中间网络了&#xff0c;只不过参…

Oracle OCP认证考试题目详解082系列第32题

考察知识点:Oracle profiles(配置文件) 英语题目 32.Which are two of the account management capabilities that can be configured using Oracle profiles? A.the number of days for which an account may be logged in to one or more sessions before it is locked…

Docker 部署 MongoDB:单节点与副本集的最佳实践

Docker 部署 MongoDB&#xff1a;单节点与复制集的企业级最佳实践引言&#xff1a;容器化有状态服务的范式转变第一部分&#xff1a;基础概念与生产环境考量1.1 核心 Docker 概念深度解析1.2 Volume vs. Bind Mount&#xff1a;生产环境抉择1.3 获取与验证官方镜像官方镜像默认…

公司本地服务器上搭建部署的办公系统web项目网站,怎么让外网访问?有无公网IP下的2种通用方法教程

本地物理服务器计算机搭建部署应用包括网站等&#xff0c;然后在局域网内的访问外&#xff0c;还需要提供外地的连接访问&#xff0c;这是比较常见的跨网通信需求。如在家或在外访问公司内部办公系统网站&#xff0c;这就涉及内网IP和公网IP的转换&#xff0c;或域名的解析使用…