Linux netstat命令详解

我们需要先简单了解一下端口的作用。在互联网中,如果 IP 地址是 IP 服务器在互联网中唯一的地址标识,那么大家可以想象一下:我有一台服务器,它有固定的公网 IP 地址,通过 IP 地址可以找到我的服务器。但是我的服务器中既启动了网页服务(Web 服务),又启动了文件传输服务(FTP 服务),那么你的客户端访问我的服务器,到底应该如何确定你访问的是哪一个服务呢?

端口就是用于网络通信的接口,是数据从传输层向上传递到应用层的数据通道。我们可以理解为每个常规服务都有默认的端口号,通过不同的端口号,我们就可以确定不同的服务。也就是说,客户端通过 IP 地址访问到我的服务器,如果数据包访问的是 80 端口,则访问的是 Web 服务;而如果数据包访问的是 21 端口,则访问的是 FTP 服务

我们可以简单地理解为每个常规服务都有一个默认端口(默认端口可以修改),这个端口是所有人都知道的,客户端可以通过固定的端口访问指定的服务。而我们通过在服务器中查看已经开启的端口号,就可以判断服务器中开启了哪些服务

netstat 是网络状态查看命令,既可以查看到本机开启的端口,也可以查看有哪些客户端连接。netstat 命令的基本信息如下:

  • 命令名称:netstat
  • 英文原意:Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
  • 所在路径:/bin/netstat
  • 执行权限:所有用户
  • 功能描述:输出网络连接、路由表、接口统计、伪装连接和组播成员

参数:

  • -a:all,列出所有网络状态,包括 Socket 程序;
  • -c:count,秒数指定每隔几秒刷新一次网络状态;
  • -n:network,使用 IP 地址和端口号显示,不使用域名与服务名;
  • -p:process,显示 PID 和程序名;
  • -t:tcp,显示使用 TCP 协议端口的连接状况;
  • -u:udp,显示使用 UDP 协议端口的连接状况;
  • -I:listen,仅显示监听状态的连接;
  • -r:router,显示路由表;

【例 1】查看本机开启的端口

这是本机最常用的方式,使用选项"-tuln"。因为使用了"-I"选项,所以只能看到监听状态的连接,而不能看到已连接状态的连接。例如:

root@ubuntu-vm:/home/shen# netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:41275         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN       
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 :::445                  :::*                    LISTEN      
udp        0      0 127.0.0.53:53           0.0.0.0:*                          
udp        0      0 192.168.1.255:137       0.0.0.0:*                          
udp        0      0 192.168.1.110:137       0.0.0.0:*                        
udp6       0      0 :::37690                :::*                               
udp6       0      0 :::5353                 :::*        

这个命令的输出较多

Proto:网络连接的协议,一般就是 TCP 协议或者 UDP 协议

Recv-Q:表示接收到的数据,已经在本地的缓冲中,但是还没有被进程取走

Send-Q:表示从本机发送,对方还没有收到的数据,依然在本地的缓冲中,不具备 ACK 标志的数据包

Local Address:本机的 IP 地址和端口号

ForeignAddress:远程主机的 IP 地址和端口号

State:状态,常见的状态主要有以下几种

  • LISTEN:监听状态,只有 TCP 协议需要监听,而 UDP 协议不需要监听
  • ESTABLISHED:已经建立连接的状态。如果使用"-I"选项,则看不到已经建立连接的状态
  • SYN_SENT:SYN 发起包,就是主动发起连接的数据包
  • SYN_RECV:接收到主动连接的数据包
  • FIN_WAIT1:正在中断的连接
  • FIN_WAIT2:已经中断的连接,但是正在等待对方主机进行确认
  • TIME_WAIT:连接已经中断,但是套接字依然在网络中等待结束
  • CLOSED:套接字没有被使用

在这些状态中,我们最常用的就是 LISTEN 和 ESTABLISHED 状态,一种代表正在监听,另一种代表已经连接

【例 2】查看本机有哪些程序开启的端口

如果使用"-p"选项,则可以查看到是哪个程序占用了端口,并且可以知道这个程序的 PID,例如:

