网络配置
'''{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 (eth0
、eth1
、…)。这种命名方案用于在 5.0 版本之前安装的 {pve} 主机。升级到 5.0 版本时,这些名称将被保持原样。 -
桥接名称:
vmbr[N]
,其中 0 ≤ N ≤ 4094 (vmbr0
-vmbr4094
) -
债券:
bond[N]
,其中 0 ≤ N(bond0
,bond1
, …) -
VLAN:只需要在设备名称后加上VLAN编号,中间用一个英文句号隔开(例如
eno1.50
、bond1.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不需要网络冗余的绑定,因为如果一个网络变得不可用,它可以自己在网络之间切换。
以下债券配置可以用作分布式/共享存储网络。其优势在于您将获得更高的速度,且网络将具有容错能力。
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上。
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
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
下一个例子是相同的设置,但是使用了一个债券来使这个网络安全可靠。
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 地址。