如何设置网络,以便主机和虚拟机都可以连接到互联网?
我已设置了一台服务器,使用 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
生成树协议 (STP):Fritz!Boxes 的制造商确认他们不支持 STP。
丢弃的数据包:我暂时忽略这一点,因为两台 Linux 笔记本电脑(Ubuntu Mate、Lubuntu)显示丢弃的数据包数量大致相同,但没有任何明显的连接问题。
缺乏互联网接入主机似乎与 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
显然,每个运行的虚拟机都会添加一个虚拟网络。
这很可能不是最优雅或最有效的解决方案,我将非常感谢任何帮助我改进设置的帮助。
不过,主机和所有虚拟机现在都可以访问互联网并获取软件更新。:-)