以”查看本地端口占用情况”为契机学习一下 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 连接使用协议
Recv-Q 接受队列
Send-Q 发送队列,此队列和上面接受队列一般都为0,如果不是则表示队列中有正在处理
Local Address 本地地址和端口
Foreign Address 网络地址
State 显示套接口当前状态
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 -i

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

netstat -ie

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

reference