以”查看本地端口占用情况”为契机学习一下 netstat 命令。在 man netstat 中的介绍,netstat 可以打印网络连接,路由表,接口信息,masquerade 连接,多播信息的工具。

netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships

简单使用

直接运行以下命令可以打印出当前系统上所有开放的端口(包括 TCP,UDP 端口),进程等等信息

sudo netstat -tupln
  • -l will list listening ports 列出所有在监听的服务端口
  • -p will display the process
  • -n will show port numbers instead of names 尽量显示数字
  • -t to show TCP ports
  • -u will show UDP ports

其他常用参数

  • -a 显示当前所有连接
  • -r 显示路由信息
  • -e 显示扩展信息
  • -s 按照各个协议进行统计

输出结果中,各个字段的含义

字段 含义
Proto 连接使用协议,主要有 TCP 和 UDP,TCP 用来可靠传输,一般用来传输网页,下载文件,而 UDP 在可能丢包的情况下提高了速度,通常用在速度优先的游戏或者直播中
Recv-Q 接受队列,等待读取的数据包队列
Send-Q 发送队列,此队列和上面接受队列一般都为 0,如果不是则表示队列中有正在处理
Local Address 本地地址和端口,显示连接的 host 和 ports
Foreign Address 网络地址
State 显示套接口当前状态,TCP 协议定义的状态包括,LISTEN,等待外部电脑连接我们,ESTABLISHED 已经建立通信
PID/Program 当前网络的 PID 和进程名字

返回中的状态说明:

  • LISTEN:侦听来自远方的 TCP 端口的连接请求
  • SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了)
  • SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被 flood 攻击了)
  • ESTABLISHED:代表一个打开的连接
  • FIN-WAIT-1:等待远程 TCP 连接中断请求,或先前的连接中断请求的确认
  • FIN-WAIT-2:从远程 TCP 等待连接中断请求
  • CLOSE-WAIT:等待从本地用户发来的连接中断请求
  • CLOSING:等待远程 TCP 对连接中断的确认
  • LAST-ACK:等待原来的发向远程 TCP 的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击)
  • TIME-WAIT:等待足够的时间以确保远程 TCP 接收到连接中断请求的确认
  • CLOSED:没有任何连接状态

常用组合

列出所有端口,包括监听的和未监听

-a 选项会列出所有连接

netstat -a

列出所有 tcp 端口

netstat -at

列出 udp 端口

netstat -au

列出处于监听状态的 Sockets

网络服务的后台进程都会打开一个端口,用于监听请求,使用 -l 参数列出正在监听的网络端口

netstat -l

-l 只会显示监听的端口,不会显示连接

只列出所有监听 TCP 的端口

netstat -lt

同理,只监听 UDP 的端口

netstat -lu

显示进程信息

-p 选项会打印出进程的名字

sudo netstat -p

需要注意 -p 选项使用 root 运行,大部分网络服务都需要 root 运行

持续输出 netstat 信息

netstat -c

禁止反向域名解析

-n 选项禁用域名反向解析,打印的结果中将只会有 IP 地址

netstat -ant

打印出路由表

除了打印基本的网络信息,netstat 也可以打印路由表

netstat -r

输出结果演示:

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         10.235.155.1    0.0.0.0         UG        0 0          0 eth0
10.0.85.0       *               255.255.255.0   U         0 0          0 outline-tun0
10.235.155.0    *               255.255.255.0   U         0 0          0 eth0
172.17.0.0      *               255.255.0.0     U         0 0          0 docker0
172.18.0.0      *               255.255.0.0     U         0 0          0 br-bcb55debff13

解释:

  • Destination 列,表示网络包传输的目的地网络地址,最后一位 0,表示任何匹配的地址,比如 10.0.85.0 则匹配 10.0.85.100,也能匹配 10.0.85.101,但是不能匹配 10.0.86.10 。 default 表示的是 0.0.0.0,匹配任何地址
  • Gateway 列表示当匹配第一列之后将数据包传送给谁,如果是 *(asterisk) 则表示 send locally 发送给本机
  • Genmask 列,表示子网
  • Flags 列,表示哪一个 flags 应用到当前表,”U“ 表示 Up,当前激活,如果是 G 则表示当前行作为 Gateway
  • MSS 列表示,Maximum Segment Size,MSS 是 TCP 的参数,用来切分网络包。但是如今大部分计算机已经对处理这些包没有任何问题,所以这一列通常是 0,表示 ”no changes“
  • Window 列,TCP 参数
  • irtt 列,表示 Initial Round Trip Time
  • Iface 列,显示匹配之后发送到哪一个网络接口

打印网络接口

netstat -i

如果需要更加详细的信息可以添加 -e

netstat -ie

那么此刻打印的内容就和 ifconfig 一样了

如果网络遇到异常,可以每秒打印一次

netstat -ic

查看建立的连接

netstat -nap | grep 2181 | grep ESTABLISHED | awk -F 'ESTABLISHED ' '{print $2}'  | awk -F '/' '{print $1}' | sort | uniq -c

查看端口

netstat -an|grep '10.108' |awk '$5~":6.."' |grep ESTABLISHED |awk '{print $5}' |sort |uniq -c |sort -n

reference