网络配置

'''{pve}正在使用Linux网络栈。这为如何在{pve}节点上设置网络提供了很多灵活性。配置既可以通过GUI完成,也可以通过手动编辑文件`/etc/network/interfaces`来完成,该文件包含了整个网络配置。`interfaces(5)`手册页面包含了完整的格式描述。所有{pve}工具都努力保留直接用户修改的内容,但使用GUI仍然是首选,因为它可以保护你免受错误。'''

要将客户机连接到底层的物理网络,需要一个’vmbr’接口。它们是一种Linux桥接,可以被视为一种虚拟交换机,客户机和物理接口都连接到这个交换机上。本节提供一些例子,展示如何设置网络,以适应不同的用例,比如使用'绑定'实现冗余、'VLAN''路由'以及'NAT'设置。

软件定义网络是{pve}集群中更复杂的虚拟网络的一个选项。

Warning
如果不确定的话,不鼓励使用传统的Debian工具`ifup`和`ifdown`,因为它们存在一些陷阱,如在执行`ifdown vmbrX`时中断所有客户端流量,但在稍后对同一个桥执行`ifup`时不会重新连接这些客户端。

应用网络更改

{pve}并不直接将更改写入`/etc/network/interfaces`。相反,我们会将更改写入一个名为`/etc/network/interfaces.new`的临时文件中,这样您就可以一次性进行许多相关的更改。这也允许在应用更改之前确保您的更改是正确的,因为错误的网络配置可能会使节点无法访问。

使用ifupdown2的实时重载网络

使用推荐的 'ifupdown2' 包(自 {pve} 7.0 起的新安装默认值),可以在不重启的情况下应用网络配置更改。如果你通过GUI更改网络配置,你可以点击 'Apply Configuration' 按钮。这将会把更改从暂存的 interfaces.new 文件转移到 /etc/network/interfaces,并实时应用它们。

如果你直接在 /etc/network/interfaces 文件中手动做了更改,你可以通过运行 ifreload -a 来应用这些更改。

Note
如果您在Debian上安装了 {pve},或者从旧版本的 {pve} 升级到 {pve} 7.0,请确保安装了 'ifupdown2':`apt install ifupdown2

重启节点以应用更改

另一种应用新网络配置的方法是重启节点。在这种情况下,systemd服务`pvenetcommit`会在`networking`服务应用该配置之前,激活暂存的`interfaces.new`文件。

命名约定

我们目前使用以下命名规范来为设备命名:

  • 以太网设备:en*,systemd 网络接口命名方案。这种命名方案是 自版本5.0起用于新的{pve}安装。

  • 以太网设备:eth[N],其中 0 ≤ N (eth0eth1、…​)。这种命名方案用于在 5.0 版本之前安装的 {pve} 主机。升级到 5.0 版本时,这些名称将被保持原样。

  • 桥接名称:vmbr[N],其中 0 ≤ N ≤ 4094 (vmbr0 - vmbr4094

  • 债券:bond[N],其中 0 ≤ N(bond0, bond1, …​)

  • VLAN:只需要在设备名称后加上VLAN编号,中间用一个英文句号隔开(例如 eno1.50bond1.30)。

这使得调试网络问题更加容易,因为设备名称暗示了设备类型。

Systemd 网络接口名称

Systemd定义了一个带版本的网络设备命名方案。该方案对以太网网络设备使用两个字符的前缀`en`。下一个字符取决于设备驱动程序、设备位置和其他属性。一些可能的模式包括:

  • o<index>[n<phys_port_name>|d<dev_port>]` — 设备在板上

  • s<slot>[f<function>]` — 通过热插拔ID识别的设备

  • [P<domain>]p<bus>s<slot>[f<function>][n<phys_port_name>|d<dev_port>]` — 通过总线ID识别的设备

  • x<MAC>``` — 根据MAC地址区分的设备

一些最常见模式的例子包括:

  • eno1` — 是第一个板载网络接口卡

  • enp3s0f1` — 是PCI总线3,插槽0上网络接口卡的功能1。

要获取可能的设备名称模式的完整列表,请参阅https://manpages.debian.org/stable/systemd/systemd.net-naming-scheme.7.en.html [systemd.net-naming-scheme(7)手册页]。

systemd的新版本可能会定义网络设备命名方案的新版本,并默认使用它。因此,在升级到更新的systemd版本时,例如在进行主要的{pve}升级期间,可能会更改网络设备的名称,并需要调整网络配置。为了避免因新版本的命名方案而导致名称更改,您可以手动固定特定的命名方案版本(见下文)。

然而,即使固定了命名方案的版本,由于内核或驱动程序的更新,网络设备的名称仍然可能会发生变化。为了完全避免特定网络设备名字的变更,您可以使用链接文件手动覆盖其名称(见下文以下)。

有关网络接口名称的更多信息,请参见 https://systemd.io/PREDICTABLE_INTERFACE_NAMES/ [可预测的网络接口名称]。

固定特定的命名方案版本

您可以通过在内核命令行中添加`net.naming-scheme=<version>`参数来固定网络设备命名方案的特定版本。有关命名方案版本的列表,请参见https://manpages.debian.org/stable/systemd/systemd.net-naming-scheme.7.en.html[systemd.net-naming-scheme(7)手册页面]。

例如,要固定版本`v252`,这是全新的{pve} 8.0安装的最新命名方案版本,请添加以下内核命令行参数:

net.naming-scheme=v252

请参见本节来编辑内核命令行。您需要重启系统以使更改生效。

覆盖网络设备名称

你可以通过使用自定义的https://manpages.debian.org/stable/udev/systemd.link.5.en.html[systemd.link文件]手动为特定网络设备指定一个名称。这将覆盖根据最新的网络设备命名方案所赋予的名称。通过这种方式,你可以避免因内核更新、驱动程序更新或命名方案的新版本而导致的命名更改。

自定义链接文件应该放置在 /etc/systemd/network/ 目录下,并且命名为 <n>-<id>.link,其中 n 是一个小于 99 的优先级数值,id 是某种标识符。一个链接文件包含两个部分:[Match] 部分决定了该文件将适用于哪些接口;[Link] 部分决定了这些接口应该如何配置,包含它们的命名。

要为特定网络设备分配一个名称,您需要一种方法在 [Match] 部分中唯一并永久地标识该设备。一种可能性是使用 MACAddress 选项匹配设备的 MAC 地址,因为它不太可能发生变化。然后,您可以在 [Link] 部分使用 Name 选项为其分配一个名称。

例如,要将名称 enwan0 分配给 MAC 地址为 aa:bb:cc:dd:ee:ff 的设备,请创建一个名为 /etc/systemd/network/10-enwan0.link 的文件,并写入以下内容:

[Match]
MACAddress=aa:bb:cc:dd:ee:ff

[Link]
Name=enwan0

不要忘记调整`/etc/network/interfaces`文件以使用新的名称。你需要重启节点以使更改生效。

Note
建议使用以`en`或`eth`开头的名称来指定网络接口,这样{pve}就能将其识别为物理网络设备,进而可以通过图形用户界面进行配置。此外,你应该确保这个名称未来不会与其他接口名称冲突。一种可能性是指定一个不与systemd用于网络接口的任何名称模式相匹配的名称(参见上文:见上文),例如上例中的`enwan0`。

有关链接文件的更多信息,请参见[Systemd.link(5)手册页面](https://manpages.debian.org/stable/udev/systemd.link.5.en.html)。

选择网络配置

根据您当前的网络组织和资源,您可以选择桥接、路由或伪装网络设置。

在私有局域网中的{pve}服务器,使用外部网关以连接至互联网

在这种情况下,桥接 模型最为合理,这也是新的 {pve} 安装中的默认模式。您的每个客户系统都将有一个虚拟接口连接到 {pve} 桥。这在效果上类似于将客户网络卡直接连接到局域网上的新交换机,{pve} 主机扮演着交换机的角色。

在托管服务提供商处的{pve}服务器,拥有用于客户的公共IP范围。

对于这个设置,您可以根据提供商的允许使用*桥接*或*路由*模式。

托管服务提供商的{pve}服务器,拥有一个单独的公网IP地址。

在那种情况下,为您的客户系统获取外部网络访问的唯一方法是使用*伪装*(Masquerading)。对于对您的客户的入站网络访问,您需要配置*端口转发*(Port Forwarding)。

为了进一步的灵活性,您可以配置VLANs (IEEE 802.1q)和网络绑定,也被称为“链路聚合”。这样就可以构建复杂且灵活的虚拟网络。

使用桥接的默认配置

桥接就像是用软件实现的物理网络交换机。所有虚拟客户机都可以共享一个桥接,或者你可以创建多个桥接来分隔网络域。每个宿主机最多可以有4094个桥接。

安装程序创建了一个名为`vmbr0`的单个桥接,它连接到第一块以太网卡。相应的配置在`/etc/network/interfaces`中可能如下所示:

auto lo
iface lo inet loopback

iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.10.2/24
        gateway 192.168.10.1
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0

虚拟机的行为就像它们直接连接到物理网络一样。反过来,网络看每个虚拟机都有自己的MAC地址,尽管所有这些虚拟机只通过一根网络线缆连接到网络。

路由配置

大多数托管服务提供商不支持上述设置。出于安全原因,一旦检测到单个接口上有多个MAC地址,他们就会禁用网络。

Tip
一些提供商允许您通过他们的管理界面注册额外的MAC地址。这可以避免问题,但配置起来可能会很笨拙,因为您需要为每一个虚拟机注册一个MAC地址。

通过将所有流量通过单个接口进行“路由”来避免该问题。这确保所有网络数据包使用相同的MAC地址。

一个常见的情况是,你拥有一个公共IP(假设在此示例中为`198.51.100.5`),以及一个为你的虚拟机准备的额外的IP块(203.0.113.16/28)。对于这种情况,我们推荐以下设置:

auto lo
iface lo inet loopback

auto eno0
iface eno0 inet static
        address  198.51.100.5/29
        gateway  198.51.100.1
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up echo 1 > /proc/sys/net/ipv4/conf/eno0/proxy_arp


auto vmbr0
iface vmbr0 inet static
        address  203.0.113.17/28
        bridge-ports none
        bridge-stp off
        bridge-fd 0

伪装(NAT)与 `iptables

伪装允许只有私有IP地址的客户端通过使用宿主机的IP地址来访问网络,用于外发流量。每个外发数据包都会被`iptables`重写,使其看起来像是从宿主机发出的,并且相应的回应也会被相应重写,以便路由到原始发送者。

auto lo
iface lo inet loopback

auto eno1
#real IP address
iface eno1 inet static
        address  198.51.100.5/24
        gateway  198.51.100.1

auto vmbr0
#private sub network
iface vmbr0 inet static
        address  10.10.10.1/24
        bridge-ports none
        bridge-stp off
        bridge-fd 0

post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up   iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o eno1 -j MASQUERADE
Note
在一些启用了防火墙的伪装设置中,可能需要为出站连接配置连接跟踪区域。否则,由于防火墙可能会优先选择虚拟机桥接的 POSTROUTING(而不是`MASQUERADE`),因此它可能会阻止出站连接。

/etc/network/interfaces 中添加这些行可以解决这个问题:

post-up   iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1

有关此内容的更多信息,请参阅以下链接:

Linux 绑定

绑定(也称为NIC teaming或Link Aggregation)是一种将多个网络接口卡(NIC)绑定到单个网络设备的技术。可以通过它实现不同的目标,如使网络具有容错能力、提升性能或同时实现这两者。

高速硬件如光纤通道及相关的交换硬件可能非常昂贵。通过进行链路聚合,两个网络接口卡(NICs)可以表现为一个逻辑接口,从而实现双倍速度。这是一个原生的Linux内核特性,大多数交换机都支持它。如果你的节点有多个以太网端口,你可以通过将网络电缆连接到不同的交换机来分散故障点,而且在出现网络问题时,绑定连接将实现到另一根电缆的故障转移。

聚合链接可以减少实时迁移的延迟并提高数据在Proxmox VE集群节点之间复制的速度。

