MacOS下netstat和lsof使用的若干问题
[-= 博客目录 =-]
1-相关说明
1.1-博客介绍
本篇博客主要介绍的是在Mac环境下使用netstat和lsof以及的其作用。
1.2-netstat和lsof
Netstat
Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。
lsof
lsof(list open files)是一个列出当前系统打开文件的工具。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
2-学习过程
2.1-netstat
我们运行常用指令netstat -a,会出现如下信息:
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 localhost.53617 tg-in-f138.1e100.https SYN_SENT
tcp4 0 0 localhost.53616 tg-in-f138.1e100.https SYN_SENT
tcp4 0 0 localhost.53615 tg-in-f101.1e100.https SYN_SENT
可知netstat就是用来显示我们机子的网络状态的,下面介绍的是如何通过参数来打印出我们想要的结果:
首先介绍一下各个参数:
-a (all)显示所有选项,默认不显示LISTEN相关
-n 拒绝显示别名,能显示数字的全部转化成数字。
-b show the number of bytes in and out
-s 按各个协议进行统计
-w wait(s) 每隔一定秒数来进行显示
更加详细的信息参考man netstat,这里不一一列举(主要是太麻烦了,懒得写)
提示:LISTEN和LISTENING的状态要加-a才能看到
提示:Mac和Linux的指令有所出入,切记不要拿Linux的指令在Mac中用
举个例子:
列出所有 tcp/udp 端口 netstat -f address_family
,这个比较常用,我们平常上网所需要的用到的基本都会通过这俩端口:
Active Internet connections
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 172.30.3.1.56841 ti-in-f102.1e100.https SYN_SENT
tcp4 0 0 172.30.3.1.56840 ti-in-f102.1e100.https SYN_SENT
tcp4 0 0 172.30.3.1.56839 hkg07s24-in-f10..https SYN_SENT
tcp4 0 0 172.30.3.1.56838 ti-in-f113.1e100.https SYN_SENT
udp4 0 0 *.65444 *.*
udp4 0 0 *.52623 *.*
udp4 0 0 *.59390 *.*
udp4 0 0 *.63755 *.*
关于-f后面的address_family如何输入在man里面有写到:
-f address_family
Limit statistics or address control block reports to those of the specified address family. The
following address families are recognized: inet, for AF_INET, inet6, for AF_INET6 and unix, for
AF_UNIX.
这里再科普一下状态:
-
LISTEN:(Listening for a connection.)侦听来自远方的TCP端口的连接请求
-
SYN-SENT:(Active; sent SYN. Waiting for a matching connection request after having sent a connection request.)再发送连接请求后等待匹配的连接请求
-
SYN-RECEIVED:(Sent and received SYN. Waiting for a confirming connection request acknowledgment after having both received and sent connection requests.)再收到和发送一个连接请求后等待对方对连接请求的确认
-
ESTABLISHED:(Connection established.)代表一个打开的连接
-
FIN-WAIT-1:(Closed; sent FIN.)等待远程TCP连接中断请求,或先前的连接中断请求的确认
-
FIN-WAIT-2:(Closed; FIN is acknowledged; awaiting FIN.)从远程TCP等待连接中断请求
-
CLOSE-WAIT:(Received FIN; waiting to receive CLOSE.)等待从本地用户发来的连接中断请求
-
CLOSING:(Closed; exchanged FIN; waiting for FIN.)等待远程TCP对连接中断的确认
-
LAST-ACK:(Received FIN and CLOSE; waiting for FIN ACK.)等待原来的发向远程TCP的连接中断请求的确认
-
TIME-WAIT:(In 2 MSL (twice the maximum segment length) quiet wait after close. )等待足够的时间以确保远程TCP接收到连接中断请求的确认
-
CLOSED:(Connection is closed.)没有任何连接状态
2.2-lsof
我们直接执行lsof
命令,会生成如下信息:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
……(略)
Atom 65310 mac 19u KQUEUE count=0, state=0xa
Atom 65310 mac 20 NPOLICY
Atom 65310 mac 21 PIPE 0x929a75eee67536e9 16384 ->0x929a75eee67528a9
Atom 65310 mac 22 PIPE 0x929a75eee67528a9 16384 ->0x929a75eee67536e9
Atom 65310 mac 23 PIPE 0x929a75eee67527e9 16384 ->0x929a75eee6752669
Atom 65310 mac 24 PIPE 0x929a75eee6752669 16384 ->0x929a75eee67527e9
Atom 65310 mac 25 PIPE 0x929a75eee6753c29 16384 ->0x929a75eee6750fe9
Atom 65310 mac 26 PIPE 0x929a75eee6750fe9 16384 ->0x929a75eee6753c29
Atom 65310 mac 27u KQUEUE count=0, state=0x8
在这里对每个字段进行一下介绍:
- COMMAND:进程的名称
- PID:进程标识符
- USER:进程所有者
- FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
- TYPE:文件类型,如DIR、REG等
- DEVICE:指定磁盘的名称
- SIZE:文件的大小
- NODE:索引节点(文件在磁盘上的标识)
- NAME:打开文件的确切名称
几个常用操作
- 使用
lsof -i :[端口号]
查看某端口现在运行的情况:
blackay-MacBook-Air:~ mac$ lsof -i:443
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 24659 mac 38u IPv4 0x929a75eee50611b1 0t0 TCP 172.30.3.1:60430->ec2-50-16-240-181.compute-1.amazonaws.com:https (ESTABLISHED)
node 33752 mac 38u IPv4 0x929a75eee74831b1 0t0 TCP 192.168.43.135:55147->ec2-50-17-234-140.compute-1.amazonaws.com:https (ESTABLISHED)
node 40504 mac 23u IPv4 0x929a75eeed976ef1 0t0 TCP 172.30.3.1:62175->ec2-50-19-252-69.compute-1.amazonaws.com:https (ESTABLISHED)
node 40504 mac 36u IPv4 0x929a75eee94fa851 0t0 TCP 172.30.3.1:62180->ec2-50-19-252-69.compute-1.amazonaws.com:https (ESTABLISHED)
node 41729 mac 30u IPv4 0x929a75eeead5eb11 0t0 TCP 192.168.43.135:64612->ec2-50-16-232-79.compute-1.amazonaws.com:https (ESTABLISHED)
Google 48559 mac 19u IPv4 0x929a75eee9c25b11 0t0 TCP 172.30.3.1:56594->ti-in-f100.1e100.net:https (SYN_SENT)
Google 48559 mac 81u IPv4 0x929a75eee9d87b11 0t0 TCP 172.30.3.1:56598->ti-in-f113.1e100.net:https (SYN_SENT)
- 使用
sudo lsof -nP -iTCP -sTCP:LISTEN
查看占用端口的程序
MacBook-Air:~ mac$ sudo lsof -nP -iTCP -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
QQMacMgrM 600 mac 3u IPv4 0x929a75eee5126851 0t0 TCP 127.0.0.1:50154 (LISTEN)
QQMacMgrM 600 mac 10u IPv4 0x929a75eee5568851 0t0 TCP 127.0.0.1:30100 (LISTEN)
QQMacMgrM 600 mac 32u IPv4 0x929a75eee5568851 0t0 TCP 127.0.0.1:30100 (LISTEN)
Adobe\x20 663 mac 8u IPv4 0x929a75eee5799591 0t0 TCP 127.0.0.1:15292 (LISTEN)
- 使用
lsof -p [pid]
搜索被程序打开的所有文件及打开的文件相关联进程
MacBook-Air:~ mac$ lsof -p 59037
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
QQ 59037 mac cwd DIR 1,4 384 915270 /Users/mac/Library/Containers/com.tencent.qq/Data
QQ 59037 mac txt REG 1,4 39443376 8594340462 /Applications/QQ.app/Contents/MacOS/QQ
QQ 59037 mac txt REG 1,4 585744 8594339489 /Applications/QQ.app/Contents/Frameworks/FTMiniNN.framework/Versions/A/FTMiniNN
QQ 59037 mac txt RE
PS:PID(Process Identification)操作系统里指进程识别号,也就是进程标识符。操作系统里每打开一个程序都会创建一个进程ID,即PID。只要运行一程序,系统会自动分配一个标识。暂时唯一:进程中止后,这个号码就会被回收,并可能被分配给另一个新进程。
只要没有成功运行其他程序,这个PID会继续分配给当前要运行的程序。
如果成功运行一个程序,然后再运行别的程序时,系统会自动分配另一个PID。
2.3-netstat和lsof区别和关联
netstat无权限控制,lsof有权限控制,只能看到本用户
losf能看到pid和用户,可以找到哪个进程占用了这个端口
有人也许会觉得这俩好像挺多功能都差不多呀?仔细想想发现他们区别还是挺大的,甚至有些功能还是互补的,结合起来使用简直无敌。我使用lsof最主要的原因就是:在使用了netstat查询到网络链接状态的时候,没有显示端口使用程序的名称以及其相关信息,所以我们通过lsof来弥补这个缺陷。
具体怎么操作呢?比如我通过netstat查到有个链接使用了55147端口:
Proto Recv-Q Send-Q Local Address Foreign Address
tcp4 0 0 192.168.43.135.55147 50.17.234.140.443
那么我要查找55147端口,是程序用了这个端口,那么可以用到lsof指令:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 24659 mac 38u IPv4 0x929a75eee50611b1 0t0 TCP 172.30.3.1:60430->ec2-50-16-240-181.compute-1.amazonaws.com:https (ESTABLISHED)
找到了这个程序,知道了它的PID,我甚至能查看他动了我什么文件:lsof -p [PID]
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 24659 mac cwd DIR 1,4 1120 2 /
node 24659 mac txt REG 1,4 30482564 8597437279 /Applications/Atom.app/Contents/Resources/app/apm/bin/node
node 24659 mac txt REG 1,4 1112560 8597441970 /Applications/Atom.app/Contents/Resources/app/apm/node_modules/git-utils/build/Release/git.node
那么问题来了,这样做有什么意义……意义就是我本来就是想通过网络监控来进行分析电脑是否有恶意代码或者程序运行,通过使用这两个命令,我将会精准的确定到每个可疑链接的所有状态。
3-参考资料
参考的博客超过30+,这里列举一些最重要的。