基於 Container 網絡共享機制的抓包實踐

背景

假設存在一個容器,提供的服務是 HTTP 或者 RPC 的服務。因爲出於簡單可維護的目的,這個容器的基礎鏡像裏面沒有帶上任何和網絡抓包相關的功能。那麼如何能搞對這樣的容器進行抓包,以分析業務上面可能存在的問題呢?git

共享網絡

Docker 的容器之間能夠經過共享網絡空間的方式,來讓多個容器實現網絡互通。這個意思直接一點就是若是你到每一個容器內部去訪問 localhost 監聽的服務,不管這個服務在哪一個容器裏面,都可以訪問成功。這就爲網絡抓包提供了基礎。github

專用鏡像

咱們能夠使用一個專用的 tcpdump 的鏡像來進行抓包。鏡像名稱爲 corfr/tcpdump:latest ,能夠使用 docker pull 直接下載。docker

$ docker pull corfr/tcpdump:latest

抓包實踐

咱們如今用一個提供簡單 HTTP 服務的鏡像來進行測試。網絡

下載測試鏡像app

$ docker pull jemygraw/echo-go:1.0

啓動測試容器tcp

$ docker run -p 8080:8080 jemygraw/echo-go:1.0 /home/app/echo-go -port 8080

查看測試容器ID測試

$ docker ps
5de30e950459        jemygraw/echo-go:1.0   "/home/app/echo-go -…"   10 minutes ago      Up 10 minutes       0.0.0.0:8080->8080/tcp   dreamy_benz

啓動抓包鏡像,注意使用 --network 參數來共享測試容器的網絡。插件

$ docker run --network container:5de30e950459  corfr/tcpdump:latest  -i any -U -w -

因爲 corfr/tcpdump:latest 鏡像構建的時候使用了 ENTRYPOINT 指定了入口命令爲 /usr/sbin/tcpdump ,因此這裏咱們指定命令的選項參數便可。code

這個時候咱們能夠嘗試訪問 http://localhost:8080/ 就可以在抓包容器的輸出中看到抓包結果了。get

真實案例

Kubernetes 的插件命令 sniff 就是使用了上面的技術來實現特權模式下經過旁觀的抓包容器共享目標容器的網絡來實現抓包的。該項目地址在:https://github.com/eldadru/ksniff ,有興趣能夠研究。

相關文章
相關標籤/搜索