有7种键合模式:

  • 循环轮询(balance-rr): 按照顺序从第一个可用的网络接口(NIC)从站传输网络包,直至最后一个。这种模式提供了负载均衡和容错能力。

  • 主动-备份 (active-backup)模式: 在绑定中只有一个NIC从设备处于活动状态。仅当活动从设备失败时,另一个从设备才会变成活动状态。单个逻辑绑定接口的MAC地址在网络上仅通过一个NIC(端口)外部可见,以避免在网络交换中产生失真。这种模式提供了容错能力。

  • XOR (balance-xor): 根据 [(源 MAC 地址与目的 MAC 地址的异或值) 模 NIC 从设备计数] 传输网络数据包。这种模式为每个目标 MAC 地址选择相同的 NIC 从设备。该模式提供了负载均衡和容错能力。

  • 广播 (broadcast): 在所有从属网络接口上发送网络数据包。这种模式提供了故障容错能力。

  • *IEEE 802.3ad 动态链路聚合(802.3ad)(LACP):*创建共享相同速度和双工设置的聚合组。根据802.3ad规范,利用活动聚合器组中的所有从属网络接口。

  • 自适应传输负载均衡(balance-tlb): Linux绑定驱动模式,不需要任何特殊的网络交换机支持。根据每个网络接口从设备当前的负载(相对于速度计算)分配出站网络数据包流量。入站流量由当前指定的从设备网络接口接收。如果这个接收从设备失败,另一个从设备接管失败的接收从设备的MAC地址。

  • 适应性负载均衡(balance-alb):包括了平衡传输负载均衡(balance-tlb)以及用于IPv4流量的接收负载均衡(rlb),而且不需要任何特殊的网络交换机支持。接收负载均衡是通过ARP协商来实现的。绑定驱动程序截取本地系统发送出去的ARP应答,在其传输过程中重写源硬件地址,用单一逻辑绑定接口中的一个NIC从设备的唯一硬件地址来替换,以此让不同的网络对等点为其网络数据包流量使用不同的MAC地址。

如果您的交换机支持LACP(IEEE 802.3ad)协议,那么我们推荐使用相应的绑定模式(802.3ad)。否则,您通常应该使用活动-备份模式。

对于集群网络(Corosync),我们推荐使用多个网络进行配置。Corosync不需要网络冗余的绑定,因为如果一个网络变得不可用,它可以自己在网络之间切换。

以下债券配置可以用作分布式/共享存储网络。其优势在于您将获得更高的速度,且网络将具有容错能力。

示例:使用具有固定IP地址的绑定
auto lo
iface lo inet loopback

iface eno1 inet manual

iface eno2 inet manual

iface eno3 inet manual

auto bond0
iface bond0 inet static
      bond-slaves eno1 eno2
      address  192.168.1.2/24
      bond-miimon 100
      bond-mode 802.3ad
      bond-xmit-hash-policy layer2+3

auto vmbr0
iface vmbr0 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1
        bridge-ports eno3
        bridge-stp off
        bridge-fd 0

另一种可能性是直接将bond作为桥接端口使用。这可以用来使来宾网络具有容错能力。

示例:使用一个债券作为桥接端口
auto lo
iface lo inet loopback

iface eno1 inet manual

iface eno2 inet manual

auto bond0
iface bond0 inet manual
      bond-slaves eno1 eno2
      bond-miimon 100
      bond-mode 802.3ad
      bond-xmit-hash-policy layer2+3

auto vmbr0
iface vmbr0 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1
        bridge-ports bond0
        bridge-stp off
        bridge-fd 0

VLAN 802.1Q

虚拟局域网(VLAN)是在网络的第二层被划分和隔离的广播域。因此,在一个物理网络中可以拥有多个网络(多达4096个),它们彼此相互独立。

每个VLAN网络通过一个通常称为“标签”的数字来识别。然后网络数据包会被“标记”以识别它们属于哪一个虚拟网络。

VLAN用于访客网络

