netstat(Network Statistics)是 Linux 系统中用于查看网络状态、连接、路由表和接口统计信息的经典命令行工具。它为系统管理员和开发人员提供了强大的网络诊断功能,帮助分析网络连接、监控流量以及排查网络问题。尽管在现代 Linux 系统中,netstat 正在被更新的工具(如 ss)部分取代,但其简单性和广泛适用性使其仍然是许多场景下的首选工具。
netstat 是 net-tools 软件包的一部分,用于显示网络相关的统计信息,包括活动连接、监听端口、路由表、网络接口状态等。它可以帮助用户了解系统的网络活动,识别潜在的安全问题或性能瓶颈。netstat 广泛应用于 Linux、Unix 和类 Unix 系统(如 macOS),在网络管理和故障排查中扮演重要角色。
netstat [选项]
常用选项包括:
权限要求:某些选项(如 -p)需要 root 权限(使用 sudo)。
软件包安装:netstat 属于 net-tools,可能需要安装:
sudo apt install net-tools # Debian/Ubuntu
sudo yum install net-tools # CentOS/RHEL
替代工具:在现代系统中,ss 和 ip 命令提供类似功能,性能更高。
输出解析:输出信息较多,建议结合 grep 或 awk 过滤。
netstat 的应用场景广泛,以下是几个典型用途:
以下通过具体示例介绍 netstat 的基础用法,帮助读者快速上手。以下示例假设运行在支持 net-tools 的 Linux 系统(如 Ubuntu 22.04 或 CentOS 8)。
查看所有网络连接(包括监听和非监听):
netstat -a
解释:
-a:显示所有连接和监听端口。
输出示例(部分):
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 192.168.1.100:22 192.168.1.101:12345 ESTABLISHED
udp 0 0 0.0.0.0:68 0.0.0.0:*
字段说明:
查看系统上所有监听的端口:
netstat -tuln
解释:
-t:显示 TCP 连接。
-u:显示 UDP 连接。
-l:仅显示监听状态。
-n:以数字格式显示地址和端口。
输出示例:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*
查看与连接相关的进程:
sudo netstat -tulnp
解释:
-p:显示进程 ID 和程序名。
输出示例:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 5678/mysqld
注意:需要 root 权限。
查看系统路由表:
netstat -r
解释:
-r:显示路由表,类似 route 命令。
输出示例:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
查看网络接口的流量和错误:
netstat -i
解释:
-i:显示网络接口统计信息。
输出示例:
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 123456 0 0 0 123456 0 0 0 BMRU
lo 65536 789012 0 0 0 789012 0 0 0 LRU
字段说明:
连续显示网络连接状态:
netstat -c
netstat 提供多种高级功能,适合复杂网络诊断和监控场景。以下介绍一些高级用法及其实现方法。
查看所有 TCP 连接,并过滤特定状态:
netstat -at | grep ESTABLISHED
解释:
-at:显示所有 TCP 连接。
grep ESTABLISHED:过滤状态为 ESTABLISHED 的连接。
输出示例:
tcp 0 0 192.168.1.100:22 192.168.1.101:12345 ESTABLISHED
查找使用端口 80 的连接:
sudo netstat -tunap | grep ":80"
解释:
-tunap:显示 TCP/UDP 连接、数字格式、进程信息。
grep “:80”:过滤包含端口 80 的连接。
输出示例:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/apache2
显示各协议的统计信息:
netstat -s
解释:
-s:显示 TCP、UDP、ICMP 等协议的统计信息。
输出示例(部分):
Tcp:
1234 active connection openings
567 passive connection openings
10 failed connection attempts
20 connection resets received
Udp:
789 packets received
123 packets to unknown port received
用途:分析网络协议性能,识别异常。
查找未知来源的连接:
sudo netstat -tunap | grep "192.168.1.101"
实时监控接口流量:
netstat -i -c 2
netstat 提供大量网络信息,操作不当可能导致误判或性能影响。以下是一些关键注意事项:
权限要求:使用 -p 或查看所有连接需要 root 权限。
性能开销:频繁运行 netstat -c 或查询大量连接可能增加系统负载。
解析主机名:默认解析 IP 为主机名(慢),建议使用 -n 提高速度。
替代工具:现代系统中,ss 比 netstat 更快,建议熟悉:
ss -tuln
安全监控:定期检查监听端口和外部连接,防范潜在安全威胁。
输出过滤:结合 grep、awk 或 sort 处理复杂输出。
以下是一些高级技巧和实战案例,展示 netstat 的强大功能。
检查 Apache Web 服务器(端口 80)是否正常监听:
sudo netstat -tuln | grep ":80"
解释:
确保 Apache 监听 80 端口。
若无输出,检查服务状态:
sudo systemctl status apache2
查找所有 SSH(端口 22)连接:
sudo netstat -tunap | grep ":22"
查找可疑外部连接:
sudo netstat -tunap | grep -v "127.0.0.1"
监控 TCP 连接统计:
watch -n 5 'netstat -s | grep -i tcp'
编写脚本定期记录连接状态:
#!/bin/bash
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "Network Status at $TIMESTAMP" >> /var/log/netstat.log
netstat -tunap >> /var/log/netstat.log
添加到 cron:
sudo crontab -e
添加:
*/5 * * * * /path/to/script.sh
netstat 常与其他工具结合,增强功能。
过滤特定 IP 或端口:
netstat -tunap | grep "192.168.1.100"
提取特定字段:
netstat -tunap | awk '/tcp/ {print $4, $5, $7}'
对比 netstat 和 ss 输出:
ss -tuln
netstat -tuln
定期监控(见案例 5)。
netstat 是 Linux 系统中分析网络状态的经典工具,提供连接状态、端口监听、路由表和接口统计等信息。改文从基础用法到高级技巧,结合具体示例和注意事项,全面介绍了 netstat 的功能。无论是网络故障排查、安全监控还是性能分析,netstat 都能提供强大支持。尽管 ss 等新工具逐渐流行,netstat 的简单性和广泛适用性使其依然不可或缺。