簡介
go-sniffer 可以抓包擷取專案(MySQL、Redis、MongoDB)中的請求並解析成相應的語句,並格式化輸出。類似於在之前的文章 MySQL抓包工具:MySQL Sniffer【轉】中介紹的mysql-sniffer。而 go-sniffer 可以對更多資料庫進行抓包分析,現在來介紹在什麼情況下會使用該工具的。
使用
下載:
github 地址:https://github.com/40t/go-sniffer
安裝:
1)安裝依賴包:
Centos:
- yum -y install libpcap-devel
Ubuntu:
- apt-get install libpcap-dev
另外還需要安裝golang,並且版本需要在1.10.3以上。
- wget https://golang.org/dl/go1.10.3.linux-amd64.tar.gz
設定好相關的環境變數。如果不想要go環境 ,則可以直接在其他地方安裝好go-sniffer之後,複製到目標伺服器上直接使用。
2)下載安裝
- -- 安裝好go環境的伺服器上:
- go get -v -u github.com/40t/go-sniffer
- cp -rf $(go env GOPATH)/bin/go-sniffer /usr/local/bin --安裝到設定好的go環境變數的目錄裡
- go-sniffer
引數說明: go-sniffer --help
- =======================================================================
- [使用說明]
- go-sniffer [裝置名] [外掛名] [外掛引數(可選)]
- [例子]
- go-sniffer en0 redis 抓取redis資料包
- go-sniffer en0 mysql -p 3306 抓取mysql資料包,埠3306
- go-sniffer --[命令]
- --help 幫助資訊
- --env 環境變數
- --list 外掛列表
- --ver 版本資訊
- --dev 裝置列表
- [例子]
- go-sniffer --list 檢視可抓取的協議
- =======================================================================
- [裝置名] : lo0 : 127.0.0.1
- [裝置名] : en0 : x:x:x:x:x5:x 192.168.1.3
- [裝置名] : utun2 : 1.1.11.1
- =======================================================================
語法:
- $ go-sniffer lo0 mysql
- $ go-sniffer en0 redis
- $ go-sniffer eth0 http -p 8080
- $ go-sniffer eth1 mongodb
使用場景
一 Redis :審計、發現熱點key
關於Redis的知識點就不說了,主要來說明如何使用go-sniffer來抓包分析。如果想發現哪個key的操作比較多或則是否存在熱點key,在Redis4.0之前沒有什麼好辦法(4.0之後的LFU可以檢視hotkey),只有通過統計各個客戶端發來的命令進行統計。雖然monitor可以看到某一刻的key操作,但是該命令消耗巨大,可能會造成客戶端緩衝區溢位。並且也沒有合適的外掛來進行實現。即使有的話,對Redis的效能肯定有一定的損耗,所以只有監控其網路來分析操作是對Redis服務的影響最小的。如對一個例項進行監控:
- go-sniffer eth0 redis -p 6379 >> out.log
對通過eth0網絡卡的客戶端訪問埠為6379的Redis服務進行抓包,並把資訊寫到檔案中。該檔案的日誌格式:
- tcp and port 6379 get abc
- get abc
- get abc
- get abc
- get opq
- get opq
- get opq
- get opq
- get xyz
- get xyz
- get xyz
可以看到,該檔案的資訊就是操作日誌,最後可以通過使用awk來分析,也可以把該日誌檔案寫入到資料庫的表裡進行統計分析:
- # grep -avEi "^#|^$|^tcp|^ INFO|^ AUTH|^ REPLCONF ACK|^ CONFIG GET" out.txt |awk '{print $1,$2}'|sort| uniq -c | sort -nr |head -n 10
- 5 get abc
- 4 get opq
- 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:審計
- go-sniffer eth0 mysql -p 3306 >> out.log
三 MongoDB:審計
- go-sniffer eth0 mongodb -p 27017 >> out.log