我有一台 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/希望这对其他人有帮助,很难弄清楚如何将所有部分组合在一起。