如何将流量镜像到 Suricata 容器

How to mirror traffic to Suricata container

提问人:19mike95 提问时间:7/5/2023 更新时间:7/11/2023 访问量:378

问:

我的目标是使用 suricata 嗅探“攻击者”容器的所有流量,以便其所有可疑流量发出警报跳跃。所以我的计划是这样的:

image.png

这样两个容器都可以通过主机访问互联网,my_network和另一个网络(攻击网络),我会在my_network中镜像攻击者的流量,以便 suricata 可以监听它。为了镜像流量,我正在使用 Daemonlogger 和 . 为了实现这一目标,我有以下docker-compose.yml:daemonlogger -i eth1 -o eth0

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 网络 docker-compose suricata

评论


答:

0赞 VonC 7/7/2023 #1

您可以尝试在 Docker 主机上使用 iptablestee 将流量镜像到另一个(桥接网络)接口,该接口可能是 Suricata 容器使用的接口。

您将:

  1. 在 Docker 主机中创建一个网桥,例如 ,并为其分配一个 IP 地址。(您可能需要先安装软件包)br0bridge-utils

    sudo brctl addbr br0  # create a new bridge named br0
    sudo ip addr add 192.168.1.1/24 dev br0  # assign the IP address 192.168.1.1 with a netmask of 255.255.255.0 to br0
    
  2. 将 “” 和 “” 容器分配给与 br0 关联的同一 Docker 网络。
    (见下文)
    attackersuricatadocker-compose.yml

  3. 使用和复制流量:iptablestee

    iptables -t mangle -A PREROUTING -i br0 ! -s <suricata IP> -j TEE --gateway <suricata IP>
    
  4. 设置 Suricata 以侦听其网络接口。
    首先检查接口名称的名称:查找与“攻击者”容器在同一网络上具有 IP 地址的接口。 然后编辑 , 部分 , 放 .编辑后:.
    docker exec -it suricata bash -c "ip addr"/etc/suricata/suricata.yamlaf-packet:- interface: eth1service suricata restart

以下是基于您的文件的更新:docker-compose.yml

version: "3.8"

services:
  suricata:
    container_name: suricata
    build: ./suricata
    networks:
      attacknet:
        ipv4_address: 172.16.238.10
  attacker:
    container_name: attacker
    build: ./attacker
    networks:
      attacknet:
        ipv4_address: 172.16.238.11

networks:
  attacknet:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.238.0/24

在该配置中,Suricata 和攻击者位于同一 Docker 网络上。如上所述,您可以设置将流量从攻击者镜像到 Suricata。iptables

这仍然是一个高级草图,可能需要根据您的特定设置进行调整。
而上面提到的规则只是一个简单的例子,要根据你感兴趣的流量(入站、出站等)进行调整,确保不要产生流量循环。
iptables

如果尝试在云平台上运行此设置,则由于云提供商的网络虚拟化施加的限制,网络接口镜像选项可能不可用。您可能需要考虑在裸机或自我管理的虚拟化环境中运行此设置,至少用于测试它。


另一种方法是使用网络功能虚拟化平台,例如 TNSR 或 pfSense,它可以将数据包从一个接口镜像到另一个接口。


当您说“将”攻击者“和”suricata“容器分配给与 br0 关联的同一 Docker 网络时,您如何在 docker-compose 文件中实际定义它?
我没有看到文件中的关系,不是 Ips,也没有提到接口 br0。

在 Docker 中,当您docker-compose.yml 文件中定义网络并将该网络分配给服务时,Docker 将自动为该网络创建一个网桥,并将服务的容器连接到该桥。桥将由 Docker 自动分配一个名称,并且不会在文件中明确提及。docker-compose.yml

在您的文件中,您定义了一个名为的网络,并将其分配给您的和服务:docker-compose.ymlattacknetsuricataattacker

services:
  suricata:
    container_name: suricata
    build: ./suricata
    networks:
      attacknet:
        ipv4_address: 172.16.238.10
  attacker:
    container_name: attacker
    build: ./attacker
    networks:
      attacknet:
        ipv4_address: 172.16.238.11

networks:
  attacknet:
    ipam:
      driver: default
      config:
        - subnet: 172.16.238.0/24

当您使用 启动这些服务时,Docker 将为网络创建一个新的网桥,并为其分配 和 容器。您的文件中未指定网桥的实际名称(可能类似于 ),但您可以通过运行命令 docker network inspect attacknet 来找到它。docker-compose upattacknetsuricataattackerbr-<random ID>docker-compose.yml

所以当我提到时,这是一个假设的例子。在设置的上下文中,可以替换为 Docker 为网络创建的实际桥接接口。br0br0attacknet

分配给服务的 IPv4 地址 ( 和 ) 是这些服务在网络中将具有的地址。网络 () 的子网也在文件中定义。172.16.238.10172.16.238.11attacknetattacknet172.16.238.0/24docker-compose.yml

评论

0赞 19mike95 7/11/2023
您好,当您说“将”攻击者“和”suricata“容器分配给与 br0 关联的同一 Docker 网络时,您实际上是如何在 docker-compose 文件中定义它的?我没有看到文件中的关系,不是 Ips,也没有提到接口 br0。
0赞 VonC 7/11/2023
@19mike95 我已经编辑了答案以解决您的评论/问题。