Netstat是一个命令行实用程序,可用于列出系统上的所有网络(套接字)连接。它列出了所有tcp,udp套接字连接和unix套接字连接。

除连接的套接字外,它还可以列出正在等待传入连接的侦听套接字。因此,通过验证开放端口80,您可以确认Web服务器是否正在系统上运行。这使它成为网络和系统管理员非常有用的工具。

在本教程中,我们将查看一些如何使用netstat查找有关系统上的网络连接和开放端口的信息的示例。

这是手册页中netstat的快速介绍

netstat  - 打印网络连接,路由表,接口统计信息,伪装连接和多播成员资格

1.列出所有连接

第一个也是最简单的命令是列出所有当前连接。只需使用a选项运行netstat命令即可。

[root@instance-z78bdmwa ~]# netstat -a

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address           Foreign Address         State      

tcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN     

tcp        0      0 instance-z78bdmwa:vop   0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     

tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN     

tcp        0      0 instance-z78bdmwa:56826 203.208.41.94:https     ESTABLISHED

tcp        0      0 instance-z78bdmwa:48196 tsa01s08-in-f46.1:https ESTABLISHED


以上命令显示来自不同协议的所有连接,如tcp,udp和unix套接字。然而,这并不是很有用。管理员通常希望根据协议或端口号选择特定的连接。

2.仅列出TCP或UDP连接

要仅列出tcp连接,请使用t选项。

[root@localhost ~]# netstat -at

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address           Foreign Address         State      

tcp        0      0 0.0.0.0:mysql           0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:9110            0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN   

同样只列出udp连接使用u选项。

[root@localhost ~]# netstat -au

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address           Foreign Address         State 

udp     0     0       enlightened.local:ntp *:*  

udp.    0     0       localhost:ntp *:*

以上输出显示了ipv4和ipv6连接。

3.禁用反向dns查找以获得更快的输出

默认情况下,netstat命令尝试通过执行反向dns查找来查找连接中每个IP地址的主机名。这会减慢输出速度。如果您不需要知道主机名,只需要ip地址就足够了,那么使用n选项禁止主机名查找。

[root@localhost ~]# netstat -ant

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address           Foreign Address         State      

tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:9110            0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     

tcp        0     36 172.17.1.150:22         192.168.255.46:49650    ESTABLISHED

以上命令显示所有TCP连接,无DNS分辨率。得到它了 ?好。

4.仅列出监听连接

任何网络守护程序/服务都会保持打开端口以侦听传入连接。这些也像套接字连接,并由netstat列出。要仅查看侦听端口,请使用l选项。

[root@localhost ~]# netstat -tnl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State      

tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:9110            0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN 

现在我们只能看到监听tcp端口/连接。如果要查看所有侦听端口,请删除t选项。如果您只想查看侦听udp端口,请使用u选项而不是t。

确保删除“a”选项,否则将列出所有连接,而不仅仅是侦听连接。


5.获取进程名称/ pid和用户ID

查看打开/侦听端口和连接时,了解打开该端口或连接的进程名称/ pid通常很有用。例如,Apache httpd服务器打开端口80.因此,如果要检查是否有任何http服务器正在运行,或者正在运行哪个http服务器,apache或nginx,则跟踪进程名称。

“p”选项提供了流程详细信息。

[root@localhost ~]# netstat -nlpt

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:3306            0.0.0.0:*               LISTEN      20425/mysqld        

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4505/httpd          

tcp        0      0 0.0.0.0:9110            0.0.0.0:*               LISTEN      26911/node_exporter 

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3041/sshd  

使用p选项时,netstat必须以root权限运行,否则无法检测以root权限运行的进程的pids,并且大多数服务(如http和ftp)通常以root权限运行。

与进程名称/ pid一起,它更有用于获取用户名/ uid拥有该特定进程。使用e选项和p选项也可以获取用户名。

[root@localhost ~]# netstat -ltpe

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name    

tcp        0      0 0.0.0.0:mysql           0.0.0.0:*               LISTEN      mysql      187560     20425/mysqld        

tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN      root       27157      4505/httpd          

tcp        0      0 0.0.0.0:9110            0.0.0.0:*               LISTEN      root       1501412    26911/node_exporter 

tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      root       23176      3041/sshd   

上面的示例列出了Tcp类型的侦听连接以及进程信息和扩展信息。

扩展信息包含进程的用户名和inode。这对网络管理员来说是一个有用的命令。

注 -如果将n选项与e选项一起使用,则会列出uid而不是用户名。

