1. 认识netstat:网络工程师的听诊器
第一次接触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端口和对应进程,后面我们会详细拆解这个"万能公式"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础操作:端口查看四连招
2.1 查看所有活动连接
刚接手一台陌生服务器时,我总会先运行这个命令:
bash复制netstat -a
输出结果通常分为三部分:
- Active Internet connections:正在通信的TCP/UDP连接
- Active UNIX domain sockets:本地进程间通信
- Proto/Recv-Q/Send-Q等列头(后面会详解)
上周就遇到个典型案例:某台测试服务器CPU突然飙高,用-a参数发现大量SYN_RECV状态的连接,最终确认是研发同学误开了压力测试工具。这里教大家一个技巧:配合watch命令可以动态监控(watch -n 1 netstat -a),每秒刷新一次数据。
2.2 精准筛选TCP/UDP
排查Web服务问题时,我常用这两个黄金组合:
bash复制netstat -at # 只看TCP连接
netstat -au # 只看UDP连接
特别是当Nginx出现bind() failed错误时,用-at快速定位被占用的80端口。曾经有次Docker容器莫名崩溃,就是靠-au发现某个UDP端口被异常进程占用。注意输出中的LISTEN状态表示服务正在监听,ESTABLISHED则是已建立的连接。
2.3 显示进程和端口号
最实用的还得是这个组合拳:
bash复制netstat -tulnp
参数解析:
-t:TCP协议-u:UDP协议-l:仅显示监听端口-n:禁用域名解析(加快速度)-p:显示进程信息
上周五临下班时,运营同事紧急呼叫说后台系统无法登录。我连上服务器输入这行命令,立刻发现3306端口被一个陈旧的测试程序占用。通过kill -9 [PID]解决问题后,还收获了同事的奶茶投喂。
2.4 特殊场景:UNIX域套接字
处理本地进程通信时,这个命令能派上大用场:
bash复制netstat -ax | grep mysql
比如排查MySQL连接问题时,除了检查TCP的3306端口,还要关注/var/run/mysqld/mysqld.sock这类套接字文件。去年我们有个定时任务异常,就是因为PHP程序错误地连接了本地套接字而非TCP端口。
3. 高级诊断:网络问题定位三板斧
3.1 解读连接状态码
掌握TCP状态机是进阶必经之路。这是我整理的常见状态对照表:
| 状态 | 含义 | 典型场景 |
|---|---|---|
| LISTEN | 等待连接请求 | Nginx正常运行时 |
| SYN_SENT | 已发送连接请求 | 客户端连接服务器时 |
| ESTABLISHED | 连接已建立 | 正常数据传输中 |
| FIN_WAIT1 | 主动关闭连接等待确认 | 服务端主动断开连接时 |
| TIME_WAIT | 等待足够时间确保远程TCP关闭 | 大量短连接后常见 |
去年双十一大促期间,我们API服务器出现大量TIME_WAIT状态。通过调整内核参数net.ipv4.tcp_tw_reuse才解决问题。这里特别提醒:如果发现大量SYN_RECV状态,可能是遭受SYN Flood攻击,需要立即启用防御措施。
3.2 路由表深度解析
网络不通时,我必查这个路由表:
bash复制netstat -rn
输出字段详解:
- Destination:目标网络,0.0.0.0表示默认路由
- Gateway:下一跳地址,"*"表示直连网络
- Genmask:网络掩码
- Flags:U(路由有效)、G(需网关转发)
- Iface:出口网卡(eth0/wlan0等)
有次机房网络割接后,研发同事反映无法访问测试环境。用-rn发现默认路由指向了错误的网关,修改后立即恢复。建议配合traceroute命令一起使用,能清晰看到网络包走过的路径。
3.3 统计信息分析术
当需要整体评估网络质量时:
bash复制netstat -s
这个命令会输出包括TCP重传率、UDP丢包等关键指标。曾经我们游戏服务器出现卡顿,通过-s发现TCP重传率高达15%,最终定位到交换机端口故障。对于Web服务器,建议定期保存统计结果做对比分析:
bash复制netstat -s > network_stats_$(date +%F).log
4. 实战案例:从入门到精通
4.1 案例一:端口冲突速查
某次部署Jenkins时遇到报错:
code复制java.net.BindException: Address already in use
快速诊断步骤:
- 使用组合命令查占用:
bash复制
netstat -tulnp | grep 8080 - 发现是旧Docker容器进程:
bash复制
tcp6 0 0 :::8080 :::* LISTEN 1234/docker-proxy - 清理残留容器后问题解决
4.2 案例二:DDOS攻击识别
凌晨收到服务器CPU告警,快速排查:
- 统计异常连接:
bash复制netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n - 发现某个IP建立了800+连接:
bash复制
823 45.156.23.211 - 立即用iptables封禁:
bash复制
iptables -A INPUT -s 45.156.23.211 -j DROP
4.3 案例三:数据库连接泄露
Spring应用出现Too many connections错误:
- 查看MySQL连接来源:
bash复制
netstat -anp | grep 3306 - 发现大量
CLOSE_WAIT状态连接 - 最终定位到连接池未正确关闭
5. 性能优化与替代方案
5.1 加速查询技巧
在大流量服务器上,netstat可能会消耗较多资源。这里分享我的优化经验:
- 添加
-n禁用DNS解析 - 用
-t或-u限定协议类型 - 结合grep过滤关键信息:
bash复制netstat -an | grep ESTABLISHED | wc -l
5.2 ss命令对比
在新版Linux中,ss命令性能更好:
bash复制ss -tulnp # 类似netstat -tulnp
主要区别:
- 直接读取内核数据,速度更快
- 显示更详细的socket信息
- 但输出格式略有不同
5.3 自动化监控方案
对于重要服务器,建议配置定时任务:
bash复制*/5 * * * * /usr/bin/netstat -s > /var/log/netstat_$(date +\%Y\%m\%d_\%H\%M).log
配合ELK等工具可以实现网络状态的可视化监控。
