Kvm-Virtualization

QEMU / KVM - 每個 VM 的專用 802.1q VLAN - 僅通過路由器通信

  • January 18, 2021

我有一個帶有多個 eth N介面(我的“大防火牆”)的 Linux 防火牆路由器(專用機器)。所有轉發的流量都由一組iptables規則過濾(預設策略 DROP)。

還有另一台專用機器(“vmhost”)將使用 KVM / QEMU / libvirt / virsh 託管多個虛擬機。

防火牆路由器(物理伺服器)和vm主機(另一台物理伺服器)通過跳線直接連接(路由器的eth2 <-> vmhost的eth0)。

我不希望 vmhost 上的虛擬機能夠通信

  • 對彼此
  • 或到 VM 主機

除了通過外部防火牆路由器。

因此,我在兩側(路由器和 vmhost)配置了多個 802.1q 標記的 VLAN:eth0.10、eth0.11 等(另一側為 eth2.10、eth2.11、…),每個都有一個不同的/30子網(一個主機 IP = 路由器,另一台主機 IP = VM)。因此,每個虛擬機都有自己的標記 VLAN 和自己的子網。

我想用它來將 VM 流量從屬於中央防火牆路由器的 iptables 規則。VM 只能訪問明確允許的 IP 地址和埠。

如何將 VM 配置為綁定到專用 VLAN 介面(例如eth0.10)?關於net, netdev, nic, …

我明確不想在虛擬機的網路或虛擬機和主機之間架起橋樑。

// 稍後添加:兩台伺服器都使用 Debian 10 amd64。

一般有幾種方法。請注意,其中一些不會讓您四處橋接。儘管如此,配置仍然是安全的。

Linux 上橋接的基礎知識在這裡,例如:https ://developers.redhat.com/blog/2017/09/14/vlan-filter-support-on-bridge/

多座橋樑

這是舊方法,在非常舊的 Linux 中可用,一旦它同時支持網橋和 VLAN。它的缺點是配置相當混亂,但在某種程度上更容易理解和管理。

您在主機上為每個 VLAN 子介面配置一個網橋,如下所示:

ip link add link eth0 name eth0.100 type vlan id 100
ip link set eth0.100 up
ip link add br100 type bridge
ip link set br100 up
ip link set eth0.100 master br100

等等。之後,如果你把VM虛擬網卡放到這個br100里面,它的未標記數據包會出現在eth0之外,標記為VLAN 100,反之亦然,標記為VLAN100的數據包會到達這個VM。您在 vNIC 設置中指定到 VM 域文件中的此網橋。要將 VM 放入多個 VLAN,您需要為每個 VLAN 創建一個專用的虛擬 NIC。

如果您不啟用“bridge vlan_filtering”,Proxmox VE 也會使用此方法。您沒有指定在哪個發行版上執行 libvirt,因此我無法建議在您的特定情況下如何達到此配置。你可以在這裡看到它在 Debian 上的樣子。

原則上,您可以使用“未標記的預設”VLAN 來管理主機。我不建議這樣做,那樣您將無法通過此 VLAN 進入任何 VM(不要將 mastereth0放入任何網橋!)。最好定義一個管理 VLAN,為其創建一個網橋並將 IP 地址應用於主機上的管理網橋。假設這個 vlan 100 用於管理:

ip address add address 192.168.100.100/24 dev br100

單橋

這是“新”方法,一旦 Linux 橋程式碼支持 vlan 過濾就可以使用。它的主要優點是使 Linux 成為真正的 L2 交換機,配置不那麼混亂 - 你只有一個網橋。當啟用“bridge vlan_filtering”時,Proxmox VE 直接支持它。

不幸的是,根據他們的手冊**,libvirt 並不直接支持這種方法。**我不知道為什麼,他們似乎很懶惰,因為核心中的一切都在那裡。我會在這裡記錄它,希望他們最終會支持它。

您創建一個橋:

ip link add br0 type bridge vlan_filtering 1
ip link set br0 up
ip link set enp0s1 master br0

現在添加 VLAN 並定義標記和未標記的 VLAN。請記住,br0它既是網橋名稱,也是該網橋通往主機的埠名稱。因此,您可能希望在已標記或未標記的主機上設置未標記的管理 VLAN enp0s1;對於這種設置,這不會有任何問題。假設它的 ID 是 100,並且它被標記在電線上:

bridge vlan add vid 100 dev br0 pvid untagged
bridge vlan add vid 100 dev enp0s1
ip addr add 192.168.100.100/24 dev br0

現在帶有 IP 地址的數據包將從標記為 100 的 enp0s1 發出。

所有 VM vNIC 都將連接到此網橋。但是,現在您需要設置哪些 VLAN 在哪裡。同樣,libvirt 不知道如何做到這一點。您需要根據需要將它們的 VLAN 添加到物理介面(我希望標記)和 vNIC 介面(標記或未標記)。您必須手動執行此操作,就像對管理界面執行此操作一樣。您可以將多個 vlan 傳遞給同一個 vNIC,只要確保其中不超過一個是未標記的。

其他方法

其他方法包括

OpenVSwitch — libvirt 直接支持 vlan,但我不喜歡它,我認為它過於復雜。

VEPA — 一種很好的方法,支持在 libvirt 域文件中設置 VLAN,準確擷取您想要的內容。我不得不推薦它,但我從未使用 VLAN 配置它,所以我不能。也許其他人嘗試過並會詳細解釋。一般來說,它具有與“單橋”相同級別的便利性,除了虛擬機之間或虛擬機與主機之間的通信即使需要,即使它們在同一個 VLAN 中也是不可能的。

引用自:https://serverfault.com/questions/1050201