虚拟机运行时主机无法访问互联网

虚拟机运行时主机无法访问互联网

如何设置网络,以便主机和虚拟机都可以连接到互联网?

我已设置了一台服务器,使用 KVM 托管多台虚拟机。它旨在为盲人提供可下载图书的图书馆(详情见下文)。

目前的状态是尝试遵循虚拟机网络方面的大量教程的结果。目标是从主机和虚拟机都可以访问互联网。

主机和客户机都运行 Debian 10。网卡配置为具有静态地址的网桥 br0(“接口”见下文)。

目前,虚拟机是使用 virsh 手动启动的。当没有虚拟机运行时,主机可以访问互联网(例如 ping debian.org、get update、wget ...)。

一旦启动虚拟机,虚拟机就可以通过 br0 访问互联网。每个虚拟机都有一个静态地址。然后,主机就无法访问互联网。可以 Ping 本地网络中的其他机器以及路由器,但不能 Ping 更远(无论是 ping 域名还是 IP 地址)。

可以从其他本地机器使用 ssh 访问主机和虚拟机。

一旦将虚拟机设置为自动启动,就无法再在不手动关闭虚拟机的情况下进行更新,而且主机不会连接到时间服务器。此外,ip 显示丢弃的包。

所有这些很可能是由于我对网络和桥梁的了解非常有限。我非常感谢任何帮助!

这里有一些进一步的信息。

目的
一个虚拟机将使用 NginX Web 服务器为本地网络之外的用户提供服务。它负责下载用户借阅的存储在本地驱动器上的书籍。

第二台虚拟机提供一个 PostgreSQL 数据库服务器,只能从本地工作站访问,用于管理图书馆用户和贷款。

主机应该可以通过本地网络通过 ssh 访问。需要互联网访问才能连接到时间服务器并保持软件更新。

个人电脑
主板:MSI MPG B550 GAMING PLUS
CPU:AMD Ryzen™ 7 3700X
内存:Corsair DIMM 32 GB DDR4-3200 套件
硬盘:Samsung 980 PRO 1 TB,SSD
显卡:MSI GeForce GT 710 1GD3H LP

操作系统
uname -r

4.19.0-17-amd64

lsb_release -a

No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 10 (buster)
Release:    10
Codename:   buster

网络
在移至图书馆之前,服务器位于我的家庭办公室,并连接到 AVM Fritz!Box 7490 路由器。

ls /sys/class/net/

br0  enp42s0  lo

猫/等/网络/接口

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
iface enp42s0 inet manual

# The br0 bridge settings
auto br0
iface br0 inet static
   bridge_ports enp42s0
      address 192.168.10.50
      network 192.168.10.0
      broadcast 192.168.10.255
      netmask 255.255.255.0
      gateway 192.168.10.1
      dns-nameservers 94.247.43.254 194.36.144.87 192.168.10.1
      bridge_stp off
      bridge_fd 0
      bridge_maxwait 0

(虚拟机的地址为 192.168.10.51、192.168.10.52)

ip -s 链接显示 dev br0

3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 2c:f0:5d:e4:36:d5 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    206602     2218     0       1130    0       177     
    TX: bytes  packets  errors  dropped carrier collsns 
    99981      593      0       0       0       0       

猫/proc/net/dev

  Inter-|   Receive                                                | Transmit
   face |   bytes packets errs drop fifo frame compressed multicast|    bytes packets errs drop fifo colls carrier compressed
    br0:   210026    2268    0 1138    0     0          0       177    103273     615    0    0    0     0       0          0
  vnet0:  1384510   18903    0    0    0     0          0         0  58389276   40523    0    0    0     0       0          0
     lo:     1840      26    0    0    0     0          0         0      1840      26    0    0    0     0       0          0
enp42s0: 58580534   42260    0   38    0     0          0       289   1467123   19358    0    0    0     0       0          0

路线-n

Kernel-IP-Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 vnet0
0.0.0.0         192.168.10.1    0.0.0.0         UG    0      0        0 br0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 vnet0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 br0

ls /sys/class/net/

br0  enp42s0  lo  vnet0

答案1

您的网桥丢弃了一半的传入数据包!您还能保持连接真是太神奇了。

我只看到您的配置有一个明显的问题,不幸的是,这是错误选择的 Debian 默认配置:

      bridge_stp off

对于 libvirt 或虚拟机使用的任何虚拟桥,STP 确实应该打开。无论是有意还是无意地构建循环都太容易了。这意味着它还需要在您的 Fritz!Box 上打开,但它很可能已经打开了。对于您在库中将其插入的任何交换机也是如此,但同样,它很可能已经打开了 STP。

答案2

  1. 生成树协议 (STP):Fritz!Boxes 的制造商确认他们不支持 STP。

  2. 丢弃的数据包:我暂时忽略这一点,因为两台 Linux 笔记本电脑(Ubuntu Mate、Lubuntu)显示丢弃的数据包数量大致相同,但没有任何明显的连接问题。

  3. 缺乏互联网接入主机似乎与 connman 通过 DHCP 设置 vnets 的 IP 地址有关。

第一个提示是,当我查看 ping debian.org 的输出时虚拟机已启动:

PING debian.org (130.89.148.77) 56(84) bytes of data.
From blibu.local (169.254.210.100) icmp_seq=1 Destination Host Unreachable

ip a 给出以下输出(摘录)

3: br0: ... inet 192.168.10.50/24
4: vnet0: ... inet 169.254.210.100/16

因此 ping 使用的 vnet0 的地址与本地网络地址空间不同。

尝试了多种不同的方法(第二个 NIC,macvtap)并得到相同的结果后,我终于记得将所有 vnet 添加到 /etc/connman/main.conf:

NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb,ve-,vb-,br,enp42s0,eno1,vnet0,vnet1,vnet2

显然,每个运行的虚拟机都会添加一个虚拟网络。

这很可能不是最优雅或最有效的解决方案,我将非常感谢任何帮助我改进设置的帮助。

不过,主机和所有虚拟机现在都可以访问互联网并获取软件更新。:-)

相关内容