资讯专栏INFORMATION COLUMN

docker容器内的网络抓包

layman / 1273人阅读

摘要:有两种方式来对容器进行抓包在容器内安装工具来直接抓包使用宿主机上的工具对容器进程抓包。包括文件命名空间主机名命名空间命名空间网络命名空间进程命名空间和用户命名空间。

当docker容器的网络模式不是--net=host(如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口)时,容器和宿主机的网络互相独立,而容器一般也不会有安装tcpdump。因此,无法直接抓取容器内的包。

有两种方式来对容器进行抓包:
在docker容器内安装tcpdump工具来直接抓包;使用宿主机上的tcpdump工具对容器进程抓包。

1,在docker容器内安装tcpdump工具来直接抓包

获取docker id

docker ps | grep xxx

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/

进入容器 安装tcpdump后进行抓包

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

也可直接使用这个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容器进行抓包。

nsenter 包含在绝大部分 Linux 发行版预置的 util-linux 工具包中。使用它可以进入指定进程的关联命名空间。包括文件命名空间(mount namespace)、主机名命名空间(UTS namespace)、IPC 命名空间(IPC namespace)、网络命名空间(network namespace)、进程命名空间(pid namespace)和用户命名空间(user namespace)。

what is nsenter ?

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.

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来对容器进行抓包了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27620.html

相关文章

  • 基于 Container 网络共享机制的抓包实践

    摘要:由于出于简单可维护的目的,这个容器的基础镜像里面没有带上任何和网络抓包相关的功能。这就为网络抓包提供了基础。抓包实践我们现在用一个提供简单服务的镜像来进行测试。 背景 假设存在一个容器,提供的服务是 HTTP 或者 RPC 的服务。由于出于简单可维护的目的,这个容器的基础镜像里面没有带上任何和网络抓包相关的功能。那么如何能搞对这样的容器进行抓包,以分析业务上面可能存在的问题呢? 共享网...

    blastz 评论0 收藏0
  • K8s对pod进行网络抓包

    摘要:微软雅黑对抓包有两种办法微软雅黑一进入内使用抓包微软雅黑微软雅黑微软雅黑微软雅黑微软雅黑的使用请参照。 对pod抓包有两种办法:一、进入pod内使用tcpdump抓包:kubectl get pod -owide -n namespace | grep podnamekubectl exec -it podname -n ...

    张巨伟 评论0 收藏0
  • Linux 下实践 VxLAN

    摘要:本文首发于我的公众号云计算网络,专注于干货分享,号内有书籍和视频资源,后台回复即可领取,欢迎大家关注,二维码文末可以扫。指定目的端口为。在包的同时,用抓网卡的包。在上的容器中,和预期一致,是无法通的。 本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,欢迎大家关注,二维码文末可以扫...

    icyfire 评论0 收藏0
  • k8s与网络--Flannel解读

    摘要:是一个专为定制的三层网络解决方案,主要用于解决容器的跨主机通信问题。收到的数据包被转发到进程。查询路由表,解封包,并将数据包发送到。然后在网络层的源和目的均是容器的,虚拟。默认也是使用容器网络方案,其官网也清晰的画出了的。 前言 我们知道docker官方并没有提供多主机的容器通信方案,单机网络的模式主要有host,container,brige,none。none这种模式,顾名思义就是...

    laznrbfe 评论0 收藏0
  • k8s与网络--Flannel解读

    摘要:是一个专为定制的三层网络解决方案,主要用于解决容器的跨主机通信问题。收到的数据包被转发到进程。查询路由表,解封包,并将数据包发送到。然后在网络层的源和目的均是容器的,虚拟。默认也是使用容器网络方案,其官网也清晰的画出了的。 前言 我们知道docker官方并没有提供多主机的容器通信方案,单机网络的模式主要有host,container,brige,none。none这种模式,顾名思义就是...

    Pink 评论0 收藏0

发表评论

0条评论

layman

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<