在Linux上使用netstat命令的用法

学习什么是netstat命令以及一些实时示例。

netstat(网络统计)是一个命令行工具,用于显示网络连接(包括传入和传出连接),路由表和各种网络接口统计数据。

它适用于Linux,类Unix和操作系统 Windowsnetstat 功能强大,是一个很方便的工具,可以用于故障排除与网络相关的问题并验证连接统计。

如果输入 netstat -help,将显示以下用法指南。

[root@lab ~]# netstat -help
用法:netstat [-vWeenNcCF] [] -r         netstat {-V|--version|-h|--help}
       netstat [-vWnNcaeol] [ ...]
       netstat { [-vWeenNac] -I[] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay]

        -r, --route              显示路由表
        -I, --interfaces= 显示的接口表
        -i, --interfaces         显示接口表
        -g, --groups             显示多播组成员身份
        -s, --statistics         显示网络统计信息(如SNMP)
        -M, --masquerade         显示伪装连接

        -v, --verbose            冗长输出
        -W, --wide               不截断IP地址
        -n, --numeric            不解析名称
        --numeric-hosts          不解析主机名
        --numeric-ports          不解析端口名称
        --numeric-users          不解析用户名
        -N, --symbolic           解析硬件名称
        -e, --extend             显示其他/更多信息
        -p, --programs           显示套接字的PID/程序名
        -o, --timers             显示定时器
        -c, --continuous         连续显示

        -l, --listening          显示正在监听的服务器套接字
        -a, --all                显示所有套接字(默认:已连接)
        -F, --fib                显示转发信息库(默认)
        -C, --cache              显示路由缓存而不是FIB
        -Z, --context            显示套接字的SELinux安全上下文

  ={-t|--tcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw}
           {-x|--unix} --ax25 --ipx --netrom
  =使用 '-6|-4' 或 '-A ' 或 '--';默认:inet
  可能的地址族列表(支持路由的):
    inet(DARPA互联网)inet6(IPv6)ax25(AMPR AX.25) 
    netrom(AMPR NET/ROM)ipx(Novell IPX)ddp(Appletalk DDP) 
    x25(CCITT X.25) 
[root@lab ~]#

让我给你展示一些命令的示例。以下命令在RHEL/CentOS上测试过,但我认为在其他发行版如Ubuntu上也可以工作。

已建立连接

如果你要查找服务器上的所有已建立连接。

[root@lab ~]# netstat -natu | grep 'ESTABLISHED'
tcp        0     21 68.183.37.102:22        222.186.31.135:21714    ESTABLISHED
tcp        0     36 68.183.37.102:22        52.148.155.182:49859    ESTABLISHED
tcp        0      0 68.183.37.102:22        61.177.142.158:55481    ESTABLISHED
[root@lab ~]#

如果你有很多已建立的连接,并且有兴趣查找其中一个IP,那么可以使用另一个grep命令。

[root@lab ~]# netstat -natu | grep 'ESTABLISHED' | grep 61.177.142.158
tcp        0   1280 68.183.37.102:22        61.177.142.158:33932    ESTABLISHED
[root@lab ~]#

监听连接

假设你已经启动了某个服务,并且该服务应该侦听特定的IP:端口,这将有助于验证。

[root@lab ~]# netstat -an | grep 'LISTEN'
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp6       0      0 :::111                  :::*                    LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
[root@lab ~]#

或者,您可以使用-l参数显示所有的监听套接字。

