在 Linux 系统中,我们经常需要查看某台机器上指定 IP 和端口的数据收发情况。但是 Linux 没有一个"万能命令"可以完成所有任务。我们需要根据具体需求来选择合适的工具。这篇文章会介绍六类常用网络工具,帮助大家快速上手。
大部分网络抓包和流量监控命令都需要 root 权限。需要在命令前加 sudo。如果机器有多块网卡,必须指定网卡名称。常见的网卡名称有 eth0、ens33、lo。可以用 ip a 命令查看本机的网卡名称。
一、tcpdump:抓包分析的首选工具
适用场景
想看到端口实际收发的数据内容、报文交互过程和协议细节,tcpdump 是最好的选择。它是 Linux 系统上最常用的命令行抓包工具。
安装方法
不同 Linux 发行版的安装命令不同:
Ubuntu / Debian:
sudo apt updatesudo apt install -y tcpdump
CentOS / Rocky / AlmaLinux:
sudo yum install -y tcpdump
Arch Linux:
sudo pacman -S tcpdump
安装完成后,可以用 tcpdump --version 来验证是否安装成功。
如果不想每次都加 sudo,可以给 tcpdump 设置权限:
sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
基础过滤语法
tcpdump 支持灵活的过滤规则组合:
tcp / udp:只抓取 TCP 或 UDP 协议src / dst:区分入站(接收)和出站(发送)-nn:不解析主机名和端口名,提升速度(建议每次都加)
常用命令示例
抓取指定 IP + 端口的所有流量:
sudo tcpdump -nn -i ens33 host 192.168.1.100 and port 8080
只抓取 TCP 流量:
sudo tcpdump -nn -i ens33 tcp host 192.168.1.100 and port 8080
只抓取 UDP 流量(比如 DNS 查询):
sudo tcpdump -nn -i ens33 udp host 192.168.1.100 and port 53
区分接收和发送:
入站(本机接收对方数据):
sudo tcpdump -nn -i ens33 src host 192.168.1.100 and port 8080
出站(本机向对方发送数据):
sudo tcpdump -nn -i ens33 dst host 192.168.1.100 and port 8080
查看报文原始内容(十六进制 + 文本):
sudo tcpdump -nn -X -i ens33 host 192.168.1.100 and port 8080
如果想直接看到可读的文本内容,可以加 -A 参数:
sudo tcpdump -A -i any host 192.168.1.100 and port 8080
保存抓包文件,后续用 Wireshark 分析:
sudo tcpdump -nn -i ens33 host 192.168.1.100 and port 8080 -w port_traffic.pcap
读取本地抓包文件:
tcpdump -r port_traffic.pcap
限时抓包并统计总报文数:
sudo timeout 10 tcpdump -nn -i ens33 host 192.168.1.100 and port 8080 | wc -l
组合更复杂的过滤条件:
# 抓取源 IP 是 10.0.0.2 且目标端口是 22 的数据包sudo tcpdump src host 10.0.0.2 and dst port 22# 抓取除 SSH 端口外,与 IP 10.0.0.2 交互的所有流量sudo tcpdump host 10.0.0.2 and not port 22
注意事项
tcpdump 需要 root 权限才能运行。在生产环境中长时间抓包可能会影响系统性能。建议用 -c 参数限制抓包数量(比如 -c 1000),或者指定较短的时间。
二、iftop:查看实时收发速率
适用场景
不需要看报文内容,只想知道某个 IP 和端口的实时上传、下载速度(KB/s 或 Mb/s),用 iftop 最合适。
安装方法
CentOS / RHEL / Rocky:
sudo yum install iftop -y
Ubuntu / Debian:
sudo apt install iftop -y
常用命令
监控指定网卡,只展示特定 IP 和端口的实时流量:
sudo iftop -i ens33 -f "host 192.168.1.100 and port 8080"
显示端口号,不解析主机名:
sudo iftop -i eth0 -P -n
界面字段说明
- 中间列:实时速率、2 秒 / 10 秒 / 40 秒平均速率
交互快捷键
三、ss 和 netstat:查看连接状态和缓冲区队列
适用场景
想检查端口是否建立了连接、连接状态是什么、收发队列是否有积压(堵包)。推荐优先使用 ss,因为它直接读取内核数据,比 netstat 更快。
ss 命令(推荐)
查看监听状态(端口是否正常监听):
sudo ss -tulnp | grep 8080
参数说明:-t 表示 TCP,-u 表示 UDP,-l 表示监听端口,-n 表示不解析名称,-p 表示显示关联进程。
查看指定 IP + 端口的活跃连接:
sudo ss -tn state all dst 192.168.1.100 dport 8080
查看收发字节数(非常重要):
ss -tni | grep -A1 '192.168.1.100:8080'
可以看到类似下面的输出:
cubic wscale:7,7 rto:204 rtt:0.345/0.069 ato:40 mss:1460rcv_space:29200 rcv_ssthresh:29200bytes_sent:123456 bytes_received:654321
这是判断"有没有数据在收发"的最快方式。
查看收发队列(排查卡顿和丢包):
ss 输出中有两个关键字段:
Recv-Q:接收队列积压字节数(不为 0 说明收包堵塞)Send-Q:发送队列积压字节数(不为 0 说明发包堵塞)
正常情况下这两个值都应该为 0。
netstat 命令(兼容旧系统)
如果使用的系统比较旧,ss 命令不可用,可以用 netstat:
sudo netstat -ant | grep 192.168.1.100 | grep 8080
查看所有 TCP/UDP 监听端口:
netstat -tuln
查看网络接口的收发数据包统计:
netstat -i
四、nethogs:按进程查看流量
适用场景
想找到占用某个 IP 和端口的进程,查看进程级别的收发流量,用 nethogs 最合适。它和 iftop 不同,iftop 显示的是 IP 和端口,而 nethogs 直接显示进程名和 PID。
安装方法
CentOS:
sudo yum install nethogs -y
Ubuntu:
sudo apt install nethogs -y
常用命令
监控指定网卡,按进程展示流量:
sudo nethogs ens33
设置刷新频率(每 2 秒刷新一次):
sudo nethogs -d 2
交互操作
- 按
m 键:修改统计单位(KB/s、MB/s 等)
补充:通过端口找进程
如果只想知道哪个进程占用了某个端口,可以用 lsof:
sudo lsof -i :8080
查看指定 IP:
sudo lsof -i@192.168.1.100:8080
五、iptraf-ng:交互式可视化流量统计
适用场景
需要图形化界面、精细化统计包数和字节数、多端口和多 IP 汇总,用 iptraf-ng 最合适。
安装方法
sudo yum install iptraf-ng -ysudo apt install iptraf-ng -y
使用步骤
- 执行
sudo iptraf-ng 进入交互式界面 - 选择
IP traffic monitor,然后选择网卡(比如 ens33) - 界面会实时展示收包数、发包数、总字节、速率等统计数据
六、iptables:长期流量累计统计
适用场景
需求不是实时监控,而是对某个特定 IP 或端口的流量进行长期累计统计。可以利用 Linux 内核防火墙 iptables 的计数器功能。它的原理是添加一条不拦截的规则,仅用来匹配并统计流量。
注意:iptables 命令修改的是系统内核的网络规则。如果规则配置不当,可能会导致网络中断。请在测试环境或对操作有充分把握时再使用。
添加统计规则
统计进入服务器的特定端口流量:
sudo iptables -I INPUT -d <目标IP> -p tcp --dport <端口号>
统计从服务器出去的特定端口流量:
sudo iptables -I OUTPUT -s <源IP> -p tcp --sport <端口号>
查看统计数据
sudo iptables -L -v -n -x
参数说明:-v 显示详细信息(包含计数器),-n 以数字形式显示 IP 和端口,-x 显示精确的字节数值。
在输出结果中,pkts 列是匹配到的数据包总数,bytes 列是总字节数。
清除和删除规则
重置计数器:
sudo iptables -Z
删除统计规则:先用 sudo iptables -L INPUT --line-numbers 查看行号,再用 sudo iptables -D INPUT 1 删除(假设规则在第 1 行)。
七、ngrep:像 grep 一样看网络数据
适用场景
想看应用层协议的内容(比如 HTTP、Modbus、自定义协议),ngrep 非常适合。它的使用方式类似于 grep,但它是过滤网络数据的。
常用命令
sudo ngrep -q -d any port 8080
指定 IP:
sudo ngrep -q host 192.168.1.100 and port 8080
八、嵌入式 Linux 精简方案
如果设备是嵌入式 Linux 系统(比如 BusyBox、OpenWrt),系统上可能没有 tcpdump。可以用 /proc 文件系统来查看连接信息。
用 /proc/net/tcp 查看
cat /proc/net/tcp | grep ':1F90'
注意:端口号需要转换成十六进制。比如 8080 的十六进制是 1F90。
输出中第 5 列的字段说明:
tx_queue rx_queue tr tm->when retrnsmt
用 /proc 查看进程级收发统计
cat /proc/<pid>/net/netstat
或者:
cat /proc/<pid>/fdinfo/<fd>
九、一个完整的排查流程
当需要排查某个 IP 和端口的数据收发问题时,可以按照下面的步骤来做:
第一步:确认连接是否存在
ss -tnp | grep 8080
第二步:查看收发字节数
ss -tni | grep -A1 8080
第三步:实时抓包
sudo tcpdump -i any host 192.168.1.100 and port 8080 -A
工具选型速查表
常见注意事项
- 权限问题:所有网卡抓包、流量监控命令都必须加
sudo。普通用户运行会报错。 - 网卡名称:云服务器和虚拟机的网卡名通常是
ens33,物理机多为 eth0,本地回环用 lo。可以用 ip a 命令查看本机网卡。 - 协议区分:业务端口优先过滤 TCP,DNS 和音视频等场景过滤 UDP。
- 回环地址:本地 127.0.0.1 通信时,以上命令完全兼容。
总结
Linux 下查看指定 IP 和端口的数据收发,没有单一的万能命令。需要根据实际需求来选择工具:
- 看哪个进程在收发,用
ss -tnp 或 lsof
选对工具,排查网络问题就会事半功倍。
参考链接:
- tcpdump 官方文档. tcpdump.org. : https://www.tcpdump.org/
- "ss(8) - Linux man page." man7.org. : https://man7.org/linux/man-pages/man8/ss.8.html
- "netstat(8) - Linux man page." man7.org. : https://man7.org/linux/man-pages/man8/netstat.8.html
- "iftop - display bandwidth usage on an interface." ex-parrot.com.: https://ex-parrot.com/~pdw/iftop/
- "nethogs - net top tool grouping bandwidth per process." github.com. : https://github.com/raboof/nethogs
- "iptables(8) - Linux man page." man7.org. : https://man7.org/linux/man-pages/man8/iptables.8.html
如果觉得不错,欢迎 点赞、收藏、转发 ,如果想第一时间收到推送,也可以给个星标⭐~~