root@ubuntu-vm:/home/shen# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      753/systemd-resolve 
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      1017/mysqld         
tcp        0      0 127.0.0.1:41275         0.0.0.0:*               LISTEN      14051/node          
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN      1017/mysqld         
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN      2160/smbd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      799/cupsd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      799/cupsd           
tcp6       0      0 :::445                  :::*                    LISTEN      2160/smbd           
tcp6       0      0 :::139                  :::*                    LISTEN      2160/smbd           
tcp6       0      0 :::22                   :::*                    LISTEN      915/sshd: /usr/sbin 
udp        0      0 127.0.0.53:53           0.0.0.0:*                           753/systemd-resolve 
udp        0      0 192.168.1.255:137       0.0.0.0:*                           1471/nmbd           
udp        0      0 192.168.1.110:137       0.0.0.0:*                           1471/nmbd           
udp6       0      0 :::37690                :::*                                794/avahi-daemon: r 
udp6       0      0 :::5353                 :::*                                794/avahi-daemon: r   

【例 3】 查看所有连接

使用选项"-an"可以查看所有连接,包括监听状态的连接(LISTEN),已经建立连接状态的连接(ESTABLISHED)、Socke 程序连接等。因为连接较多,所以输出的内容有很多。例如:

root@ubuntu-vm:/home/shen# netstat -an | head -50
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0     21 127.0.0.1:42140         127.0.0.1:41275         ESTABLISHED
tcp        0      0 127.0.0.1:41275         127.0.0.1:42140         ESTABLISHED
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 :::445                  :::*                    LISTEN      
udp        0      0 127.0.0.53:53           0.0.0.0:*                          
udp        0      0 192.168.1.110:68        192.168.1.1:67          ESTABLISHED
udp        0      0 192.168.1.255:137       0.0.0.0:*                            
udp6       0      0 :::37690                :::*                               
udp6       0      0 :::5353                 :::*                               
raw6       0      0 :::58                   :::*                     7          
...
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ]         DGRAM                    65935    /var/lib/samba/private/msg.sock/2166
unix  2      [ ]         DGRAM                    57475    /run/user/1000/systemd/notify
unix  2      [ ACC ]     STREAM     LISTENING     57478    /run/user/1000/systemd/private
unix  2      [ ACC ]     STREAM     LISTENING     57483    /run/user/1000/bus
unix  2      [ ACC ]     STREAM     LISTENING     53161    /tmp/.X11-unix/X0
unix  2      [ ACC ]     STREAM     LISTENING     57484    /run/user/1000/gnupg/S.dirmngr
unix  2      [ ACC ]     STREAM     LISTENING     57485    /run/user/1000/gnupg/S.gpg-agent.browser
unix  2      [ ACC ]     STREAM     LISTENING     57486    /run/user/1000/gnupg/S.gpg-agent.extra
unix  2      [ ACC ]     STREAM     LISTENING     57487    /run/user/1000/gnupg/S.gpg-agent.ssh
unix  2      [ ACC ]     STREAM     LISTENING     57488    /run/user/1000/gnupg/S.gpg-agent
unix  2      [ ACC ]     STREAM     LISTENING     57489    /run/user/1000/pk-debconf-socket      
...               

从"Active UNIX domain sockets"开始,之后的内容就是 Socke 程序产生的连接,之前的内容都是网络服务产生的连接。我们可以在"-an"选项的输出中看到各种网络连接状态,而之前的"-tuln"选项则只能看到监听状态

【例4】查看所有的TCP 协议端口的连接状况以及PID进程名

root@ubuntu-vm:/home/shen# netstat -tanp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      753/systemd-resolve 
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      1017/mysqld         
tcp        0      0 127.0.0.1:41275         0.0.0.0:*               LISTEN      14051/node          
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN      1017/mysqld         
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN      2160/smbd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      799/cupsd           
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN      2160/smbd           
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      915/sshd: /usr/sbin 
tcp        0      0 127.0.0.1:42140         127.0.0.1:41275         ESTABLISHED 13996/sshd: shen@no 
tcp        0      0 127.0.0.1:41275         127.0.0.1:42140         ESTABLISHED 14112/node          
tcp        0      0 127.0.0.1:41275         127.0.0.1:42138         ESTABLISHED 14051/node          
tcp        0      0 192.168.1.110:22        192.168.1.104:11801     ESTABLISHED 13916/sshd: shen [p 
tcp        0      0 127.0.0.1:42138         127.0.0.1:41275         ESTABLISHED 13996/sshd: shen@no 
tcp6       0      0 ::1:631                 :::*                    LISTEN      799/cupsd           
tcp6       0      0 :::445                  :::*                    LISTEN      2160/smbd           
tcp6       0      0 :::139                  :::*                    LISTEN      2160/smbd           
tcp6       0      0 :::22                   :::*                    LISTEN      915/sshd: /usr/sbin 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bugcoder-9905

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值