6.打印统计数据

netstat命令还可以打印出网络统计信息,例如协议类型接收和发送的数据包总数等。

列出所有数据包类型的统计信息

[root@localhost ~]# netstat -s

Ip:

    18006247 total packets received

    0 forwarded

    0 incoming packets discarded

    281166 incoming packets delivered

    269906 requests sent out

Icmp:

    29 ICMP messages received

    0 input ICMP message failed.

    ICMP input histogram:

        destination unreachable: 23

        echo replies: 6

    157 ICMP messages sent

    0 ICMP messages failed

    ICMP output histogram:

        destination unreachable: 94

        echo request: 63

要打印出仅TCP或UDP等选定协议的统计信息,请使用相应的选项,如t和u以及s选项。简单!

7.显示内核路由信息

可以使用r选项打印内核路由信息。它与route命令给出的输出相同。我们还使用n选项来禁用主机名查找。

[root@localhost ~]# netstat -rn

Kernel IP routing table

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface

0.0.0.0         172.17.0.1      0.0.0.0         UG        0 0          0 eth0

172.17.0.0      0.0.0.0         255.255.240.0   U         0 0          0 eth0

8.打印网络接口

netstat命令还可以打印出有关网络接口的信息。i选项完成任务。

[root@localhost ~]# 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 115224986      0  37900 0        276644      0      0      0 BMRU

lo              65536      295      0      0 0           295      0      0      0 LRU

以上输出包含非常原始格式的信息。要获得更友好的输出版本,请使用e选项和i。

[root@localhost ~]# netstat -ie

Kernel Interface table

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 172.17.1.150  netmask 255.255.240.0  broadcast 172.17.15.255

        ether 02:00:09:3d:02:82  txqueuelen 1000  (Ethernet)

        RX packets 115236836  bytes 17450614567 (16.2 GiB)

        RX errors 0  dropped 37900  overruns 0  frame 0

        TX packets 276657  bytes 51117896 (48.7 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536

        inet 127.0.0.1  netmask 255.0.0.0

        loop  txqueuelen 1000  (Local Loopback)

        RX packets 295  bytes 38067 (37.1 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 295  bytes 38067 (37.1 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

上面的输出类似于ifconfig命令显示的输出。

9.持续获取netstat输出

Netstat可以使用c选项连续输出连接信息。

[root@localhost ~]# netstat -ct

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State      

tcp        0     36 localhost.localdoma:ssh 192.168.255.46:49650    ESTABLISHED

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State      

tcp        0      0 localhost.localdoma:ssh 192.168.255.46:49650    ESTABLISHED

Active Internet connections (w/o servers)


以上命令将连续输出tcp连接。

10.显示组播组信息

g选项将显示IPv4和IPv6协议的多播组信息。

[root@localhost ~]# netstat -g

IPv6/IPv4 Group Memberships

Interface       RefCnt Group

--------------- ------ ---------------------

lo              1      all-systems.mcast.net

eth0            1      all-systems.mcast.net

netstat命令的更多示例

好的,我们介绍了上面netstat命令的基本示例。现在是时候做一些风格的极客。

打印活动连接

活动套接字连接处于“ESTABLISHED”状态。因此,要获得所有当前活动连接,请使用netstat和grep,如下所示

[root@localhost ~]# netstat -atnp | grep ESTA

tcp        0     36 172.17.1.150:22         192.168.255.46:49650    ESTABLISHED 44575/sshd: root@pt 

要观察连续的活动连接列表,请使用watch命令以及netstat和grep

[root@localhost ~]# watch -d -n0  "netstat -atnp | grep ESTA"


Every 0.1s: netstat -atnp | grep ESTA                                                                                                                                               Fri Jul  5 22:17:25 2019


tcp        0      0 172.17.1.150:22         192.168.255.46:49650    ESTABLISHED 44575/sshd: root@pt

检查服务是否正在运行

如果要检查http,smtp或ntp等服务器是否正在运行,请再次使用grep。

[root@localhost ~]# netstat -aple | grep http

tcp        0      0 0.0.0.0:http            0.0.0.0:*               LISTEN      root       27157      4505/httpd          

unix  3      [ ]         STREAM     CONNECTED     27150    4505/httpd  

所以我们发现http服务器正在运行。grep for ntp或smtp或任何你想要的东西。

嗯,这就是netstat用于的大部分内容。如果您正在寻找更高级的信息或想深入挖掘,请阅读netstat手册。