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:打開文件的確切名稱

幾個常用操作

  1. 使用 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)
  1. 使用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)
  1. 使用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+,這里列舉一些最重要的。

返回目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM