目录
【网络】每天掌握一个Linux命令 - netstat
在网络管理和故障排查中,我们常常需要了解系统的网络连接状态、路由表信息以及网络接口统计数据等。netstat就是一款强大的工具,它能帮我们轻松获取这些信息,让网络问题无所遁形。无论是查看当前有哪些网络连接正在进行,还是分析网络服务的运行状态,netstat都能发挥重要作用。
工具概述
netstat是Linux系统中一个非常实用的网络工具,全称为network statistics(网络统计)。它用于显示各种网络相关信息,如网络连接、路由表、接口统计数据、伪装连接、多播成员等。通过netstat,用户可以了解网络的整体使用情况,诊断网络问题,监控网络性能,是系统管理员和网络工程师常用的工具之一。
安装方式
在大多数Linux发行版中,netstat工具通常包含在net-tools软件包中。不过,需要注意的是,net-tools包在较新的Linux发行版中可能不再是默认安装的,取而代之的是更现代的iproute2工具集。但为了兼容性,许多系统仍然提供net-tools包。
-
Debian/Ubuntu系统
bashsudo apt-get update sudo apt-get install net-tools
-
CentOS/RHEL系统
bashsudo yum install net-tools
-
Arch Linux系统
bashsudo pacman -S net-tools
如果您使用的是较新的Linux发行版,可能已经预装了netstat。您可以通过以下命令检查是否已安装:
bash
netstat --version
核心功能
功能分类 | 描述 |
---|---|
显示网络连接 | 列出所有活动的网络连接,包括TCP、UDP、UNIX域套接字等,可区分本地和远程连接。 |
查看路由表 | 显示内核中的路由表信息,包括网络目的地、网关、接口等。 |
显示网络接口统计 | 提供网络接口的统计数据,如接收和发送的数据包数量、错误信息等。 |
显示多播组信息 | 列出系统当前参与的多播组。 |
显示网络协议统计 | 提供各种网络协议的统计信息,如TCP、UDP、IP等协议的使用情况。 |
监控网络状态 | 通过持续刷新显示,实时监控网络连接和状态的变化。 |
基础用法
netstat命令的基本语法如下:
bash
netstat [选项]
下面是一些常用的选项及其说明:
选项 | 长格式 | 描述 |
---|---|---|
-a | --all | 显示所有连接和监听端口,包括TCP和UDP的连接以及监听状态的套接字。 |
-t | --tcp | 仅显示TCP连接。 |
-u | --udp | 仅显示UDP连接。 |
-n | --numeric | 以数字形式显示地址和端口号,而不是尝试解析主机名、端口名或用户名,可加快命令执行速度。 |
-p | --programs | 显示建立相关连接的程序名和进程ID,需要root权限才能查看所有进程信息。 |
-l | --listening | 仅显示监听状态的套接字,用于查看哪些服务正在监听端口。 |
-r | --route | 显示内核路由表,相当于执行route命令。 |
-i | --interfaces | 显示网络接口列表及其统计信息,类似于ifconfig命令的简化版。 |
-s | --statistics | 显示每个协议的统计信息,如TCP、UDP等协议的连接数、错误数等。 |
-c | --continuous | 每隔指定时间(秒)重复显示网络状态,用于监控网络活动。 |
-e | --extend | 显示扩展信息,如用户、Inode等。 |
-v | --verbose | 显示详细的网络状态信息。 |
-x | --unix | 仅显示UNIX域套接字连接。 |
-F | --fib | 显示FIB(转发信息库)路由表,与-r类似但更详细。 |
-C | --cache | 显示路由缓存信息。 |
--ip | --inet | 仅显示IP协议的连接(包括TCP、UDP等)。 |
进阶和实战案例
查看所有监听的TCP端口
bash
netstat -tlpn
输出示例:
Active Internet connections (only servers)
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:53 0.0.0.0:* LISTEN 5678/named
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 9012/httpd
tcp6 0 0 :::22 :::* LISTEN 1234/sshd
tcp6 0 0 :::80 :::* LISTEN 9012/httpd
标题含义:
- Proto:协议类型(tcp或tcp6表示IPv4或IPv6的TCP协议)
- Recv-Q:接收队列中的字节数
- Send-Q:发送队列中的字节数
- Local Address:本地地址和端口
- Foreign Address:远程地址和端口
- State:连接状态(LISTEN表示监听状态)
- PID/Program name:进程ID和对应的程序名
查看所有已建立的TCP连接
bash
netstat -tnpa | grep ESTABLISHED
输出示例:
tcp 0 0 192.168.1.100:22 192.168.1.200:56789 ESTABLISHED 1234/sshd: user [priv
tcp 0 0 192.168.1.100:443 104.28.32.210:5678 ESTABLISHED 9012/httpd
标题含义:
- State:ESTABLISHED表示已建立的连接
查找占用特定端口的进程
要查找哪个进程正在占用8080端口,可以使用以下命令:
bash
netstat -tulpn | grep :8080
输出示例:
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 12345/java
这表明Java进程(PID为12345)正在监听8080端口。
显示网络接口统计信息
bash
netstat -i
输出示例:
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 12345 0 0 0 6789 0 0 0 BMRU
lo 65536 0 4321 0 0 0 4321 0 0 0 LRU
标题含义:
- Iface:接口名称
- MTU:最大传输单元
- RX-OK:接收的正确数据包数
- RX-ERR:接收的错误数据包数
- RX-DRP:接收的丢弃数据包数
- TX-OK:发送的正确数据包数
- TX-ERR:发送的错误数据包数
- Flg:接口标志(B=广播,M=多播,R=运行,U=可用)
显示路由表
bash
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 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
标题含义:
- Destination:目标网络或主机
- Gateway:网关地址(0.0.0.0表示直接连接)
- Genmask:网络掩码
- Flags:路由标志(U=启用,G=使用网关,H=主机路由)
- Iface:输出接口
实时监控网络连接
bash
netstat -ctn
这将每2秒(默认间隔)刷新一次,显示所有TCP连接的实时状态。
显示UDP监听端口
bash
netstat -ulpn
输出示例:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:5353 0.0.0.0:* 1234/avahi-daemon
udp 0 0 0.0.0.0:68 0.0.0.0:* 5678/dhclient
udp6 0 0 :::5353 :::* 1234/avahi-daemon
显示UNIX域套接字连接
bash
netstat -xap
输出示例:
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 12345 1/init /run/systemd/private
unix 2 [ ACC ] STREAM LISTENING 67890 1234/dbus-daemon /var/run/dbus/system_bus_socket
unix 3 [ ] DGRAM 54321 5678/rsyslogd /run/systemd/journal/syslog
显示详细的网络统计信息
bash
netstat -s
部分输出示例:
Ip:
Forwarding: 1
12345 total packets received
0 forwarded
0 incoming packets discarded
12345 incoming packets delivered
67890 requests sent out
Icmp:
1234 ICMP messages received
0 input ICMP message failed.
ICMP input histogram:
echo reply: 1000
destination unreachable: 234
1234 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
echo request: 1000
destination unreachable: 234
Tcp:
1234 active connections openings
5678 passive connection openings
234 failed connection attempts
123 connection resets received
456 connections established
12345 segments received
67890 segments sent out
1234 segments retransmitted
567 TCP sockets finished time wait in fast timer
0 other TCP timeouts
Udp:
12345 datagrams received
0 input datagrams incomplete.
67890 datagrams sent
0 receive buffer errors
0 send buffer errors
注意事项
- 权限问题:使用-p选项显示进程信息时,需要root权限才能查看所有进程的详细信息。普通用户只能看到自己的进程。
- 替代工具:netstat虽然功能强大,但在较新的Linux系统中,推荐使用ss命令替代,它功能更强大且速度更快。例如,ss -tulpn与netstat -tulpn功能类似。
- 性能影响:在大型服务器上,使用netstat -a或netstat -p可能会消耗较多系统资源,尤其是在网络连接非常多的情况下。
- 端口解析:不使用-n选项时,netstat会尝试将IP地址和端口号解析为主机名和服务名,这可能会导致命令执行速度变慢,特别是在网络连接不良的情况下。
- 路由表变化:路由表可能会因为网络配置的变化而动态更新,因此查看路由表时应注意当前的网络状态。
- 防火墙影响:防火墙可能会阻止某些连接的建立或显示,因此netstat显示的连接信息可能不完整。