docker容器內的網絡抓包

當docker容器的網絡模式不是--net=host(若是啓動容器的時候使用host模式,那麼這個容器將不會得到一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出本身的網卡,配置本身的IP等,而是使用宿主機的IP和端口)時,容器和宿主機的網絡互相獨立,而容器通常也不會有安裝tcpdump。所以,沒法直接抓取容器內的包。linux

有兩種方式來對容器進行抓包:
在docker容器內安裝tcpdump工具來直接抓包;使用宿主機上的tcpdump工具對容器進程抓包。git

1,在docker容器內安裝tcpdump工具來直接抓包

  • 獲取docker id

    docker ps | grep xxxgithub

  • copy tcpdump安裝包和依賴包到容器內

    docker cp libpcap0-0.9.8-50.10.1.x86_64.rpm container_id:/tmp/
    docker cp tcpdump-3.9.8-1.21.x86_64.rpm container_id:/tmp/docker

  • 進入容器 安裝tcpdump後進行抓包

    docker exec -it -u root container_id bash
    rpm -ivh *.rpmbash

也可直接使用這個tcpdump文件(已編譯好 免安裝 可直接使用)
docker cp /file/to/path/tcpdump container_id:/tmp/
sh /tmp/tcpdump -i any -s 0 host x.x.x.x網絡

2,使用宿主機上的tcpdump工具對容器進程抓包

若是宿主機上已安裝了tcpdump抓包工具,那咱們就能夠經過宿主機上的nsenter工具來對docker容器進行抓包。tcp

nsenter 包含在絕大部分 Linux 發行版預置的 util-linux 工具包中。使用它能夠進入指定進程的關聯命名空間。包括文件命名空間(mount namespace)、主機名命名空間(UTS namespace)、IPC 命名空間(IPC namespace)、網絡命名空間(network namespace)、進程命名空間(pid namespace)和用戶命名空間(user namespace)。工具

what is nsenter ?spa

It is a small tool allowing to enter into namespaces. Technically, it can enter existing namespaces, or spawn a process into a new set of namespaces. "What are those namespaces you're blabbering about?" We are talking about container namespaces.code

nsenter can do many useful things, but the main reason why I'm so excited about it is because it lets you enter into a Docker container.

圖片描述
如何使用nsenter來抓包呢?

  • 獲取容器進程id,即PID
    docker ps | grep xxx 獲取容器id/name
    docker inspect --format "{{.State.Pid}}" container_id/name 獲取PID
  • 使用nsenter切換網絡命名空間
    nsenter -n -t container_id/name
    可在切換先後執行ifconfig來對比變化

如今就已進入容器的網絡命名空間,就能夠使用宿主機上的tcpdump來對容器進行抓包了

相關文章
相關標籤/搜索