基于 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 ,有兴趣能够研究。

相关文章
相关标签/搜索