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
    • 最新
    • 标签
主页 / unix / 问题 / 758301
Accepted
IMTheNachoMan
IMTheNachoMan
Asked: 2023-10-07 00:37:34 +0800 CST2023-10-07 00:37:34 +0800 CST 2023-10-07 00:37:34 +0800 CST

主机正在从桥接设备获取 IP,但 virt-manager 虚拟机却未获取 IP

  • 772

首先,我的问题类似于如何使用 KVM (Virt-Manager) 设置虚拟机和主机的桥接网络?但标记的答案对我不起作用,并且由于问题被标记为已解决,我认为最好发布一个新问题。

我会尝试简化我的设置。

  • 我有一个hostwith eno1(运行 Debian + KDE)
  • 我已经删除了所有eno1接口
  • 我创建了一个桥接接口br0并添加eno1为从属接口
  • 我安装了 virt-managerhost

现在:

  • host已连接br0并获得IP
  • virt-managerVM配置为使用br0,但它没有获取 IP

无论我如何尝试,我都无法获得VMIP。我怎样才能解决这个问题?

这是一些屏幕截图。忽略 br1,因为那只是我在玩/测试。

连接br0...

在此输入图像描述

...带有以太网从站...

在此输入图像描述

... 链接到eno1.

在此输入图像描述

VM配置为桥接设备br0

在此输入图像描述

