按照慣例先談談最近情況,最近不是剛好跨年嗎?看到很多人都在寫年度總結,所以我也在寫年度總結文章(其實之前我基本沒有寫過的,今年有點感觸,也想記錄一下),結果發現寫起來有點多,之前還想著元旦前發出來,結果元旦過後,今天我也還在寫,而且還寫不完,不過也差不多了,預計明天會發出來。然後最近需求比較多,工作比較忙,同時遇到了乙個比較麻煩的需求,就想著記錄一下,先充當一下這週的文章任務?。最近,我在公司做這樣的乙個事情,整理老舊的api服務,需要統計介面的每個請求的ip和請求引數,找出對應的呼叫的ip,以便通知業務方修改為新的api服務。其中我們的這個api服務呼叫有分為thrift呼叫和http呼叫,由於之前的舊的服務設計比較簡陋,沒有通過dubbo 等註冊中心呼叫,也沒有完整的監控(不要問我為什麼沒有,我也很無奈?),導致我想找出呼叫ip也找不到,日誌裡面沒有記錄。
方法一,直接修改業務**
剛開始我們是想修改原業務**,加上呼叫ip和請求引數的日誌列印的。原本以為不會有什麼問題,但是我們準備開始動手改造的時候,發現http協議提供的介面,比較好改造,直接 httprequest 可以獲取到客戶端ip ,請求引數也很好列印。接著我們打算動手也修改一下thrift 介面的那部分,原本以為都是介面,估計thrift框架也會提供對應的方式獲取(我們使用的原生的apche thrift 框架來提供服務),於是網上找了一下,發現thrift 介面好像並 http 介面那麼好改造,網上說需要加個監聽類,監聽請求,類似以下情況:
/**
* 呼叫rpc服務的時候觸發
* 每呼叫一次方法,就會觸發一次
*/public
void
processcontext
(servercontext servercontext, ttransport inputtransport, ttransport outputtransport)
但是,我們實際操作的時候,建了這個監聽類,起了自己的本地服務,並用單元測試去測試的時候,發現報了以下這樣的乙個錯誤。
org.apache.thrift.transport.tframedtransport cannot be cast to org.apache.thrift.transport.tsocket
說tframedtransport 不能轉成 tsocket 這個類 ,估計是例項類跟要強轉的類不一致。
一開始,還以為自己的寫錯了,對著網上的部落格檢查了以下沒有問題。只是發現這個實際例項化出來的類不是 tsocket 型別。試了幾次後,發現還是不行,於是有根據這個錯誤在網上找了一下,tframedtransport 獲取 ip(參考這個錯誤描述: 。這才發現,我們的thrift介面提供方式跟網上說的不一樣,而我們這種情況,如果需要獲取client ip ,有這幾種方式:1. 修改thrift 框架原始碼, 2. 重新繼承tframedtransport類重寫裡面的乙個方法。
看到這兩種方法,我們一下子就放棄了,原本想著只是簡單加個監控,沒想著修改太多東西,如果為了見這樣乙個監控,改動那麼大的,害怕影響業務(我們這個api服務還是挺多業務方在使用的)。
方法二,網路抓包
於是,我們考慮起第二種方案,使用抓包去列印出客戶端ip和請求引數。tcpdump
是一開始就會想到的工具,當用 tcpdump 去抓包的時候,發現 thrift 介面有些是亂碼的。接著就網上找一下是否thrift介面的監控工具,一圈下來,說 thrift-tool ,wireshark(tshark)可以使用,然後又去試了,安裝了挺久的,發現由於我們機器的ubuntu的版本太久了,安裝不了最新的 thrift-tool (這個是安裝之後,還要依賴tcpdump的版本,tcpdump版本太老也不行,tcpdump命令重灌也重灌了很久?,最後發現也安裝不了指定版本)和 wireshark ,發現都沒有辦法使用這兩種工具。考慮到我們這個api服務都部署在很多老的物理機上面,考慮相容性問題和可以方便在其他機器上也部署(我們這個api服務分別部署在10多台的物理機上)。
如果太舊的tshark 版本捕捉thrift協議的介面的時候,執行於是又重新考慮回tcpdump 命令了兜兜轉轉一圈又回到原點, tcpdump ?逼。簡單實驗了一下,抓包的出的thrift請求引數和響應結構,如果是英文的,大部分還是能正常顯示的,可以根據 判斷是否包含 介面請求引數英文關鍵字 和判斷目標ip和埠,獲取到對應的請求引數和的請求ip。如果傳送的引數為英文tcpdump直接抓包是能顯示大部分引數的,需要完整的引數資訊也可以通過直接在業務**中加監控,thrift 介面在**中監控傳送請求引數還是挺簡單的,主要是獲取請求ip有點麻煩。sudo tshark -r 'thrift'
的時候就會報這個錯誤tshark: "thrift" is neither a field nor a protocol name
,需要公升級tshark的版本
大概命令是這樣的(這裡假設read為請求引數關鍵字)
tcpdump -i any -a -s 0 'tcp port 9521' | grep -e "read|> [0-9\.]+9521"
這樣就可以獲取到 thrift 介面請求到的 9521 埠 的訪問ip和請求引數,不過列印出來的日誌,還需要自己的去處理一下的。基本上的請求引數的上一行就是該請求的ip。
這篇文章主要介紹了解決獲取 thrift介面 的請求引數和客戶端請求 ip 的問題。算作記錄一下自己的解決問題的流程。其中順便了解一下抓包工具 wireshark 的使用,之前一直有聽說過這個軟體,但是一直沒有實際使用過,感覺的確好用。 另外算作也提醒自己在搭建api服務的時候,記得做好每次介面呼叫ip和請求ip的監控,不然後面接手的人查起來真的想崩潰,例如:我?。
wireshark 過濾可以通過tcp and ip.addr == 127.0.0.1 and thrift
命令設定在 dispaly filter 來獲取目標的請求, thrift 表示協議,不過如果wireshark 版本太低的話,可以識別不了這個協議。
wireshark 的命令列版本為: tshark
wireshark 的幫助文件位址 ,wireshark 的capturefilters(捕捉前過濾) 和displayfilters(捕捉後篩選) 區別
sudo tshark -s 512 -i eth0 -n -f 'tcp dst port 9521' -l
tshark 的命令,捕捉tcp 的請求的,參考:
談談HTTPS安全認證,抓包與反抓包策略
協議是指計算機通訊網路中兩台計算機之間進行通訊所必須共同遵守的規定或規則,超文字傳輸協議 http 是一種通訊協議,它允許將超文字標記語言 html 文件從web伺服器傳送到客戶端的瀏覽器。http協議,即超文字傳輸協議是一種詳細規定了瀏覽器和全球資訊網伺服器之間互相通訊的規則,通過網際網路傳送全球...
C 網路抓包
以前一直都是知道用winpcap的,現在網上搜了一下,有用c 封裝好了的,很好用 下面是其中的幾個用法 這個類庫作者的主頁 pcapopen 有下面幾個方法 pcapopen pcapopen bool promiscuous mode pcapopen bool promiscuous mode,...
OTT 網路抓包
有些時候,我們為了更好分析ott盒子的網路行為,我們需要對其進行抓包。一般情況下有兩種狀況。該盒子我們有root許可權,可以通過adb登陸到盒子中 該盒子我們無法登入 在這兩種情況下,我們可以分別用不同的方式來完成網路抓包 這種情況下,我們一般是通過盒子的內部命令tcpdump進行抓包分析 cd m...