在Linux上使用netstat命令的用法
学习什么是netstat命令以及一些实时示例。
netstat
(网络统计)是一个命令行工具,用于显示网络连接(包括传入和传出连接),路由表和各种网络接口统计数据。
它适用于Linux,类Unix和操作系统 Windows。 netstat
功能强大,是一个很方便的工具,可以用于故障排除与网络相关的问题并验证连接统计。
如果输入 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。