AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1050201
Accepted
MrSnrub
MrSnrub
Asked: 2021-01-18 19:58:35 +0800 CST2021-01-18 19:58:35 +0800 CST 2021-01-18 19:58:35 +0800 CST

QEMU / KVM - 每个 VM 的专用 802.1q VLAN - 仅通过路由器通信

  • 772

我有一个带有多个 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。

vlan kvm-virtualization libvirt qemu virsh
  • 1 1 个回答
  • 1335 Views

1 个回答

  • Voted
  1. Best Answer
    Nikita Kipriyanov
    2021-01-18T23:29:47+08:002021-01-18T23:29:47+08:00

    一般有几种方法。请注意,其中一些不会让您四处桥接。尽管如此,配置仍然是安全的。

    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 中也是不可能的。

    • 1

相关问题

  • des3526,如何取消标记 vlan 端口?

  • WAN 上的 VLAN

  • Linux VLAN 桥接器

  • 要使网络负载平衡发挥作用,数据中心网络有哪些要求?

  • 通过单独的 VLAN 进行 SQL 复制

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve