我一直在尝试在使用开放 vswitch 创建的虚拟网桥上配置端口镜像。
我使用以下命令在 Bridge demo_bridge 上创建了以下端口:
sudo ovs-vsctl add-port demo_bridge victim0
Bridge demo_bridge
Port "demo_bridge"
Interface demo_bridge
type: internal
Port "victim0"
Interface victim0
type: internal
Port "attacker0"
Interface attacker0
type: internal
Port "wireshark0"
Interface wireshark0
type: internal
ovs_version: "2.5.2"
我正在进行一个简单的实验,其中 VM1(连接到attacker0)将攻击VM2(连接到victim0),并且我需要将所有流量从attacker0 vport镜像到wireshark0(VM3捕获网络流量)。但是,每当我启用镜像时,我就无法再从 VM1(攻击者 VM)ping 通 VM3(Wireshark VM);此外,我也看不到 VM3 上的任何镜像流量。
这是我用来创建镜像端口的两组命令,但它们都不起作用:
sudo ovs-vsctl \
-- set Bridge demo_bridge mirrors=@m1 \
-- --id=@attacker0 get Port attacker0 \
-- --id=@wireshark0 get Port wireshark0 \
-- --id=@m1 create Mirror name=port_mirror1 select-dst-port=@attacker0 select-src-port=@attacker0 output-port=@wireshark0
//来自YOUTUBE视频
sudo ovs-vsctl \
-- --id=@p get port victim0 \
-- --id=@m create mirror name=mirror0 \
-- add bridge demo_bridge mirrors @m \
-- set mirror mirror0 output_port=@p
//激活镜像
sudo ovs-vsctl \
-- --id=@p get port ens3 \
-- set mirror mirror0 select_dst_port=@p \
-- set mirror mirror0 select_src_port=@p
这些命令确实创建了镜像端口,但它们也会中断攻击者 VM1 和受害者 VM2 之间的网络连接。删除镜像后,我可以正常 ping 通所有虚拟机。每个虚拟机 (ens3) 上的本地接口都有一个连接到 Bridge demobridge 的静态 IP 地址。 /etc/网络/接口
auto ens3
iface ens3 inet static
address 172.168.0.3
network 172.168.0.0/27
netmask 255.255.255.0
答案1
您是否尝试过使用 tcpdump 来监听虚拟机的接口?
我不确定您使用什么作为虚拟机管理程序,但您应该能够运行ip addr
,并且您是否可以看到 vswitch 的端口;在该输出中,您可以在 tcpdump 中捕获这些端口。
您还可以运行tcpdump -D
,这将告诉您 libpcap 在主机上了解哪些内容以进行捕获。
例如,如果您将 KVM 作为虚拟机管理程序运行,您可以获得与虚拟机关联的 MAC 地址和端口名称。
# Assuming your xml files for the vms are in the default location also. cat /etc/libvirt/qemu/{{ name_of_vm }}.xml | grep -A 2 interface
从此输出中,您可以匹配ip addr
使用 mac 地址的最后两位数字作为过滤器的输出。
ip a | grep -B 1 -i {{ last_two }}
返回的接口可供 tcpdump 使用。
tcpdump -ni {{ vnet_name }} -s0 -vw /var/tmp/{{ vnet_port_out }}.pcap
这将捕获该端口上未过滤的所有内容。
答案2
我已经成功镜像流量,请参见以下内容: 就我而言,将 br-int 中的 vm1 流量镜像到 vm0,vm0 有两个端口,一个管理器另一个接收流量
vm0接收端口是7df1c457-7732-44b2-bf15-63b0b661f1b7
vm1 端口是7eb61cc2-d059-4002-acef-b38e242ce4a5
从 Linux 桥“qbrxxxxx”拉取接口“tapxxxx”
brctl delif qbr7df1c457-77 tap7df1c457-77
将接口“tapxxxx”添加到 br-int
ovs-vsctl add-port br-int tap7df1c457-77
将 br-int 流量镜像到端口 tap7df1c457-77
ovs-vsctl -- --id=@tap1 get port qvo7eb61cc2-d0 -- --id=@tap2 get port tap7df1c457-77 -- --id=@m create mirror name=m0 select_dst_port=@tap1 select_src_port=@tap1 output_port=@tap2 -- set bridge br-int mirrors=@m
这qvo7eb61cc2-d0
是 vm1 的端口。