第一次接触netstat是在十年前排查服务器异常的时候。当时有用户反馈网站访问特别慢,我登录服务器后第一反应就是打开这个神奇的命令。随着光标闪烁,屏幕上瞬间列出了密密麻麻的网络连接信息——就像医生用听诊器捕捉心跳一样,netstat让我直接听到了服务器网络的心跳声。
简单来说,netstat(network statistics)是Linux/Unix系统自带的网络状态分析工具。它能显示实时的网络连接、路由表信息、接口统计等关键数据。无论是查看某个端口是否被占用,还是诊断网络延迟问题,甚至是分析DDoS攻击痕迹,这个命令都能派上用场。我常跟团队新人说,掌握netstat就像获得了一把网络诊断的瑞士军刀。
与ss、lsof等新工具相比,netstat的优势在于兼容性极强——从老旧的CentOS 6到最新的Ubuntu 22.04都能完美运行。不过要注意,在某些最新Linux发行版中需要先安装net-tools包(sudo apt install net-tools)。实际工作中我习惯用netstat -tulnp组合命令,它能同时显示TCP/UDP端口和对应进程,后面我们会详细拆解这个"万能公式"。
刚接手一台陌生服务器时,我总会先运行这个命令:
bash复制netstat -a
输出结果通常分为三部分:
上周就遇到个典型案例:某台测试服务器CPU突然飙高,用-a参数发现大量SYN_RECV状态的连接,最终确认是研发同学误开了压力测试工具。这里教大家一个技巧:配合watch命令可以动态监控(watch -n 1 netstat -a),每秒刷新一次数据。
排查Web服务问题时,我常用这两个黄金组合:
bash复制netstat -at # 只看TCP连接
netstat -au # 只看UDP连接
特别是当Nginx出现bind() failed错误时,用-at快速定位被占用的80端口。曾经有次Docker容器莫名崩溃,就是靠-au发现某个UDP端口被异常进程占用。注意输出中的LISTEN状态表示服务正在监听,ESTABLISHED则是已建立的连接。
最实用的还得是这个组合拳:
bash复制netstat -tulnp
参数解析:
-t:TCP协议-u:UDP协议-l:仅显示监听端口-n:禁用域名解析(加快速度)-p:显示进程信息上周五临下班时,运营同事紧急呼叫说后台系统无法登录。我连上服务器输入这行命令,立刻发现3306端口被一个陈旧的测试程序占用。通过kill -9 [PID]解决问题后,还收获了同事的奶茶投喂。
处理本地进程通信时,这个命令能派上大用场:
bash复制netstat -ax | grep mysql
比如排查MySQL连接问题时,除了检查TCP的3306端口,还要关注/var/run/mysqld/mysqld.sock这类套接字文件。去年我们有个定时任务异常,就是因为PHP程序错误地连接了本地套接字而非TCP端口。
掌握TCP状态机是进阶必经之路。这是我整理的常见状态对照表:
| 状态 | 含义 | 典型场景 |
|---|---|---|
| LISTEN | 等待连接请求 | Nginx正常运行时 |
| SYN_SENT | 已发送连接请求 | 客户端连接服务器时 |
| ESTABLISHED | 连接已建立 | 正常数据传输中 |
| FIN_WAIT1 | 主动关闭连接等待确认 | 服务端主动断开连接时 |
| TIME_WAIT | 等待足够时间确保远程TCP关闭 | 大量短连接后常见 |
去年双十一大促期间,我们API服务器出现大量TIME_WAIT状态。通过调整内核参数net.ipv4.tcp_tw_reuse才解决问题。这里特别提醒:如果发现大量SYN_RECV状态,可能是遭受SYN Flood攻击,需要立即启用防御措施。
网络不通时,我必查这个路由表:
bash复制netstat -rn
输出字段详解:
有次机房网络割接后,研发同事反映无法访问测试环境。用-rn发现默认路由指向了错误的网关,修改后立即恢复。建议配合traceroute命令一起使用,能清晰看到网络包走过的路径。
当需要整体评估网络质量时:
bash复制netstat -s
这个命令会输出包括TCP重传率、UDP丢包等关键指标。曾经我们游戏服务器出现卡顿,通过-s发现TCP重传率高达15%,最终定位到交换机端口故障。对于Web服务器,建议定期保存统计结果做对比分析:
bash复制netstat -s > network_stats_$(date +%F).log
某次部署Jenkins时遇到报错:
code复制java.net.BindException: Address already in use
快速诊断步骤:
bash复制netstat -tulnp | grep 8080
bash复制tcp6 0 0 :::8080 :::* LISTEN 1234/docker-proxy
凌晨收到服务器CPU告警,快速排查:
bash复制netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
bash复制823 45.156.23.211
bash复制iptables -A INPUT -s 45.156.23.211 -j DROP
Spring应用出现Too many connections错误:
bash复制netstat -anp | grep 3306
CLOSE_WAIT状态连接在大流量服务器上,netstat可能会消耗较多资源。这里分享我的优化经验:
-n禁用DNS解析-t或-u限定协议类型bash复制netstat -an | grep ESTABLISHED | wc -l
在新版Linux中,ss命令性能更好:
bash复制ss -tulnp # 类似netstat -tulnp
主要区别:
对于重要服务器,建议配置定时任务:
bash复制*/5 * * * * /usr/bin/netstat -s > /var/log/netstat_$(date +\%Y\%m\%d_\%H\%M).log
配合ELK等工具可以实现网络状态的可视化监控。