以”查看本地端口占用情况”为契机学习一下 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