《沒有架構圖?用 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
英文地址,請注明出處:http://en.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;或域名的解析使用…