netstat 的英文单词“network statistics”,命令主要功能用于各种网络相关信息,例显示网络连接状态、路由表信息、接口状态、NAT、多播成员等信息。
参数 | 含义 |
---|---|
-n | 不解析域名, 以数字显示 |
-a | 显示所有连线中的Socket |
-t | 列出 tcp 网络封包的数据 |
-u | 列出 udp 网络封包的数据 |
-p | pid, 显示进程号 |
-l | 仅列出在监听的服务状态 |
-i | 列出网卡信息 |
-r | 列出路由表信息 |
netstat参考图
- 协议(Protocol) :表示网络连接的协议类型,例如tcp、udp等协议
- 接收队列(Recv-Q) :接收socket(套接字)队列中的数据量,以字节为单位
- 发送队列(Send-Q) :发送socket(套接字)队列中的数据量,以字节为单位
- 本地地址(Local Address):运行netstat命令的本地计算机地址
- 外部地址(Foreign Address):与本机端口通信的外部socket。
- 状态(State) :每个服务网络连接的状态
Local Address 解释:
Local Address 部分的0.0.0.0:22 表示监听服务器上所有ip地址的所有(0.0.0.0表示本地所有ip),比如你的服务器是有172.172.230.210和
172.172.230.11两个ip地址,那么0.0.0.0:22此时表示监听172.172.230.210,172.172.230.211,127.0.0.1三个地址的22端口:::22 这个也表示监听本地所有ip的22端口,跟上面的区别是这里表示的是IPv6地址,上面的0.0.0.0表示的是本地所有IPv4地址
NOTE
“:::” 这三个: 的前两个"::“,是"0:0:0:0:0:0:0:0"的缩写,相当于IPv6的"0.0.0.0”,就是本机的所有IPv6地址,第三个:是IP和端口的分隔符127.0.0.1:631 这个表示监听本机的loopback地址的631端口(如果某个服务只监听了回环地址,那么只能在本机进行访问,无法通过tcp/ip 协议进行远程访问)
::1:631 这个表示监听IPv6的回环地址的631端口,::1这个表示IPv6的loopback地址
172.172.230.211:3306 这里我们看到我们的mysqld进程监听的是172.172.230.211的3306端口,这是因为我们在启动的时候指定了bind_address=172.172.230.211参数,如果不指定bind_address的话,mysqld默认监听:::3306(本机所有ip地址的3306端口 -IPv6)
- 目标(Destination) :目标计算机的地址
- 网关(Gateway) :中间网关地址
- 网络掩码(Genmask) :网络掩码,用于指定网络中的可用主机
- 标志(Flags) :指定是哪种路由
- MSS :默认最大段的大小
- 窗口(Window) :默认窗口大小
- 初始往返时间(irtt) :发送信号并接收其确认的总时间
- 接口(lface) :数据包将通过其路由的接口
接口(Iface) :接口类型
MTU :最大传输单位
RX :接收数据包
TX :发送数据包
OK :无错误的数据包
ERR :有错误的数据包
DRP :丢包的数量
OVR :数据包由于溢出而丢失
Fig :定义接口配置的标志
$ netstat -a | head
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 localhost.locald:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp6 0 0 [::]:sunrpc [::]:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
$ netstat -anu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:875 0.0.0.0:*
udp 0 0 0.0.0.0:5353 0.0.0.0:*
udp 0 0 0.0.0.0:36816 0.0.0.0:*
udp 0 0 192.168.122.1:53 0.0.0.0:*
udp 0 0 0.0.0.0:67 0.0.0.0:*
udp 0 0 0.0.0.0:68 0.0.0.0:*
$ netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
ens32 1500 456 0 0 0 366 0 0 0 BMRU
lo 65536 4 0 0 0 4 0 0 0 LRU
virbr0 1500 0 0 0 0 0 0 0 0 BMU
$ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default gateway 0.0.0.0 UG 0 0 0 ens32
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 ens32
$ netstat -p | grep ssh
unix 3 [ ] STREAM CONNECTED 26245 1216/sshd
$ netstat -antup | grep httpd
tcp6 0 0 :::80 :::* LISTEN 322/httpd
tcp6 0 0 :::443 :::* LISTEN 322/httpd
$ netstat -s
Ip:
463 total packets received
0 forwarded
0 incoming packets discarded
220 incoming packets delivered
310 requests sent out
81 dropped because of missing route
Icmp:
2 ICMP messages received
0 input ICMP message failed.
ICMP input histogram:
destination unreachable: 2
3 ICMP messages sent
......
ss(Socket Statistics)命令主要功能是显示套接字信息。与netstat命令的使用十分的相似,都是用于显示套接字信息,而ss命令的优势在于它能够显示更多TCP和连接状态的详情信息,并且速度更快更高效。
ss的语法格式是:ss 【参数】【过滤器】
SYNOPSIS
ss [options] [ FILTER ]
命令的基本参数有以下这些,参数会比较多,当然也可以说明这个命令的用法会挺丰富的。
-n ** | 不解析域名 |
-a | 显示所有套接字 |
**-l **** | 显示处于监听状态的套接字 |
-o | 显示计时器信息 |
-e | 显示详细的套接字信息 |
-m | 显示socket的内存情况 |
-p ** | 显示使用套接字的过程 |
-i | 显示内部的TCP信息 |
-s | 显示socket使用情况 |
-4 | 显示ipv4的套接字信息 |
-6 | 显示ipv6的套接字信息 |
-0 | 显示PACKET套接字信息 |
-t ** | 显示TCP的套接字信息 |
-u | 显示UDP套接字信息 |
-d | 显示DCCP套接字信息 |
-w | 显示RAW套接字信息 |
-D | 将原始TCP套接字信息转储到文件 |
-r, --resolve | 解析IP和端口号, 解析主机名 |
Netid | 网络标识符 |
State | 每个服务的连接状态 |
Recv-Q | 接收socket(套接字)队列中的数据量,以字节为单位 |
Send-Q | 发送socket(套接字)队列中的数据量,以字节为单位 |
Local Address | 运行本地的计算机地址 |
Port | 服务端口 |
Peer Address | 对等端口 |
$ ss -l # 显示本地打开的所有端口
$ ss -pl # 显示每个进程具体打开的socket
$ ss -t -a # 显示所有tcp socket
$ ss -u -a # 显示所有的UDP Socekt
$ ss -o state established '( dport = :smtp or sport = :smtp )' # 显示所有已建立的SMTP连接
$ ss -o state established '( dport = :http or sport = :http )' # 显示所有已建立的HTTP连接
$ ss -x src /tmp/.X11-unix/* # 找出所有连接X服务器的进程
$ ss -s # 列出当前socket详细信息
默认情况,只使用ss
命令,不加任何参数的情况下,它会显示所有已建立连接的套接字列表信息
$ ss |wc -l
716
$ ss | head -n 3
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str ESTAB 0 0 * 37084 * 37928
u_str ESTAB 0 0 * 36812 * 36814
可以使用-l
参数监听所有tcp
协议的套接字内容
$ ss -lt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:smtp *:*
LISTEN 0 128 *:sunrpc *:*
LISTEN 0 5 192.168.122.1:domain *:*
LISTEN 0 128 *:ssh *:*
-n
表示不解析域名,显示的是IP+端口的格式
$ ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 5 192.168.122.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
需要使用到-p
的参数,结合-tl
是显示tcp协议的服务并且处于监听状态下的信息
$ ss -tlp |head -10
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:smtp *:* users:(("master",pid=1284,fd=13))
LISTEN 0 128 *:sunrpc *:* users:(("rpcbind",pid=704,fd=8))
可以看到在最后一列会显示进程的名称、PID、fd文件描述符等信息。
需要使用-a
参数,表示显示所有的连接信息
$ ss -a | wc -l
963
$ ss | wc -l
716
还可以在加上-t -n
参数使用
$ ss -ant
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 5 192.168.122.1:53 *:*
ESTAB 0 0 192.168.157.166:22 192.168.157.213:65011
LISTEN 0 100 [::1]:25 [::]:*
$ ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.157.166:22 192.168.157.213:65011
如显示-o
时间信息、-m
显示套接字使用的内容、-i
显示内部tcp的信息
$ ss -imo | head -2
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str ESTAB 0 0 * 37084 * 37928 skmem:(r0,rb212992,t0,tb212992,f0,w0,o0,bl0,d0)
显示使用信息需要用到-s
的参数
$ ss -s
Total: 1711 (kernel 2055)
TCP: 11 (estab 1, closed 1, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* 2055 - -
RAW 1 0 1
UDP 11 8 3
TCP 10 6 4
INET 22 14 8
FRAG 0 0 0
这里需要用到几种参数格式
分别是:
dst :过滤连接的目标地址
src: 过滤连接的本地地址
dport:目标端口
sport:来源端口
匹配远程地址和端口号
ss dst 192.168.157.33
ss dst 192.168.157.33:443
ss dst 192.168.157.33:http
匹配本地端口和端口号
ss src 192.168.157.166
ss src 192.168.157.166:22
ss src 192.168.157.166:ssh
8.1) 当然还可以将本地与远程端口和一个数进行比较
使用方法:
ss dport OP num
ss sport OP num
OP 及关系运算符:
<= | le | 小于等于 |
== | eq | 等于 |
!= | ne | 不等于 |
> | gt | 大于 |
< | lt | 小于 |
显示来源端口小于50的端口号的内容
$ ss -ntul sport lt 50
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 100 127.0.0.1:25 *:*
tcp LISTEN 0 128 *:22 *:*
tcp LISTEN 0 100 [::1]:25 [::]:*
tcp LISTEN 0 128 [::]:22 [::]:*
如果要用符号,则需要在符号前面加上转义符。
$ ss -ntul sport \< 50
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 100 127.0.0.1:25 *:*
tcp LISTEN 0 128 *:22 *:*
tcp LISTEN 0 100 [::1]:25 [::]:*
tcp LISTEN 0 128 [::]:22 [::]:*
$ ss -o state fin-wait-1 '( sport = :http or sport = :https )'
ss常用的state状态:
- established
- syn-sent
- syn-recv
- fin-wait-1
- fin-wait-2
- time-wait
- closed
- close-wait
- last-ack
- listen
- closing
- all : All of the above states
- connected : All the states except for listen and closed
- synchronized : All the connected states except for syn-sent
- bucket : Show states, which are maintained as minisockets, i.e. time-wait and syn-recv.
- big : Opposite to bucket state.
主动连接端可能的状态有: CLOSED SYN_SEND ESTABLISHED
主动关闭端可能的状态有: FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT
被动连接端可能的状态有: LISTEN SYN_RECV ESTABLISHED
被动关闭端可能的状态有: CLOSE_WAIT LAST_ACK CLOSED
ss 执行的时候消耗资源以及消耗的时间都比 netstat 少很多。
ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比 netstat 更快速更高效。原因如下:
- 当服务器的
socket
连接数量变得非常大时,无论是使用netstat
命令还是直接cat /proc/net/tcp
,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费生命,而用ss才是节省时间。- 而
ss
快的秘诀在于它利用到了TCP
协议栈中tcp_diag
。tcp_diag
是一个用于分析统计的模块,可以获得Linux
内核中第一手的信息,这就确保了ss
的快捷高效。当然,如果你的系统中没有tcp_diag
,ss也可以正常运行,只是效率会变得稍慢(但仍然比netstat
要快)。
nc命令的主要作用如下:
参数 | 含义 |
---|---|
-p<通信端口> | 设置本地主机使用的通信端口 |
-l | 监听模式 |
-u | 使用UDP传输(tcp 不带参数, 默认) |
-v | 显示指令执行过程 |
-w<超时秒数> | 设置连接超时时间 |
-z | 使用0输入/输出模式,只在扫描通信端口时使用 |
$ nc -v -z -w 1 192.168.254.130 20-23
192.168.0.3: inverse host lookup failed: Unknown host
nc: connect to 192.168.254.130 port 20 (tcp) failed: Connection refused
nc: connect to 192.168.254.130 port 21 (tcp) failed: Connection refused
Connection to 192.168.254.130 22 port [tcp/ssh] succeeded!
nc: connect to 192.168.254.130 port 23 (tcp) failed: Connection refused
扫描 192.168.254.130 的端口, 范围是 20-23, -w 1
1 秒超时, v
详细输出
$ nc -u -z -w2 192.168.254.130 20-23
$ nc -nvv 192.168.254.130 80 # 扫描 80 端口
nc: connect to 192.168.254.130 port 80 (tcp) failed: Connection refused
$ nc -nvv 192.168.254.130 2 # 扫描 22 端口
Connection to 192.168.254.130 22 port [tcp/*] succeeded!
SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.11
Invalid SSH identification string.
服务端监听服务, 客户端请求 (服务端 <== 请求 ==> 客户端)
参考:
- https://blog.csdn.net/rhn_111/article/details/129444051?spm=1001.2014.3001.5502
- https://blog.csdn.net/mr_wanter/article/details/125076995?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170626215816800186510143%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=170626215816800186510143&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-125076995-null-null.142
- https://blog.csdn.net/rhn_111/article/details/129166218
- https://www.runoob.com/linux/linux-comm-netstat.html
- https://www.runoob.com/linux/linux-comm-nc.html
- https://blog.csdn.net/jiajiren11/article/details/80887528