docker容器内的网络抓包
当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)。
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/namedocker inspect --format "{{.State.Pid}}" container_id/name
获取PID - 使用nsenter切换网络命名空间
nsenter -n -t container_id/name
可在切换前后执行ifconfig来对比变化
现在就已进入容器的网络命名空间,就可以使用宿主机上的tcpdump来对容器进行抓包了