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)。

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

### 如何在 Docker 容器中使用抓包工具进行网络流量捕获 #### 使用 Wireshark 进行抓包 Wireshark 是一种图形化的网络协议分析工具,可以用于监控和分析网络流量。为了在 Windows 下通过 Wireshark 抓取 Docker 容器中的数据包,可以通过 `nicolaka/netshoot` 镜像来完成此操作[^1]。 具体做法如下: 运行一个临时容器并将其网络命名空间绑定到目标容器(例如名为 `whxwork` 的容器)。这允许新启动的容器共享同一网络环境以便于执行抓包任务。 ```bash docker run -it --net container:whxwork nicolaka/netshoot wireshark ``` 上述命令会启动一个新的基于 `nicolaka/netshoot` 的交互式终端,并自动打开 Wireshark 图形界面来进行实时的数据包捕捉。 #### 利用 tcpdump 实现更灵活的抓包功能 对于非 GUI 场景或者需要脚本化处理的情况,推荐采用 tcpdump 工具。以下是利用 tcpdump 对特定条件下的流量进行记录的方法: 1. **安装 tcpdump** 如果宿主机未预先配置好,则需先确保已安装该程序。大多数 Linux 发行版可通过标准软件源获取它。 2. **定位服务进程 ID (PID)** 找出对应的目标容器实例在其所在操作系统层面的实际 PID 值,这是进入其独立网络名称空间的前提之一。 3. **应用 nsenter 加载指定 namespace 并调用 tcpdump** 结合 `nsenter`, 可以切换至某容器内的视角从而访问其中定义好的虚拟接口设备上的通信情况。 ```bash docker inspect -f '{{ .State.Pid }}' service_a_container_id_or_name | xargs sudo nsenter --target {} --mount --uts --ipc --net --pid bash -c 'tcpdump -i any' ``` 另外还有一种简化方式就是直接创建另一个辅助性的 netshoot 类型镜像实例专门负责此项工作而无需额外依赖外部实体机器资源消耗。 ```bash docker run -d --name=packet-capture --network="container:<your_target_container>" nicolaka/netshoot sleep infinity docker exec packet-capture tcpdump -i eth0 host 192.168.1.11 and port 80 -w /tmp/captured_traffic.pcap ``` 这里我们首先建立了一个持续存活状态的新容器用来充当代理角色,在此基础上再进一步下达实际采集指令保存结果文件供后续审查之用][^[^23]。 最终生成的结果会被存储为 pcap 文件格式存放在 `/tmp/` 路径下面等待下载查看解析。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值