[root@lab ~]# netstat -l
活动的Internet连接(仅限服务器)
协议 接收队列 发送队列 本地地址               外部地址               状态      
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN     
tcp6       0      0 [::]:webcache           [::]:*                  LISTEN     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
udp        0      0 0.0.0.0:805             0.0.0.0:*                          
udp        0      0 0.0.0.0:sunrpc          0.0.0.0:*                          
udp        0      0 localhost:323           0.0.0.0:*                          
udp6       0      0 [::]:805                [::]:*                             
udp6       0      0 [::]:sunrpc             [::]:*                             
udp6       0      0 ip6-localhost:323       [::]:*                             
活动的UNIX域套接字(仅限服务器)
协议 引用计数 标志       类型       状态         I-Node   路径
unix  2      [ ACC ]     流         LISTENING     15108    /run/dbus/system_bus_socket
unix  2      [ ACC ]     流         LISTENING     8202     /run/systemd/journal/stdout
unix  2      [ ACC ]     SEQPACKET  LISTENING     12813    /run/udev/control
unix  2      [ ACC ]     流         LISTENING     17542    public/pickup
unix  2      [ ACC ]     流         LISTENING     15165    /var/run/rpcbind.sock
unix  2      [ ACC ]     流         LISTENING     17546    public/cleanup
unix  2      [ ACC ]     流         LISTENING     15605    /var/lib/gssproxy/default.sock
unix  2      [ ACC ]     流         LISTENING     12706    /run/systemd/private
unix  2      [ ACC ]     流         LISTENING     17549    public/qmgr
unix  2      [ ACC ]     流         LISTENING     17571    public/flush
unix  2      [ ACC ]     流         LISTENING     17553    private/tlsmgr
unix  2      [ ACC ]     流         LISTENING     17586    public/showq
unix  2      [ ACC ]     流         LISTENING     17556    private/rewrite
unix  2      [ ACC ]     流         LISTENING     17559    private/bounce
unix  2      [ ACC ]     流         LISTENING     17562    private/defer
unix  2      [ ACC ]     流         LISTENING     17565    private/trace
unix  2      [ ACC ]     流         LISTENING     17568    private/verify
unix  2      [ ACC ]     流         LISTENING     17574    private/proxymap
unix  2      [ ACC ]     流         LISTENING     17577    private/proxywrite
unix  2      [ ACC ]     流         LISTENING     17580    private/smtp
unix  2      [ ACC ]     流         LISTENING     17583    private/relay
unix  2      [ ACC ]     流         LISTENING     17589    private/error
unix  2      [ ACC ]     流         LISTENING     17592    private/retry
unix  2      [ ACC ]     流         LISTENING     17595    private/discard
unix  2      [ ACC ]     流         LISTENING     17598    private/local
unix  2      [ ACC ]     流         LISTENING     17601    private/virtual
unix  2      [ ACC ]     流         LISTENING     17604    private/lmtp
unix  2      [ ACC ]     流         LISTENING     17607    private/anvil
unix  2      [ ACC ]     流         LISTENING     17610    private/scache
unix  2      [ ACC ]     流         LISTENING     15606    /run/gssproxy.sock
[root@lab ~]#

使用grep过滤结果。

PID使用的端口号

您知道您的应用程序已启动并知道PID(进程标识符),但不确定它使用的端口号是多少。以下示例是针对PID 3937的。

[root@lab ~]# netstat -rn
Kernel routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG        0 0          0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
[root@lab ~]#

The routing table shows that the default gateway is 192.168.0.1 and the network 192.168.0.0 is directly connected to interface eth0.

PID和端口号

用于解决端口冲突问题非常方便。假设你想启动监听80端口的Apache或Nginx服务器,但是由于其他进程已经在使用该端口,所以无法启动。

[root@lab ~]# netstat -anlp |grep 80 | grep LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN      3937/httpd          
[root@lab ~]#

可以看到PID 3937正在使用该端口。

如果你使用的是AIX系统,使用以下命令:

netstat -Aan | grep $portnumber

这会显示十六进制的协议控制块地址。

一旦你有了十六进制地址,可以执行以下命令来查找哪个进程正在使用该端口。

rmsock $address_of_pcb tcpcb

网络接口列表

有多个以太网接口吗?或者不确定并想要找出?

[root@lab ~]# 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   793026      0      0 0        849443      0      0      0 BMRU
lo              65536        6      0      0 0             6      0      0      0 LRU
[root@lab ~]#

持续监听

在解决与服务崩溃相关的问题时,这是一个很好的选项。假设一个应用程序随机地每隔几分钟崩溃一次。但是,不确定具体是什么时候崩溃。你可以使用-c参数来连续显示结果。

[root@lab ~]# netstat -anlpc |grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      11766/httpd         
tcp6       0      0 :::8080                 :::*                    LISTEN      11766/httpd         
tcp6       0      0 :::8080                 :::*                    LISTEN      11766/httpd         
tcp6       0      0 :::8080                 :::*                    LISTEN      11766/httpd

当它停止更新时,你就知道它已经崩溃了。

总结

netstat是系统管理员广泛使用的命令之一,希望上述示例能给你一些关于它的用法的思路。如果你想学习更多关于Linux管理的知识,可以参考这个Udemy course

类似文章