用于混合接口 IDS 的 KVM 桥

用于混合接口 IDS 的 KVM 桥

我有一台 KVM 虚拟化服务器,它提供 br0 桥接,映射到 eth0。我想将 eth2 添加为我正在测试的 IDS 虚拟机的 br2 桥接,但客户操作系统没有将 br2 或 eth2 视为有效接口。我在 eth2 上运行了 tcpdump 并可以验证它是否看到了数据包,所以我知道我有一个有效的源,并且该接口使用 具有 PROMISC 选项ifconfig eth2 promisc up。这是我的 /etc/network/interfaces 文件:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
    address 1.2.3.4
    netmask 255.255.255.0
    gateway 1.2.3.1
    bridge_ports eth0
    bridge_fd 9
    bridge_hello 2
    bridge_maxage 12
    bridge_stp off

auto eth2
iface eth2 inet manual

auto br2
iface br2 inet static
    up ifconfig br2 promisc up
    down ifconfig br2 promisc down
    bridge_ports eth2
    bridge_fd 9
    bridge_hello 2
    bridge_maxage 12
    bridge_stp off

我错过了什么?

答案1

Linux 桥接器是一个基本的第 2 层交换机。为了使它能够将流量发送到与其连接的接口,流量必须适合该接口(即,目标 MAC 地址可通过该端口到达)。

虽然第 2 层交换机通常具有端口镜像功能,可以将穿过交换机的所有流量转发到指定端口,但 Linux 桥接器没有这样的功能。

但是,您可以使用 Linux 的流量控制 (tc) 来伪造它。我这样做是为了将流量转发到运行 suricata 的 KVM 虚拟机。这种方法的局限性在于您只能在单个物理端口上镜像流量。

在这个脚本中,MONITOR_PORT是要监控的端口,必须是物理端口,MIRROR_PORT是流量将发送到的接口(可以是虚拟端口或网桥)。使用此方法,被监控的端口不需要处于混杂模式。镜像端口不需要桥接到被监控的端口。

在我的例子中,主机有一个桥接器 br0,桥接至 eno1,并且所有虚拟机都有一个虚拟 NIC。我为该 VM 创建了一个仅主机虚拟网络(作为 virbr2),并在该网络上的 suricata VM 中除了常规 NIC 之外还添加了第二个 NIC,并将流量定向到它。

[error@hypervisor ~]$ cat /etc/rc.d/rc.local
#!/bin/bash

# Mirror all packets from one port to another (for suricata)

MONITOR_PORT=eno1
MIRROR_PORT=virbr2

# Ingress
tc qdisc add dev $MONITOR_PORT ingress
tc filter add dev $MONITOR_PORT parent ffff: protocol all u32 match u8 0 0 action mirred egress mirror dev $MIRROR_PORT
# Egress
tc qdisc add dev $MONITOR_PORT handle 1: root prio
tc filter add dev $MONITOR_PORT parent 1: protocol all u32 match u8 0 0 action mirred egress mirror dev $MIRROR_PORT

请注意,这不是我自己创作的;我厚颜无耻地抄袭了使用 Linux 桥接器的端口镜像,其中详细解释了其工作原理,并提供了使用 Open vSwitch 的替代方案,它更加灵活(并且更加复杂)。

答案2

谢谢,我能够使用 (可能) 更简单的方法通过 brctl 使其工作,例如:

auto eth1
iface eth1 inet manual

#Alienvault OSIM Interface
auto br1
    iface br1 inet manual
    address 0.0.0.0
    bridge_ports eth1
    bridge_stp off 

然后

ifup eth1

然后查看它是否捕获如下数据包:

tcpdump -i br1

你应该得到很多东西,例如:

14:46:53.507328 IP 192.168.20.130.53866 > ipv4_1.cxl0.c154.sea001.ix.nflxvideo.net.https: Flags [.], ack 2897, win 5611, options [nop,nop,TS val 3160018074 ecr 2918482309,nop,nop,sack 1 {28961:46337}], length 0
 14:46:53.507402 IP ipv4_1.cxl0.c154.sea001.ix.nflxvideo.net.https > 192.168.20.130.53866: Flags [.], seq 56473:57921, ack 0, win 2050, options [nop,nop,TS val 2918482612 ecr 3160018052], length 1448

就像页面快速流过一样,这很好。现在添加你的桥梁,如下所示:

brctl setageing br1 0
brctl setfd br1 0

现在启动您的虚拟机并添加第二个 NIC > 指定共享设备名称 > br1。您可能必须重新启动虚拟机,但然后登录虚拟机,您应该会看到第二个 NIC eth1,它桥接到您的镜像接口并可以开始查看数据包。我仍然没有弄清楚如何让 vswitch 将镜像数据包复制到多个接口,以防您想让多个传感器查看相同的数据,所以这是我的下一个问题。要使您的 brctl 配置在重新启动后保持不变,请执行以下操作:

cd /etc/network/if-up.d
touch br1-mirror
chmod +x br1-mirror
vi br1-mirror
  #!/bin/bash
  if [ "$IFACE" = br1 ]; then
  brctl setageing br1 0
  brctl setfd br3 0
fi

非常感谢这里的帮助,还有这个家伙,他非常乐于助人http://www.ryanhallman.com/kvm-configure-mirrored-ports-traffic-to-be-visible-in-guest-snort/希望这对其他人有帮助,很难弄清楚如何将所有部分组合在一起。

相关内容