netstat 命令 #
netstat
命令(network statistics)用于显示网络连接、路由表、接口统计信息、伪装连接和多播成员等网络相关信息。它是一个用于监控网络的重要工具。在现代 Linux 系统中,netstat
命令已经被ss
、ip
等命令所取代,但由于其简单性和历史原因,仍然被广泛使用。
语法 #
netstat [选项]
常用选项 #
选项 | 描述 |
---|---|
-a, --all |
显示所有套接字(包括监听和非监听的) |
-l, --listening |
只显示监听套接字 |
-t, --tcp |
显示 TCP 连接 |
-u, --udp |
显示 UDP 连接 |
-n, --numeric |
显示数字形式的地址和端口(不解析名称) |
-p, --programs |
显示进程 ID 和程序名称 |
-r, --route |
显示路由表 |
-i, --interfaces |
显示网络接口 |
-s, --statistics |
显示网络统计信息 |
-c, --continuous |
持续显示,每秒更新一次 |
-e, --extend |
显示额外信息 |
-o, --timers |
显示计时器信息 |
-v, --verbose |
显示详细信息 |
-W, --wide |
不截断 IP 地址 |
-A, --protocol=家族 |
指定地址族(如 inet, unix, ipx, ax25, netrom, ddp 等) |
-M, --masquerade |
显示伪装连接 |
安装 #
在某些现代 Linux 发行版中,netstat
命令可能不是默认安装的。可以使用以下命令安装:
# Debian/Ubuntu
sudo apt install net-tools
# CentOS/RHEL
sudo yum install net-tools
# Fedora
sudo dnf install net-tools
# Arch Linux
sudo pacman -S net-tools
常见用法 #
1. 显示所有活动的连接 #
netstat -a
2. 显示所有 TCP 连接 #
netstat -at
3. 显示所有 UDP 连接 #
netstat -au
4. 显示所有监听端口 #
netstat -l
5. 显示监听的 TCP 端口 #
netstat -lt
6. 显示监听的 UDP 端口 #
netstat -lu
7. 显示进程信息 #
sudo netstat -p
8. 显示所有 TCP 连接,不解析名称 #
netstat -atn
9. 显示路由表 #
netstat -r
或
netstat -rn
10. 显示网络接口 #
netstat -i
11. 显示网络统计信息 #
netstat -s
12. 显示特定协议的统计信息 #
netstat -st # TCP统计
netstat -su # UDP统计
13. 持续监控网络连接 #
netstat -c
14. 显示 Unix 域套接字 #
netstat -x
15. 显示多播组成员 #
netstat -g
输出解释 #
活动连接输出(netstat -a) #
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:domain *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 localhost:smtp *:* LISTEN
tcp 0 272 192.168.1.100:ssh 192.168.1.1:49721 ESTABLISHED
udp 0 0 *:bootpc *:*
- Proto:协议(TCP、UDP 等)
- Recv-Q:接收队列中的字节数
- Send-Q:发送队列中的字节数
- Local Address:本地地址和端口
- Foreign Address:远程地址和端口
- State:连接状态(仅 TCP)
常见的 TCP 连接状态 #
状态 | 描述 |
---|---|
LISTEN | 监听连接请求 |
SYN_SENT | 已发送连接请求,等待确认 |
SYN_RECV | 已收到连接请求,等待确认 |
ESTABLISHED | 连接已建立 |
FIN_WAIT1 | 等待远程 TCP 关闭连接或发送 FIN |
FIN_WAIT2 | 等待远程 TCP 关闭连接 |
CLOSE_WAIT | 等待本地用户关闭连接 |
CLOSING | 等待远程 TCP 确认连接关闭 |
LAST_ACK | 等待远程 TCP 确认连接关闭请求 |
TIME_WAIT | 等待足够的时间以确保远程 TCP 收到连接关闭确认 |
CLOSED | 连接已关闭,不在表中 |
路由表输出(netstat -r) #
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 * 255.255.255.0 U 0 0 0 eth0
- Destination:目标网络或主机
- Gateway:网关地址
- Genmask:目标的网络掩码
- Flags:路由标志
- MSS:默认最大分段大小
- Window:默认窗口大小
- irtt:初始往返时间
- Iface:接口
路由标志 #
标志 | 描述 |
---|---|
U | 路由已启用 |
G | 使用网关 |
H | 目标是主机 |
D | 由重定向创建 |
M | 由重定向修改 |
接口统计输出(netstat -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 1234 0 0 0 1234 0 0 0 LRU
- Iface:接口名称
- MTU:最大传输单元
- RX-OK:接收的正确数据包数
- RX-ERR:接收的错误数据包数
- RX-DRP:接收时丢弃的数据包数
- RX-OVR:接收时发生的溢出次数
- TX-OK:发送的正确数据包数
- TX-ERR:发送的错误数据包数
- TX-DRP:发送时丢弃的数据包数
- TX-OVR:发送时发生的溢出次数
- Flg:标志(B=广播,M=多播,R=运行,U=启用,L=环回,O=无 ARP)
与其他命令的对比 #
netstat vs. ss #
ss
命令是netstat
的现代替代品,提供了更多信息和更好的性能:
netstat 命令 | ss 命令 | 描述 |
---|---|---|
netstat -a |
ss |
显示所有套接字 |
netstat -at |
ss -t |
显示 TCP 套接字 |
netstat -au |
ss -u |
显示 UDP 套接字 |
netstat -l |
ss -l |
显示监听套接字 |
netstat -p |
ss -p |
显示进程信息 |
netstat -n |
ss -n |
不解析名称 |
netstat -o |
ss -o |
显示计时器信息 |
netstat vs. ip #
ip
命令可以替代netstat
的一些功能:
netstat 命令 | ip 命令 | 描述 |
---|---|---|
netstat -r |
ip route |
显示路由表 |
netstat -i |
ip -s link |
显示接口统计信息 |
netstat -g |
ip maddr |
显示多播地址 |
实用示例 #
1. 查找监听特定端口的进程 #
sudo netstat -tulpn | grep :80
2. 统计各种连接状态的数量 #
netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n
3. 查看连接到特定 IP 地址的连接 #
netstat -an | grep 192.168.1.100
4. 查看网络接口的错误统计 #
netstat -i | grep -v "Kernel"
5. 监控实时连接数 #
watch -n 1 "netstat -an | grep ESTABLISHED | wc -l"
6. 查看特定进程的网络连接 #
sudo netstat -p | grep nginx
7. 检查是否有异常的 TIME_WAIT 或 CLOSE_WAIT 连接 #
netstat -an | grep TIME_WAIT | wc -l
netstat -an | grep CLOSE_WAIT | wc -l
8. 查看网络流量统计 #
netstat -s | grep -E "packets|segments"
注意事项 #
-
在现代 Linux 系统中,
netstat
命令已经被ss
、ip
等命令所取代,但仍然被广泛使用。 -
使用
-p
选项查看进程信息通常需要 root 权限。 -
在大型系统上,
netstat
可能比ss
慢,因为它需要遍历/proc
文件系统。 -
默认情况下,
netstat
会尝试解析主机名和服务名,这可能会导致延迟。使用-n
选项可以避免这种情况。 -
在某些系统上,
netstat
命令可能不是默认安装的,需要安装net-tools
包。
提示 #
- 使用
-n
选项可以加快netstat
的执行速度,特别是在 DNS 解析缓慢的情况下 - 使用
-c
选项可以持续监控网络连接的变化 - 结合
grep
命令可以过滤特定的连接或状态 - 使用
sudo
运行netstat
可以获取更多信息,特别是进程信息 - 在脚本中,通常使用
-n
选项以便于解析输出 - 对于更复杂的网络监控需求,考虑使用
ss
、ip
或专业的网络监控工具 - 使用
netstat -s
可以查看详细的网络统计信息,这对于诊断网络问题很有用 - 在多用户系统上,普通用户只能看到自己的进程信息