如何将Attacker容器流量镜像至Suricata容器?配置失效排查
Suricata无法获取镜像流量的问题排查与解决方案
需求背景
我的目标是使用Suricata嗅探“attacker”容器的所有流量,使其可疑流量触发告警。计划让两个容器通过my_network访问互联网,同时在attacknet网络中,使用Daemonlogger(命令:daemonlogger -i eth1 -o eth0)将attacker在my_network的流量镜像给Suricata监听。已配置如下docker-compose.yml,但Suricata无法获取流量:
version: "3.8" services: suricata: container_name: suricata build: ./suricata depends_on: - syslog networks: my_network: ipv4_address: 172.16.238.10 attacknet: ipv4_address: 172.16.233.10 attacker: container_name: attacker build: ./attacker networks: my_network: ipv4_address: 172.16.238.11 attacknet: ipv4_address: 172.16.233.11 networks: my_network: ipam: driver: default config: - subnet: 172.16.238.0/24 attacknet: ipam: driver: default config: - subnet: 172.16.233.0/24
现有配置的核心问题
- Docker Bridge网络的二层隔离:默认Docker Bridge网络(
my_network和attacknet均为此类型)是独立的二层域,容器的虚拟网卡属于各自的网络命名空间。在attacker容器内执行daemonlogger -i eth1 -o eth0,只能转发容器自身命名空间内的流量,无法跨网桥将my_network的流量镜像到attacknet——两个网桥之间没有自动的流量通路。 - 流量镜像逻辑错误:Daemonlogger的作用是在同一主机的物理/虚拟网卡间转发流量,但跨容器的网卡不在同一个网络命名空间,容器内的转发操作无法影响其他容器的流量接收。
可行解决方案
方案一:主机层面流量镜像(适配原Daemonlogger思路)
放弃在容器内运行Daemonlogger,改为在主机上操作,将my_network网桥的流量镜像到attacknet网桥:
- 查找两个网桥的系统名称:
MY_BRIDGE=$(docker network inspect my_network --format '{{.Options.com.docker.network.bridge.name}}') ATTACK_BRIDGE=$(docker network inspect attacknet --format '{{.Options.com.docker.network.bridge.name}}')
- 在主机上启动Daemonlogger转发流量:
daemonlogger -i $MY_BRIDGE -o $ATTACK_BRIDGE
- 确保Suricata容器配置监听
attacknet对应的网卡(默认是eth1),即可捕获镜像过来的流量。
方案二:将Suricata作为流量网关(推荐)
让attacker的所有流量经过Suricata,无需额外镜像工具,同时实现流量转发与检测:
- 修改
docker-compose.yml,将attacker的网关指向Suricata的my_networkIP:
version: "3.8" services: suricata: container_name: suricata build: ./suricata depends_on: - syslog privileged: true # 开启特权以支持IP转发 networks: my_network: ipv4_address: 172.16.238.10 attacker: container_name: attacker build: ./attacker networks: my_network: ipv4_address: 172.16.238.11 gateway: 172.16.238.10 # 指向Suricata作为网关 dns: - 8.8.8.8 networks: my_network: ipam: driver: default config: - subnet: 172.16.238.0/24
- 在Suricata的Dockerfile中添加IP转发配置:
RUN echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf RUN sysctl -p
- 配置Suricata监听
my_network对应的网卡(默认是eth0),即可直接捕获attacker的所有进出流量并触发告警。
方案三:特权容器监听主机网桥
让Suricata以特权模式直接监听主机上的my_network网桥,无需额外镜像操作:
- 修改
docker-compose.yml:
version: "3.8" services: suricata: container_name: suricata build: ./suricata depends_on: - syslog privileged: true # 必须开启特权访问主机网卡 network_mode: "none" # 不使用Docker内置网络 devices: - /dev/net/tun:/dev/net/tun cap_add: - NET_ADMIN attacker: container_name: attacker build: ./attacker networks: my_network: ipv4_address: 172.16.238.11 networks: my_network: ipam: driver: default config: - subnet: 172.16.238.0/24
- 在Suricata容器内配置监听主机上的
my_network网桥(先通过ip link找到网桥名称):
suricata -i br-xxxxxx # br-xxxxxx是my_network对应的网桥名称
内容的提问来源于stack exchange,提问作者19mike95
相关产品推荐
相关产品推荐

