本文约3500字,在Linux系统运维、网络问题排查中,总有几个命令是“刚需工具”——它们无需复杂配置,上手即用,却能精准定位网络异常、分析流量走向、调试连接问题。其中,ss、tcpdump、nc 三大命令覆盖了调试通信”三大核心场景。本文将从命令原理、核心用法、实战案例三个维度,深入学习这三个命令,让我们轻松应对日常网络问题。
我建了一个BSP学习交流群,想学BSP或者已经是BSP开发者可私信我,加入群,一起交流学习,共同进步。
关注公众号, 即可获得与Linux相关的电子书籍以及常用开发工具,文末有文档清单。
一 ss:替代netstat的“连接查看神器”
ss(Socket Statistics)是Linux系统中用于查看套接字(socket)连接状态的命令,其功能与netstat类似,但性能更优——在高并发场景下(如大量TCP连接),ss的查询速度远快于netstat,因为它直接读取内核中的tcp_diag模块,无需遍历所有连接,资源占用更低。日常运维中,ss几乎可以完全替代netstat,成为查看端口、连接状态的首选工具。
ss的参数较多,但日常使用只需掌握几个核心组合,就能覆盖80%的场景:
查看所有监听端口:`ss -ntl`,其中:
-n:不解析域名(加快查询速度,避免DNS解析延迟);
-t:仅显示TCP连接(最常用,UDP可替换为-u);
-l:仅显示“监听中”的端口(Listening状态)。
查看所有已建立的TCP连接:`ss -nt`,去掉-l参数,即可显示所有处于Established状态的TCP连接,可快速查看本机与外部的连接情况(如哪些IP在连接本机端口)。
查看指定端口的连接:`ss -ntl | grep 80`,过滤出80端口的监听状态,常用于检查服务是否正常监听(如Nginx、Apache)。
查看连接数统计:`ss -s`,汇总显示TCP、UDP的连接总数、监听数、已建立数等,快速判断系统连接负载。
查看具体进程的连接:`ss -ntlp`,加上-p参数,可显示每个连接对应的进程名和PID,方便定位“哪个进程占用了某个端口”(需root权限)。
场景1:部署Nginx后,检查80端口是否正常监听。执行`ss -ntl | grep 80`,若输出中包含“LISTEN”,说明端口监听正常;若无输出,需检查Nginx是否启动、配置是否正确。
场景2:服务器出现网络卡顿,怀疑是连接数过多。执行`ss -s`,查看TCP连接总数,若已建立连接数远超正常范围,可进一步用`ss -nt`查看异常连接的IP,排查是否存在恶意连接或连接泄露。
tcpdump是Linux下强大的网络抓包工具,能够捕获网络接口上的所有数据包(TCP、UDP、ICMP等),并对数据包进行解析,查看数据包的源IP、目的IP、端口、协议、数据内容等信息。它是排查网络丢包、延迟、异常流量,以及分析网络协议交互的核心工具,需root权限运行(因为抓包需要访问网络接口的底层数据)。
核心原理:tcpdump通过监听指定的网络接口,捕获经过该接口的所有数据包,然后按照用户指定的规则(如端口、IP、协议)进行过滤,最终将解析后的结果输出到终端或保存到文件中,供后续分析。
监听所有网卡的流量:`tcpdump -i any`,-i指定监听的网卡,any表示所有网卡,适合快速查看服务器的整体网络流量(会输出大量信息,需结合过滤条件使用)。
抓指定网卡的流量:`tcpdump -i eth0`,eth0为网卡名称(可通过`ip addr`查看),精准监听某一块网卡的流量,避免其他网卡的干扰。
抓指定端口的数据包:`tcpdump -i eth0 port 80`,仅捕获80端口的数据包,常用于排查HTTP服务的网络问题(如请求卡顿、丢包)。
抓指定IP的数据包:`tcpdump -i eth0 host 192.168.1.100`,仅捕获与192.168.1.100相关的数据包(包括该IP作为源IP和目的IP),适合定位特定客户端或服务器的网络交互。
抓包并保存到文件:`tcpdump -i eth0 port 80 -w /tmp/tcpdump_80.pcap`,-w参数将抓包结果保存为pcap文件,后续可通过Wireshark等工具打开分析(适合长时间抓包、复杂流量分析)。
解析保存的pcap文件:`tcpdump -r /tmp/tcpdump_80.pcap`,-r参数读取pcap文件,可结合过滤条件查看特定内容(如`tcpdump -r /tmp/tcpdump_80.pcap host 192.168.1.100`)。
显示数据包的详细内容:`tcpdump -i eth0 port 80 -v`,-v参数显示更详细的数据包信息(如TTL、窗口大小),-vv可显示更细致的协议细节。
场景1:客户端访问服务器的80端口时频繁超时,排查是否存在丢包。执行`tcpdump -i eth0 port 80`,观察输出的数据包,若出现“dropped by kernel”(内核丢弃),说明服务器网卡负载过高或存在防火墙拦截;若没有收到客户端的SYN包,说明客户端到服务器的网络链路存在问题。
场景2:分析HTTP请求的完整交互过程。执行`tcpdump -i eth0 port 80 -v`,可查看HTTP请求的方法(GET/POST)、请求头、响应状态码等信息,排查是否存在请求被篡改、响应异常等问题。
nc(netcat)被誉为“网络万能工具”,功能极其强大,可实现端口扫描、TCP/UDP通信、文件传输、临时服务器搭建等多种功能。它的核心优势是“简单、灵活”,无需复杂配置,仅通过简单的参数,就能完成多种网络调试操作,是运维人员排查端口连通性、测试网络通信的必备工具。
注意:部分Linux系统默认未安装nc,可通过`yum install nc -y`(CentOS)或`apt install netcat -y`(Ubuntu)安装。
`nc -zv 192.168.1.100 80`,其中:
-z:仅检测端口是否开放,不建立实际连接(快速扫描);
-v:显示详细信息(成功会提示“succeeded!”,失败会提示“Connection refused”)。
该用法可替代telnet(telnet是明文传输,不安全),快速判断目标IP的指定端口是否开放、网络是否连通。
`nc -zv 192.168.1.100 1-100`,扫描192.168.1.100的1-100端口,查看哪些端口处于开放状态(适合快速排查目标服务器的开放端口,注意:未经授权扫描他人服务器属于违规行为)。
服务端监听端口:`nc -l 8888`,-l参数表示监听模式,监听本地8888端口;
客户端连接服务端:`nc 192.168.1.100 8888`,连接目标服务器的8888端口;
连接建立后,双方可在终端输入内容,实现双向通信,常用于测试TCP连接的稳定性。
无需FTP、SCP,仅用nc即可快速传输文件,适合临时传输小文件:
接收端(保存文件):`nc -l 8888 > test.txt`,监听8888端口,将接收的内容保存到test.txt;
发送端(发送文件):`nc 192.168.1.100 8888 < test.txt`,将test.txt文件发送到目标服务器的8888端口。
场景1:测试服务器的3306端口(MySQL)是否开放,执行`nc -zv 192.168.1.100 3306`,若提示成功,说明端口开放;若提示连接拒绝,需检查MySQL是否启动、防火墙是否放行3306端口。
场景2:两台服务器之间临时传输日志文件,无需配置SCP。在接收端执行`nc -l 9999 > access.log`,在发送端执行`nc 接收端IP 9999 < /var/log/nginx/access.log`,即可快速完成传输。
日常网络问题排查中,单独使用一个命令往往不够,将ss、tcpdump、nc联动起来,能高效定位问题根源,以下是一个典型场景:
问题描述:客户端无法访问服务器的80端口(Nginx服务),提示“连接超时”。
用ss查看服务器80端口是否监听:`ss -ntl | grep 80`,若无输出,说明Nginx未启动,启动Nginx即可;若有输出,说明端口监听正常,进入下一步。
用nc测试端口连通性:在客户端执行`nc -zv 服务器IP 80`,若提示“Connection refused”,说明服务器防火墙拦截了80端口,放行80端口即可;若提示“Connection timed out”,说明网络链路存在问题,进入下一步。
用tcpdump抓包分析:在服务器执行`tcpdump -i eth0 port 80`,同时让客户端再次访问,观察是否有客户端的SYN包(连接请求)。若没有SYN包,说明客户端到服务器的网络链路异常(如路由问题、网关故障);若有SYN包,但没有ACK包(服务器响应),说明服务器内核或防火墙拦截了连接。
权限问题:tcpdump、ss查看进程连接(-p参数)、nc监听1024以下端口,均需要root权限,否则会提示权限不足。
性能影响:tcpdump抓包时会占用一定的系统资源,尤其是在高流量场景下,长时间抓包可能影响服务器性能,建议抓包时结合过滤条件(如端口、IP),并及时停止抓包。
安全问题:telnet明文传输,已被nc替代;nc的端口扫描功能不可用于未经授权的服务器,避免违规。
版本差异:不同Linux发行版(CentOS、Ubuntu)的ss、nc参数基本一致,但部分细节可能有差异,可通过`ss --help`、`nc --help`查看具体参数。
ss、tcpdump、nc 三个命令各有侧重,却又相辅相成:ss负责“查看连接状态”,快速定位端口和进程问题;tcpdump负责“抓包分析”,深挖网络流量的底层细节;nc负责“调试通信”,快速测试端口连通性和网络交互。掌握这三个命令的核心用法,再结合联动实战,就能轻松应对Linux日常网络调试、问题排查的大部分场景,提升运维效率。

这里是女程序员的笔记本
15年+嵌入式软件工程师兼二胎宝妈
分享读书心得、工作经验,自我成长和生活方式。
希望我的文字能对你有所帮助