debian
  • 1 1 个回答
  • 26 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2023-10-07T07:37:44+08:002023-10-07T07:37:44+08:00

    Docker 使用iptables来管理其容器,就像libvirt也使用它一样。但通常 Docker 不能与同一系统上运行的其他网络相关工具很好地配合,原因有二:

    • Docker 加载br_netfilter内核模块,使桥接帧遍历iptables(而不仅仅是ebtables)。

    • Docker 还将iptables的默认过滤器/FORWARD 策略设置为 DROP

      Docker 还将链的策略设置FORWARD为DROP. 如果您的 Docker 主机还充当路由器,这将导致该路由器不再转发任何流量。如果您希望系统继续充当路由器,您可以ACCEPT向链中添加明确的规则 DOCKER-USER以允许它。

    br_netfilter这些的组合,以及将此作为默认行为的事实,系统上存在的任何桥,无论是否与 Docker 相关,都会通过iptables继承默认的 DROP 转发策略,此外还有ebtables可能执行的任何操作(如果也存在) :任何转发的帧都会被丢弃。

    因此, libvirt处理的所有桥都会受到影响:虚拟机因 Docker 运行而被隔离。如上所述,可以将例外添加(但实际上应该插入而不是添加)到DOCKER-USERDocker 创建的链式规则(但如果需要,可以首先由管理员创建)。仅仅向链添加规则FORWARD可能还不够,因为 Docker 总是在之前插入其规则(但DOCKER-USER首先调用)。

    要允许任何非 Docker 桥不被iptables过滤,可以使用以下选择之一:

    1. 通过 IP 地址匹配允许转发的内容。使用 0.0.0.0 和 255.255.255.255 等地址很难与 DHCP 区分开来,还必须添加它们。对于 IP LAN 192.0.2.0/24 来说:

      iptables -N DOCKER-USER || true # doesn't matter if done before Docker or after (and thus already existing)
      iptables -I DOCKER-USER -s 192.0.2.0/24 -d 192.0.2.0/24 -j ACCEPT
      iptables -I DOCKER-USER -s 0.0.0.0/32 -d 255.255.255.255/32 -j ACCEPT
      
    2. 或者通过非 Docker 接口进行匹配

      除非自定义命名,否则 Docker 接口始终命名为docker0或br-...。不要使用相同的命名约定并为它们添加例外。

      从iptables 的角度来看,从桥接端口eno1转发的桥接帧,例如vnet0(虚拟机的 Tap 接口)被显示为来自br0接口:桥接端口不会被看到,因此数据包来自br0并转发到br0。

      顺序很重要。声明插入索引可以保持下面规则的自然顺序,就像添加了(但由于 Docker 添加了最后的)-A而必须插入它们。-j RETURN

      iptables -N DOCKER-USER || true
      iptables -I DOCKER-USER 1 -i docker0 -o docker0 -j RETURN
      iptables -I DOCKER-USER 2 -i br-+ -o br-+ -j RETURN
      

      允许br0并且br1:

      iptables -I DOCKER-USER 3 -i br0 -o br0 -j ACCEPT
      iptables -I DOCKER-USER 4 -i br1 -o br1 -j ACCEPT
      

      让我们继续讨论 libvirt 和 LXC(也是常见的受害者)的其他常见名称:

      iptables -I DOCKER-USER 5 -i virbr0 -o virbr0 -j ACCEPT
      iptables -I DOCKER-USER 6 -i lxcbr0 -o lxcbr0 -j ACCEPT
      
    3. 或者让iptables获取一些桥接信息来做出决定

      即使它看起来更通用,也应该避免,因为使用physdevmatch 模块确实会加载br_netfilter内核模块来工作(如果尚未加载),所以即使不使用 Docker 也会得到这个,而其目标是保护自己免受 Docker 加载br_netfilter。它更强大一点,因为它允许区分桥接的帧和路由的数据包(使用单臂路由,恰好使用网桥作为路由接口)。

      Docker 仍然需要例外,因为 Docker 在自己的链中进行自己的 LAN 过滤。任何非 Docker 和桥接(而不是路由)的东西都是允许的。

      iptables -N DOCKER-USER || true
      iptables -I DOCKER-USER 1 -i docker0 -o docker0 -j RETURN
      iptables -I DOCKER-USER 2 -i br-+ -o br-+ -j RETURN
      iptables -I DOCKER-USER 3 -m physdev --physdev-is-bridged -j ACCEPT
      

    考虑到libvirt本身在 FORWARD 链中的规则可能无法正常工作或者可能被 Docker 的规则短路,以前的选择可能不适用于所有可能的情况。尽管nat规则也受到影响,但在这种情况下,libvirt(和 LXC)通常可以完全正确地处理这些规则。

    1. 虚拟机中的 Docker

      不要将 Docker 与任何其他网络工具混合使用,它会在存在网桥的情况下扰乱它们的行为。相反,在正确隔离的虚拟机中运行 Docker 本身,不会影响主机或主机上的其他虚拟机和容器(例如:LXC)。然后,如果该虚拟机本身与主网络桥接,正如当前主机的设置已经允许的那样,这不会对到达其容器的外部设置进行太大改变:Docker 将在物理 LAN 上拥有自己独立的 IP 地址,而不是主人的。

    2. 其他可能性(需要内核 >= 5.3)

      预加载br_netfilter以确保sysctl设置可用,并使用以下命令禁用iptables的系统范围设置:

      modprobe br_netfilter
      sysctl -w net.bridge.bridge-nf-call-iptables=0
      

      并在选定的 Docker 桥上重新启用它(可能使用运行 Docker 命令的脚本来检索其名称):

      ip link set dev docker0 type bridge nf_call_iptables 1
      ip link set dev br-5039242381f0 type bridge nf_call_iptables 1
      

      这将需要对创建的每个新桥进行操作。

      另一种方法可能是Docker-in-Docker在容器中运行自身,仅禁用全局设置(默认情况下,在新的网络命名空间上仍启用此设置...)。这看起来越来越困难,因为与在虚拟机中运行 Docker 相比,需要额外的管理负担。

    我会选择 4。(虚拟机:避免所有可能的 Docker 干扰)或者 2。(保持简单但足够好)

    iptables注意:通过替换ip6tables上面的内容(包括) ,所有内容都适用于 IPv6 sysctl。对于nftables集成,请参阅此nftables具体答案。

    • 1

相关问题

  • GRUB 配置以识别同一 Linux 发行版的不同桌面环境(安装)

  • astyle 不会更改源文件格式

  • 接收有关全新 Debian 的电子邮件

  • Debian Stretch:libgs_plugin_systemd-updates.so 中的 gnome-software 段错误

  • 如何在拼音输入法中输入ü?

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve