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手册。