{pve} 默认支持此设置。您可以在创建虚拟机时指定VLAN标签。VLAN标签是客户端网络配置的一部分。网络层支持不同的模式来实现VLAN,具体取决于桥接配置:

  • '''Linux桥接的VLAN透传:在这种情况下,每个客户机的虚拟网卡都会被分配一个VLAN标签,这个标签由Linux桥接透明支持。Trunk模式也是可能的,但这需要在客户机中进行配置。'''

  • 在Linux桥接中的“传统”VLAN:与VLAN识别方法相比,这种方法并不透明,并为每个VLAN创建一个带有关联桥接的VLAN设备。也就是说,举例来说,为VLAN 5创建一个客户端,将会创建两个接口eno1.5和vmbr0v5,并且这些接口将保持存在直到重启发生。

  • Open vSwitch VLAN: 这种模式使用了OVS VLAN特性。

  • 既定客户端配置的VLAN:VLAN在客户端内部分配。在这种情况下,设置完全在客户端内部完成,无法从外部受到影响。其优势在于,您可以在单个虚拟网络接口卡上使用不止一个VLAN。

主机上的VLAN

要允许主机与隔离网络进行通信,可以对任何网络设备(NIC、Bond、Bridge)应用VLAN标签。通常,你应该在与物理网卡之间抽象层次最少的接口上配置VLAN。

例如,在默认配置中,您希望将主机管理地址放置在一个单独的VLAN上。

示例:使用 VLAN 5 作为 {pve} 管理 IP,采用传统 Linux 桥接方式
auto lo
iface lo inet loopback

iface eno1 inet manual

iface eno1.5 inet manual

auto vmbr0v5
iface vmbr0v5 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1
        bridge-ports eno1.5
        bridge-stp off
        bridge-fd 0

auto vmbr0
iface vmbr0 inet manual
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0
示例:使用VLAN 5作为具有VLAN感知的Linux桥的{pve}管理IP。
auto lo
iface lo inet loopback

iface eno1 inet manual


auto vmbr0.5
iface vmbr0.5 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1

auto vmbr0
iface vmbr0 inet manual
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094

下一个例子是相同的设置,但是使用了一个债券来使这个网络安全可靠。

示例:使用传统的Linux桥将VLAN 5与bond0结合起来,用于{pve}管理IP。
auto lo
iface lo inet loopback

iface eno1 inet manual

iface eno2 inet manual

auto bond0
iface bond0 inet manual
      bond-slaves eno1 eno2
      bond-miimon 100
      bond-mode 802.3ad
      bond-xmit-hash-policy layer2+3

iface bond0.5 inet manual

auto vmbr0v5
iface vmbr0v5 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1
        bridge-ports bond0.5
        bridge-stp off
        bridge-fd 0

auto vmbr0
iface vmbr0 inet manual
        bridge-ports bond0
        bridge-stp off
        bridge-fd 0

在节点上禁用IPv6

{pve} 在所有环境中都能正确工作,无论是否部署了 IPv6。我们建议保留所有提供的默认设置。

如果您仍然需要在节点上禁用对IPv6的支持,请通过创建一个合适的`sysctl.conf (5)片段文件并设置适当的https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt[sysctls]来完成,例如添加/etc/sysctl.d/disable-ipv6.conf`文件,并填充以下内容:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

这种方法比在内核命令行上禁用加载IPv6模块更受欢迎。可以参考https://www.kernel.org/doc/Documentation/networking/ipv6.rst上的文档。

在桥接上禁用MAC地址学习

默认情况下,桥接上启用了MAC学习,以确保虚拟客户及其网络的顺畅体验。

但在某些环境中,这可能是不受欢迎的。从 {pve} 7.3 版本开始,您可以通过在 /etc/network/interfaces 文件中的桥接配置上设置 bridge-disable-mac-learning 1 来禁用桥接上的 MAC 地址学习,例如:

# ...

auto vmbr0
iface vmbr0 inet static
        address  10.10.10.2/24
        gateway  10.10.10.1
        bridge-ports ens18
        bridge-stp off
        bridge-fd 0
        bridge-disable-mac-learning 1

一旦启用,{pve} 将手动将 VM 和容器配置的 MAC 地址添加到桥接的转发数据库中,以确保客户端仍然可以使用网络 - 但前提是他们使用的是他们实际的 MAC 地址。