在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询。
netstat的参数
netstat命令各个参数说明如下:
netstat输出内容
以查看当前所有tcp/udp端口为例:
对上述返回内容进一步解释如下:
# Proto,Recv-Q,Send-Q
Proto:协议名(tcp协议还是udp协议)
recv-Q: 网络接收队列
表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv() 如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击。
send-Q: 网路发送队列 对方没有收到的数据或者说没有Ack的,还是本地缓冲区. 如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快。
这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况。
从步骤一的结果中可以看到22端口对应的链路的 send-Q中堆积了大量的数据包 ,可以判定是发送数据给目的地址的时候出现了阻塞的问题,导致了包堆积在本地缓存中,不能成功发出去。
# 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.xxx,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.xxx:3306 这里我们看到我们的mysqld进程监听的是172.172.230.xxx的3306端口,这是因为我们在启动的时候指定了bind_address=172.172.230.xxx参数,如果不指定bind_address的话,mysqld默认监听:::3306(本机所有ip地址的3306端口 -IPv6)
# Foreign Address
与本机端口通信的外部socket。显示规则与Local Address相同
# State
共有11种链路状态 + Unknown,共计12种state值,前面11种是按照TCP连接建立的三次握手和TCP连接断开的四次挥手过程来描述的。
备注
- SYN: (同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。
- ACK: (确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。
- FIN: (结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。
# PID/Program
PID即进程id,Program即使用该socket的应用程序
# 常用的一些命令
netstat -t/-u/-l/-r/-n【显示网络相关信息,-t:TCP协议,-u:UDP协议,-l:监听,-r:路由,-n:显示IP地址和端口号】
注:以下返回内容中,我用xxx注释掉了一部分敏感ip地址。
# 显示协议统计信息和TCP/IP网络连接
注:删减了部分结果
查看本机监听的端口
查看本机路由表
列出所有端口
列出所有的TCP端口
列出所有的UDP端口
列出所有监听TCP端口的socket
列出所有监听UDP端口的socket
找出程序运行的端口
几个有用查找
1.查找请求数前20个IP(常用于查找攻来源):
2.查找较多time_wait连接:
3.找查较多的SYN连接
4.根据端口列进程