簡介

go-sniffer 可以抓包擷取專案(MySQL、Redis、MongoDB)中的請求並解析成相應的語句,並格式化輸出。類似於在之前的文章 MySQL抓包工具:MySQL Sniffer【轉】中介紹的mysql-sniffer。而 go-sniffer 可以對更多資料庫進行抓包分析,現在來介紹在什麼情況下會使用該工具的。

使用

下載:

github 地址:https://github.com/40t/go-sniffer

安裝:

1)安裝依賴包:

Centos

  1. yum -y install libpcap-devel

Ubuntu:

  1. apt-get install libpcap-dev

另外還需要安裝golang,並且版本需要在1.10.3以上。

  1. wget https://golang.org/dl/go1.10.3.linux-amd64.tar.gz

設定好相關的環境變數。如果不想要go環境 ,則可以直接在其他地方安裝好go-sniffer之後,複製到目標伺服器上直接使用。

2)下載安裝

  1. -- 安裝好go環境的伺服器上:
  2. go get -v -u github.com/40t/go-sniffer
  3. cp -rf $(go env GOPATH)/bin/go-sniffer /usr/local/bin --安裝到設定好的go環境變數的目錄裡
  4. go-sniffer

引數說明: go-sniffer --help

  1. =======================================================================
  2. [使用說明]
  3.  
  4. go-sniffer [裝置名] [外掛名] [外掛引數(可選)]
  5.  
  6. [例子]
  7. go-sniffer en0 redis 抓取redis資料包
  8. go-sniffer en0 mysql -p 3306 抓取mysql資料包,埠3306
  9.  
  10. go-sniffer --[命令]
  11. --help 幫助資訊
  12. --env 環境變數
  13. --list 外掛列表
  14. --ver 版本資訊
  15. --dev 裝置列表
  16. [例子]
  17. go-sniffer --list 檢視可抓取的協議
  18.  
  19. =======================================================================
  20. [裝置名] : lo0 : 127.0.0.1
  21. [裝置名] : en0 : x:x:x:x:x5:x 192.168.1.3
  22. [裝置名] : utun2 : 1.1.11.1
  23. =======================================================================

語法:

  1. $ go-sniffer lo0 mysql
  2. $ go-sniffer en0 redis
  3. $ go-sniffer eth0 http -p 8080
  4. $ go-sniffer eth1 mongodb

使用場景

一 Redis :審計、發現熱點key

關於Redis的知識點就不說了,主要來說明如何使用go-sniffer來抓包分析。如果想發現哪個key的操作比較多或則是否存在熱點key,在Redis4.0之前沒有什麼好辦法(4.0之後的LFU可以檢視hotkey),只有通過統計各個客戶端發來的命令進行統計。雖然monitor可以看到某一刻的key操作,但是該命令消耗巨大,可能會造成客戶端緩衝區溢位。並且也沒有合適的外掛來進行實現。即使有的話,對Redis的效能肯定有一定的損耗,所以只有監控其網路來分析操作是對Redis服務的影響最小的。如對一個例項進行監控:

  1. go-sniffer eth0 redis -p 6379 >> out.log

對通過eth0網絡卡的客戶端訪問埠為6379的Redis服務進行抓包,並把資訊寫到檔案中。該檔案的日誌格式:

  1. tcp and port 6379 get abc
  2. get abc
  3. get abc
  4. get abc
  5. get opq
  6. get opq
  7. get opq
  8. get opq
  9. get xyz
  10. get xyz
  11. get xyz

可以看到,該檔案的資訊就是操作日誌,最後可以通過使用awk來分析,也可以把該日誌檔案寫入到資料庫的表裡進行統計分析:

  1. # grep -avEi "^#|^$|^tcp|^ INFO|^ AUTH|^ REPLCONF ACK|^ CONFIG GET" out.txt |awk '{print $1,$2}'|sort| uniq -c | sort -nr |head -n 10
  2. 5 get abc
  3. 4 get opq
  4. 3 get xyz

注意:go-sniffer也需要消耗一定的資源,大致的消耗可以看以下表格:

OPS Redis CPU sniffer CPU
1.2W 20% 30%
5.5W 80% 140%
7.5W 98% 180%

從上面看到,go-sniffer所需要的CPU資源是Redis的2倍左右。所以,在使用該工具之前,先判斷本身伺服器的資源是否夠用。

二 MySQL:審計

  1. go-sniffer eth0 mysql -p 3306 >> out.log

三 MongoDB:審計

  1. go-sniffer eth0 mongodb -p 27017 >> out.log