Docker Compose 无法直接配置网络镜像,需结合宿主机混杂模式与容器权限实现:1. macvlan 方式让抓包容器旁路接入二层域,天然捕获 A↔B 全部以太网帧;2. 自定义 bridge + iptables tee 复制流量至 lo,兼容云环境;3. 多网络模式复用基础设施,sniffer 同时接入业务网与监控网实现旁听。

在 Docker Compose 中无法直接配置“网络镜像”(如交换机 SPAN),因为 Compose 是编排层,不控制底层网卡或流量复制逻辑。真正实现容器级双向无感抓包,需结合宿主机网络能力与容器权限设计,而非仅靠 docker-compose.yml 写几行配置就能完成。核心思路是:让抓包容器旁路接入同一二层域,或通过 iptables + 混杂模式复制流量,且全程对业务服务零侵入。
用 macvlan 网络让抓包容器“看见全部帧”
这是最干净、最接近物理镜像的效果,适用于有直连物理网卡的环境(如本地服务器、边缘设备)。
- 在宿主机启用网卡混杂:
sudo ip link set eth0 promisc on - 在
docker-compose.yml中定义 macvlan 网络(注意 driver 和 parent):
networks:
mirror-net:
driver: macvlan
driver_opts:
parent: eth0
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1
- 所有被测服务(web、api、db)和 sniffer 容器都加入该网络,并赋予
NET_ADMIN权限:
services:
web:
image: nginx
networks: [mirror-net]
sniffer:
image: nicolaka/netshoot
cap_add: [NET_ADMIN]
networks: [mirror-net]
command: sh -c "ip link set eth0 promisc on && tcpdump -i eth0 -w /pcap/all.pcap -s 0"
此时 sniffer 容器收到的是原始以太网帧,含源/目的 MAC、ARP、广播包,A↔B 往返流量天然可见,业务容器完全无感知。
用自定义 bridge + iptables tee 实现兼容性方案
适合云主机、Docker Desktop 或无法改用 macvlan 的场景。原理是:把进出容器的 IP 包复制一份到本地环回口,再由抓包容器监听 lo。
- 先在宿主机开启 docker0 混杂:
sudo ip link set docker0 promisc on - 在 Compose 中创建独立 bridge 网络:
networks:
mirror-br:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
gateway: 172.20.0.1
- 启动 sniffer 容器时挂载
/proc并运行复制规则(需提前写好 entrypoint 脚本):
sniffer:
image: alpine:latest
cap_add: [NET_ADMIN, NET_RAW]
volumes: [/proc:/proc:ro]
network_mode: "bridge" # 使用默认 bridge,以便操作 docker0
command: sh -c "
iptables -t mangle -A PREROUTING -s 172.20.0.0/16 -j TEE --gateway 127.0.0.1;
iptables -t mangle -A POSTROUTING -d 172.20.0.0/16 -j TEE --gateway 127.0.0.1;
tcpdump -i lo -w /pcap/mirror.pcap 'ip and (src net 172.20.0.0/16 or dst net 172.20.0.0/16)' -s 0
"
该方式不修改业务容器配置,也不要求它们重启,只要同属 mirror-br 网络即可被镜像,适合临时诊断。
通过多网络+共享抓包容器复用已有基础设施
若已有监控网络(如 monitoring),可让 sniffer 容器同时接入业务网和监控网,避免额外网络切换。
- 定义两个网络,sniffer 同时加入:
networks:
app-net:
driver: bridge
monitor-net:
driver: bridge
<p>services:
sniffer:
image: nicolaka/netshoot
cap_add: [NET_ADMIN]
networks: [app-net, monitor-net]</p><h1>在 app-net 中监听,结果发到 monitor-net 上的 Loki/Prometheus</h1>- 配合
tcpdump -i app-net -w - | nc monitor-net-loki 3100类似管道转发,实现集中式抓包归档 - 业务服务仍只连
app-net,完全无感知;sniffer 不参与业务通信,仅旁听
关键注意事项
不是所有环境都支持上述操作,需提前确认:
- macvlan 要求宿主机网卡支持混杂,部分云平台(AWS EC2、阿里云 ECS)默认禁用,需提工单开通
- iptables tee 需内核 ≥ 2.6.30 且 CONFIG_IP_NF_TARGET_TEE=y,主流发行版一般满足
- 抓包容器必须带
NET_ADMIN和NET_RAW能力,否则无法设混杂或调用 raw socket - tcpdump 抓包时加
-s 0确保截全包,否则 TLS 握手等关键字段可能被截断


















