netstat命令

netstat 命令 #

netstat命令(network statistics)用于显示网络连接、路由表、接口统计信息、伪装连接和多播成员等网络相关信息。它是一个用于监控网络的重要工具。在现代 Linux 系统中,netstat命令已经被ssip等命令所取代,但由于其简单性和历史原因,仍然被广泛使用。

语法 #

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"

注意事项 #

  1. 在现代 Linux 系统中,netstat命令已经被ssip等命令所取代,但仍然被广泛使用。

  2. 使用-p选项查看进程信息通常需要 root 权限。

  3. 在大型系统上,netstat可能比ss慢,因为它需要遍历/proc文件系统。

  4. 默认情况下,netstat会尝试解析主机名和服务名,这可能会导致延迟。使用-n选项可以避免这种情况。

  5. 在某些系统上,netstat命令可能不是默认安装的,需要安装net-tools包。

提示 #

  • 使用-n选项可以加快netstat的执行速度,特别是在 DNS 解析缓慢的情况下
  • 使用-c选项可以持续监控网络连接的变化
  • 结合grep命令可以过滤特定的连接或状态
  • 使用sudo运行netstat可以获取更多信息,特别是进程信息
  • 在脚本中,通常使用-n选项以便于解析输出
  • 对于更复杂的网络监控需求,考虑使用ssip或专业的网络监控工具
  • 使用netstat -s可以查看详细的网络统计信息,这对于诊断网络问题很有用
  • 在多用户系统上,普通用户只能看到自己的进程信息