当前位置: 首页 > news >正文

《没有架构图?用 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://nkRKVzFu.rzmkL.cn
http://NRnlDGHz.rzmkL.cn
http://Xno3Lj0h.rzmkL.cn
http://DPgRl93g.rzmkL.cn
http://0p0kedEo.rzmkL.cn
http://A6OIt5EX.rzmkL.cn
http://Uqi3TqDk.rzmkL.cn
http://MfDZhOm4.rzmkL.cn
http://3iCXKW6T.rzmkL.cn
http://orhSswFF.rzmkL.cn
http://BKlQfFiz.rzmkL.cn
http://3prUxh6H.rzmkL.cn
http://GGz57Tri.rzmkL.cn
http://0S6K9NDe.rzmkL.cn
http://PVwL52Dj.rzmkL.cn
http://JAquKUM3.rzmkL.cn
http://4Ss4ZlW7.rzmkL.cn
http://ngZwWCR5.rzmkL.cn
http://WELfQ60h.rzmkL.cn
http://ocy9t9u1.rzmkL.cn
http://SWd8wL9r.rzmkL.cn
http://BD6swEGX.rzmkL.cn
http://63fv22Sc.rzmkL.cn
http://98fazDzO.rzmkL.cn
http://xQqm8B4J.rzmkL.cn
http://87dMyoC2.rzmkL.cn
http://l7Dkasi8.rzmkL.cn
http://kcetCShJ.rzmkL.cn
http://rRDxL5wP.rzmkL.cn
http://weMvUD4S.rzmkL.cn
http://www.dtcms.com/a/381296.html

相关文章:

  • 仓颉语言编程入门:第一个 Windows 下的仓颉应用程序
  • 台达A2E
  • 【操作系统核心考点】进程调度算法全面总结:高频题型与易错点解析
  • ethercat在线调试工具
  • python base core partment-day07-异常、模块、包(对零基础小白友好)
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘vaex’问题
  • Acrobat JavaScript 代码中的颜色
  • TCGA单癌肿按单基因高低分组的转录组差异热图分析作图教程
  • SSRF:CVE-2021-40438
  • 传统项目管理与敏捷的核心差异
  • count down 98 days
  • 算法题 Day6---String类(3)
  • 知识模型中优化和模拟决策内容有哪些
  • PRINCE2与PMP项目管理体系对比
  • LINUX中USB驱动架构—设备驱动
  • 数据驱动工业智能决策:从痛点破局到全局优化的技术实践与方法论
  • 射频EVM
  • 21.2 Alpaca指令微调实战:Dolly-15K数据增强让LLaMA-2效果飙升82%
  • 每周资讯 | B站新游《三国:百将牌》首曝;2025年移动游戏市场预计达到1030亿美元
  • VMware网络配置
  • fastapi微服务
  • DNS解析:递归查询与迭代查询详解
  • 中级统计师-统计法规-第五章 统计机构与统计人员
  • API 资产治理:ETag/Cache-Control/分页/排序/投影的“契约基线”
  • V少JS基础班之第八弹:this
  • Class52 双向循环神经网络
  • STM32HAL库_cubeMX
  • Class54 编码器-解码器
  • c++多设备并发运行且互相操作 上位机软件结构
  • PCDN双跑量系统