【网络】每天掌握一个Linux命令 - netstat

目录

【网络】每天掌握一个Linux命令 - netstat

在网络管理和故障排查中,我们常常需要了解系统的网络连接状态、路由表信息以及网络接口统计数据等。netstat就是一款强大的工具,它能帮我们轻松获取这些信息,让网络问题无所遁形。无论是查看当前有哪些网络连接正在进行,还是分析网络服务的运行状态,netstat都能发挥重要作用。

工具概述

netstat是Linux系统中一个非常实用的网络工具,全称为network statistics(网络统计)。它用于显示各种网络相关信息,如网络连接、路由表、接口统计数据、伪装连接、多播成员等。通过netstat,用户可以了解网络的整体使用情况,诊断网络问题,监控网络性能,是系统管理员和网络工程师常用的工具之一。

安装方式

在大多数Linux发行版中,netstat工具通常包含在net-tools软件包中。不过,需要注意的是,net-tools包在较新的Linux发行版中可能不再是默认安装的,取而代之的是更现代的iproute2工具集。但为了兼容性,许多系统仍然提供net-tools包。

  • Debian/Ubuntu系统

    bash 复制代码
    sudo apt-get update
    sudo apt-get install net-tools
  • CentOS/RHEL系统

    bash 复制代码
    sudo yum install net-tools
  • Arch Linux系统

    bash 复制代码
    sudo 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

注意事项

  1. 权限问题:使用-p选项显示进程信息时,需要root权限才能查看所有进程的详细信息。普通用户只能看到自己的进程。
  2. 替代工具:netstat虽然功能强大,但在较新的Linux系统中,推荐使用ss命令替代,它功能更强大且速度更快。例如,ss -tulpn与netstat -tulpn功能类似。
  3. 性能影响:在大型服务器上,使用netstat -a或netstat -p可能会消耗较多系统资源,尤其是在网络连接非常多的情况下。
  4. 端口解析:不使用-n选项时,netstat会尝试将IP地址和端口号解析为主机名和服务名,这可能会导致命令执行速度变慢,特别是在网络连接不良的情况下。
  5. 路由表变化:路由表可能会因为网络配置的变化而动态更新,因此查看路由表时应注意当前的网络状态。
  6. 防火墙影响:防火墙可能会阻止某些连接的建立或显示,因此netstat显示的连接信息可能不完整。
相关推荐
牧以南歌〆3 小时前
在Ubuntu主机中修改ARM Linux开发板的根文件系统
linux·arm开发·驱动开发·ubuntu
互联网搬砖老肖4 小时前
运维打铁: MongoDB 数据库集群搭建与管理
运维·数据库·mongodb
Antonio9154 小时前
【音视频】HLS简介与服务器搭建
运维·服务器·音视频
夜月yeyue4 小时前
设计模式分析
linux·c++·stm32·单片机·嵌入式硬件
kfepiza5 小时前
Debian的`/etc/network/interfaces`的`allow-hotplug`和`auto`对比讲解 笔记250704
linux·服务器·网络·笔记·debian
无妄-20245 小时前
软件架构升级中的“隐形地雷”:版本选型与依赖链风险
java·服务器·网络·经验分享
艾伦_耶格宇5 小时前
【docker】-1 docker简介
运维·docker·容器
R.X. NLOS5 小时前
VS Code远程开发新方案:使用SFTP扩展解决Remote-SSH连接不稳定问题
运维·服务器·ssh·debug·vs code
cuijiecheng20186 小时前
Ubuntu下布署mediasoup-demo
linux·运维·ubuntu
群联云防护小杜6 小时前
构建分布式高防架构实现业务零中断
前端·网络·分布式·tcp/ip·安全·游戏·架构