软件定义网络(SDN)功能在 {pve} 中可以实现虚拟区域和网络(VNet)的创建。该功能简化了高级网络配置和多租户设置。

引言

The {pve} SDN允许通过灵活的软件控制配置来分离和精细控制虚拟客户网络。

分隔是通过*区域*、虚拟网络(VNet)和*子网*来管理的。区域是其自己虚拟分隔的网络区域。VNet是属于某个区域的虚拟网络。子网是VNet内的IP范围。

根据区域的类型,网络的行为表现不同,并提供特定的功能、优势和限制。

SDN的使用案例从每个独立节点上的隔离私有网络,到不同位置的多个PVE集群上复杂的叠加网络。

在集群范围的数据中心SDN管理界面配置了一个VNet后,它将作为一个公共的Linux桥接,在每个节点上本地可用,以分配给虚拟机和容器。

支持状态

历史

自2019年以来,{pve} SDN堆栈作为实验性功能提供,并一直被许多开发者和用户持续改进和测试。随着其在{pve} 6.2中集成到web界面,向更广泛集成迈出了重要一步。在{pve} 7的发布周期中,添加了许多改进和功能。基于用户反馈,显然基本的设计选择及其实现是相当稳固和稳定的。因此,将其标记为`实验性’并不能公正地反映SDN堆栈的状态。对于{pve} 8,做出了一个决定,通过将网络和接口的管理提升为{pve}访问控制堆栈的核心组件,为SDN功能的完全集成奠定基础。在{pve} 8.1中,实现了两个主要里程碑:首先,将DHCP集成添加到IP地址管理(IPAM)功能中,其次,SDN集成现在默认安装。

当前状态

我们SDN安装的各层当前支持状态如下:

  • 核心SDN,包括VNet管理及其与{pve}堆栈的集成,得到了全面支持。

  • IPAM(包括虚拟客户机的DHCP管理)正在技术预览中。

  • 通过FRRouting和控制器集成的复杂路由正在技术预览中。

安装

SDN 核心

自{pve} 8.1起,默认安装了核心软件定义网络(SDN)包。

如果您从较旧的版本升级,您需要在每个节点上安装 libpve-network-perl 包:

apt update
apt install libpve-network-perl
Note
{pve}版本7.0及以上默认安装了`ifupdown2`包。如果您最初使用的是较旧的版本安装系统,您需要明确安装`ifupdown2`包。

安装完成后,您需要确保在所有节点的`/etc/network/interfaces`配置文件末尾都包含以下行,以便包含并激活SDN配置。

source /etc/network/interfaces.d/*

动态主机配置协议 IP地址管理

DHCP集成到内置的’PVE' IP地址管理堆栈中目前使用`dnsmasq`来分配DHCP租约。这目前是可选的。

要使用那个功能,你需要在每个节点上安装`dnsmasq`包:

apt update
apt install dnsmasq
# disable default instance
systemctl disable --now dnsmasq

FRRouting

The {pve} SDN stack 使用 FRRouting 项目来进行高级设置。这目前是可选加入的。

要使用SDN路由集成,您需要在所有节点上安装`frr-pythontools`包:

apt update
apt install frr-pythontools

配置概览

配置在数据中心级别的Web界面进行,分为以下几个部分:

软件定义网络

在这里,您可以获得当前活跃的SDN状态的概览,并且您可以将所有待定的更改应用到整个集群上。

  • Zones: 创建并管理虚拟分隔的网络区域

  • VNets VNets: 创建虚拟网络桥接并管理子网

“选项”类别允许添加和管理在您的SDN设置中使用的额外服务。

  • 控制器:用于在复杂设置中控制第3层路由

  • DHCP:为一个区域定义一个DHCP服务器,该服务器将自动为IPAM中的客户分配IP,并通过DHCP将它们租赁给客户。

  • IPAM:为客户提供外部IP地址管理启用功能

  • DNS:定义DNS服务器集成,用于注册虚拟客户端的主机名和IP地址

技术与配置

The {pve} Software-Defined Network实现尽可能多地使用标准Linux网络。这样做的原因是,现代Linux网络提供了几乎所有功能齐全的SDN实现所需的功能,避免了增加外部依赖,并减少了可能出故障的总组件数量。

{pve} SDN配置位于`/etc/pve/sdn`中,该配置通过{pve} 配置文件系统与所有其他集群节点共享。这些配置会被转换成管理底层网络堆栈的工具(例如`ifupdown2`或`frr`)所需的相应配置格式。

新改动不会立即生效,而是首先被记录为待处理的。您随后可以在网页界面的主要“SDN”概览面板中一次性应用一组不同的更改。这个系统允许将各种改动作为一个单一的原子操作来推出。

SDN通过位于'/etc/pve/sdn’中的'.running-config’和'.version’文件跟踪已部署的状态。

区域

区域定义了一个虚拟分隔的网络。区域被限制在特定的节点上并分配权限,以限制用户只能访问某个区域及其包含的虚拟网络。

不同的技术可用于分离:

  • 简单:孤立桥接。一个简单的第三层路由桥接(NAT)

  • VLAN:虚拟局域网是划分局域网的经典方法。

  • QinQ:堆叠VLAN(正式名为`IEEE 802.1ad`)

  • VXLAN:通过UDP隧道的第二层VXLAN网络

  • EVPN (BGP EVPN): 利用BGP和VXLAN建立第三层路由

常见选项

以下选项适用于所有区域类型:

节点

区域和关联的虚拟网络应部署在哪些节点上。

IP 地址管理

使用IP地址管理(IPAM)工具来管理区域内的IP地址。可选,默认值为`pve`。

域名系统

DNS API服务器。可选的。

逆向DNS

反向DNS API服务器。可选的。

DNS区域

DNS 域名。用于注册主机名,例如 <hostname>.<domain>。DNS 区域必须已经存在于 DNS 服务器上。可选的。

简单区域

这是最简单的插件。它将创建一个隔离的VNet桥接。这个桥接不连接到物理接口,且VM流量仅在每个节点上是局部的。它可以用于NAT或路由设置。

VLAN区域

VLAN 插件使用现有本地Linux或OVS桥接以连至节点的物理接口。它使用在VNet中定义的VLAN标签来隔离网络段。这允许不同节点之间的虚拟机进行连接。

VLAN 区域配置选项:

桥梁

本地桥或OVS交换机,已经在*每个*节点上配置,允许节点之间的连接。

QinQ 区域

QinQ,又称为VLAN叠加,它使用多层VLAN标签进行隔离。QinQ区域定义了外部VLAN标签(称为“服务VLAN”),而内部VLAN标签由VNet定义。

Note
在这种配置中,你的物理网络交换机必须支持堆叠VLANs。

QinQ 区域配置选项:

桥梁

一个已在每个本地节点上配置的本地VLAN感知桥。

服务VLAN

这个区域的主VLAN标签

服务VLAN协议

允许您在802.1q(默认)或802.1ad服务VLAN类型之间选择。

最大传输单元

由于标签的双重叠加,您需要为QinQ VLANs额外增加4个字节。例如,如果您的物理接口MTU是`1500`,那么您必须将MTU降低到`1496`。

VXLAN 区域

VXLAN插件在现有网络(下层网络)之上建立了一个隧道(覆盖网络)。这通过使用默认目的端口`4789`,将第2层以太网帧封装在第4层UDP数据报文中。

你必须自己配置底层网络,以实现所有节点之间的UDP连接。

例如,您可以在公共互联网之上创建一个VXLAN覆盖网络,对虚拟机来说,就好像它们共享同一个本地第2层网络。

Warning
VXLAN本身不提供任何加密。当通过VXLAN连接多个站点时,确保在站点之间建立安全连接,例如使用站点到站点的VPN。

VXLAN区域配置选项:

同行地址列表

VXLAN 区域中每个节点的 IP 地址列表。这可以是在此 IP 地址处可达的外部节点。群集中的所有节点都需要在此处提及。

最大传输单元

因为VXLAN封装使用了50字节,所以MTU需要比外出物理接口低50字节。

EVPN 区域

EVPN区域创建了一个可路由的第3层网络,能够跨越多个集群。这是通过建立一个VPN并使用BGP作为路由协议来实现的。

EVPN的VNet可以拥有一个任播IP地址和/或MAC地址。每个节点上的桥接IP是相同的,这意味着虚拟客户可以使用这个地址作为网关。

路由可以通过VRF(虚拟路由和转发)接口,在不同区域的虚拟网络之间工作。

EVPN区域配置选项:

虚拟路由转发 VXLAN 标识

用于VNets之间专用路由互连的VXLAN-ID。它必须与VNets的VXLAN-ID不同。

控制器

用于该区域的EVPN控制器。(参见控制器插件部分)。

VNet MAC地址

分配给此区域中所有VNet的Anycast MAC地址。如果未定义,将自动生成。

出口节点

应配置为从EVPN网络通过真实网络退出网关的节点。配置的节点将在EVPN网络中宣布一条默认路由。可选。

主出口节点

如果您使用多个出口节点,请通过这个主要出口节点强制路由流量,而不是在所有节点上进行负载均衡。这是可选的,但如果您想使用SNAT或者您的上游路由器不支持ECMP,这是必要的。

出口节点本地路由

如果您需要从一个出口节点访问VM/CT服务,这是一个特殊选项。(默认情况下,出口节点仅允许在真实网络和EVPN网络之间转发流量)。可选。

宣传子网

在EVPN网络中宣布完整的子网。如果您有静默的虚拟机/容器技术(例如,如果您有多个IP地址且任播网关未看到这些IP地址的流量,那么在EVPN网络内将无法访问这些IP地址)。可选。

关闭ARP ND抑制功能

不要抑制ARP或ND(邻居发现)包。如果你在虚拟机中使用浮动IP(IP和MAC地址在系统间移动),这是必需的。可选。

路由目标导入

允许您导入一系列外部EVPN路由目标。用于跨数据中心或不同EVPN网络的互联。可选的。

最大传输单元

因为VXLAN封装需要使用50字节,所以MTU需要比出口物理接口的最大MTU少50字节。可选,缺省值为1450。

虚拟网络

通过SDN GUI创建虚拟网络(VNet)后,每个节点上都会有一个同名的本地网络接口可用。要将客户机连接到VNet,将接口分配给客户机并相应地设置IP地址。

根据区域的不同,这些选项有不同的含义,并在本文档的相应区域部分进行了解释。

Warning
在当前状态下,某些选项可能没有效果,或者在某些区域内无法工作。

VNet配置选项:

身份证件号码

用于标识VNet的最多8个字符的ID

评论

更具描述性的标识符。作为接口上的别名分配。可选的。

区域

与此VNet相关的区域

标签

唯一的VLAN或VXLAN ID

VLAN Aware 可翻译为 "VLAN 感知"

在接口上启用VLAN感知选项,允许在客户端进行配置。

子网

子网定义了一个特定的IP范围,该范围通过CIDR网络地址描述。每个VNet(虚拟网络),可以有一个或多个子网。

子网可以用来:

  • 限制你可以在特定VNet上定义的IP地址

  • 在第三层区域的虚拟网络上分配路由/网关

  • 在第3层区域中启用VNet上的SNAT

  • 通过IPAM插件在虚拟客户机(VM或CT)上自动分配IP地址

  • 通过DNS插件进行DNS注册

如果一个IPAM服务器与子网区域相关联,子网前缀将会自动在IPAM中注册。

子网配置选项:

身份证件号码

一个CIDR网络地址,例如 10.0.0.0/8

网关

网络默认网关的IP地址。在第3层区域(简单/EVPN插件),它将部署在VNet上。

源地址转换

启用源NAT,允许来自VNet内部的虚拟机通过将数据包转发到节点的出站接口来连接到外部网络。在EVPN区域,转发是在EVPN网关节点上完成的。可选。

DNS区域前缀

给域名注册添加一个前缀,例如<hostname>.prefix.<domain>(可选的)。

控制器

一些区域实现了分离的控制平面和数据平面,这需要一个外部控制器来管理虚拟网络的控制平面。

目前,只有`EVPN`区域需要外部控制器。

EVPN控制器

EVPN区域需要一个外部控制器来管理控制平面。EVPN控制器插件用于配置Free Range Routing (frr) 路由器。

要启用EVPN控制器,您需要在每个将参与EVPN区域的节点上安装frr。

apt install frr frr-pythontools

EVPN控制器配置选项:

ASN编号

一个独特的BGP ASN号码。强烈推荐使用私有ASN号码(64512 – 65534, 4200000000 – 4294967294),否则您可能会无意中破坏全球路由。

同龄人

EVPN区域内所有节点的IP列表。(也可能是外部节点或路由反射服务器)

BGP控制器

BGP控制器不会直接被一个区域使用。你可以使用它来配置FRR以管理BGP对等体。

对于BGP-EVPN,它可以用来通过节点定义不同的ASN,从而进行EBGP。它也可以用来将EVPN路由导出到一个外部的BGP对等体。

Note
默认情况下,对于一个简单的完全网状EVPN,你不需要定义一个BGP控制器。

BGP控制器配置选项:

节点

这个BGP控制器的节点

ASN编号

一个独特的BGP ASN号码。强烈建议在(64512 - 65534)或(4200000000 - 4294967294)范围内使用私有ASN号码,否则您可能会不小心破坏全球路由。

同行

您想要通过底层BGP网络与之通信的对等IP地址列表。

外部边界网关协议

如果你的对等体的远程AS不同,这将启用EBGP。

环回接口

将环回或虚拟接口用作EVPN网络的源(用于多路径)。

EBGP多跳

增加到达对等节点的跳数,以防它们没有直接连接或者使用回环。

BGP多路径AS路径放宽

如果你的对等体有不同的ASN,请允许ECMP。

ISIS控制器

ISIS 控制器不会被一个区域直接使用。你可以使用它来配置 FRR,以将 EVPN 路由导出到一个 ISIS 域。

ISIS控制器配置选项:

节点

这个ISIS控制器的节点。

领域

一个独特的 ISIS 领域。

网络实体标题

一个独特的ISIS网络地址,用以识别这个节点。

接口

ISIS使用的物理接口列表。

环回

将环回或虚拟接口用作EVPN网络的源(用于多路径)。

IP 地址管理

IP地址管理(IPAM)工具管理网络上客户端的IP地址。例如,{pve}中的SDN使用IPAM来为新客户端找到空闲的IP地址。

单个IPAM实例可以与一个或多个区域关联。

PVE IPAM 插件

您{pve}集群的默认内置IPAM。

您可以通过数据中心配置的SDN部分中的IPAM面板检查PVE IPAM插件的当前状态。此界面可用于创建、更新和删除IP映射。与DHCP功能结合使用时,这特别方便。

如果您使用的是DHCP,您可以使用IPAM面板为特定的虚拟机创建或编辑租约,这使您能够更改通过DHCP分配的IP地址。当编辑正在使用DHCP的虚拟机的IP时,您必须确保强制客户端获取新的DHCP租约。这通常可以通过重新加载客户端的网络堆栈或重启客户端来完成。

NetBox IPAM 插件

链接:https://github.com/netbox-community/netbox[NetBox] 是一个开源的IP地址管理(IPAM)和数据中心基础设施管理(DCIM)工具。

要将NetBox与{pve} SDN集成,请按照这里的描述在NetBox中创建一个API令牌:https://docs.netbox.dev/en/stable/integrations/rest-api/#tokens

NetBox配置属性有:

统一资源定位符

NetBox REST API端点:`http://yournetbox.domain.com/api

令牌

一个API访问令牌

phpIPAM插件

在链接:https://phpipam.net/[phpIPAM] 中,你需要创建一个“应用程序”,并为该应用程序添加一个具有管理员权限的API令牌。

phpIPAM的配置属性是:

统一资源定位符

REST-API端点:`http://phpipam.domain.com/api/<appname>/

令牌

一个API访问令牌

章节

一个整数ID。区段是phpIPAM中一组子网。默认安装使用`sectionid=1`作为客户。

域名系统

{pve} SDN中的DNS插件用于定义DNS API服务器,以注册您的主机名和IP地址。一个DNS配置可以与一个或多个区域关联,以便为区域配置的所有子网IP提供DNS注册服务。

PowerDNS 插件

你需要在你的PowerDNS配置中启用web服务器和API:

api=yes
api-key=arandomgeneratedstring
webserver=yes
webserver-port=8081

PowerDNS配置选项有:

统一资源定位符

REST API端点:http://yourpowerdnserver.domain.com:8081/api/v1/servers/localhost

钥匙

一个API访问密钥

生存时间

记录的默认TTL(生存时间)

动态主机配置协议

{pve} SDN中的DHCP插件可用于自动部署区域的DHCP服务器。它为配置了DHCP范围的区域中的所有子网提供DHCP服务。目前,唯一可用的DHCP后端插件是dnsmasq插件。

DHCP插件的工作原理是在向VM/CT添加新的网络接口时,在配置在区域内的IPAM插件中分配一个IP。您可以在我们文档中的xref:pvesdn_config_ipam[相应章节]找到有关如何配置IPAM的更多信息。

当虚拟机启动时,MAC地址和IP的映射会在区域的DHCP插件中创建。当网络接口被移除或虚拟机/容器技术被销毁时,IP地址管理系统中的条目和DHCP服务器中的条目也会随之删除。

注意:某些功能(添加/编辑/删除IP映射)目前仅在使用xref:pvesdn_ipam_plugin_pveipam[PVE IPAM插件]时可用。


配置
~~~~~~~~~~~~~

您可以通过Web界面中的区域面板为某个区域启用自动DHCP,在区域的高级选项中启用DHCP。

注意:目前只有简单区域支持自动DHCP

在为一个区域启用了自动DHCP之后,需要为该区域中的子网配置DHCP范围。为此,请转到Vnets面板并选择您想要为其配置DHCP范围的子网。在编辑对话框中,您可以在相应的标签页中配置DHCP范围。或者,您还可以通过以下CLI命令为子网设置DHCP范围:

----
pvesh set /cluster/sdn/vnets/<vnet>/subnets/<subnet>
 -dhcp-range start-address=10.0.1.100,end-address=10.0.1.200
 -dhcp-range start-address=10.0.2.100,end-address=10.0.2.200
----

你的子网还需要配置一个网关,否则自动的DHCP将无法工作。

DHCP插件将只在配置的范围内在IPAM中分配IP地址。

不要忘记也跟随安装步骤来安装 xref:pvesdn_install_dhcp_ipam[dnsmasq DHCP 插件]。

插件
~~~~~~~

Dnsmasq 插件
^^^^^^^^^^^^^^
目前这是唯一的DHCP插件,因此当你为某个区域启用DHCP时,就会使用这个插件。

安装
有关安装,请参阅xref:pvesdn_install_dhcp_ipam[DHCP IPAM]部分。

.Configuration
插件将为dnsmasq部署到的每个区域创建一个新的systemd服务。服务的名称为`dnsmasq@<zone>`。这项服务的生命周期由DHCP插件管理。

该插件会自动在`/etc/dnsmasq.d/<zone>`文件夹中生成以下配置文件:

00-default.conf`文件:
这包含了dnsmasq实例的默认全局配置。

10-<zone>-<subnet_cidr>.conf`文件用于配置子网的特定选项,比如应该通过DHCP配置的DNS服务器。

10-<zone>-<subnet_cidr>.ranges.conf`::
该文件用于为dnsmasq实例配置DHCP范围。

ethers`::
这个文件包含了IPAM插件的MAC地址和IP映射。为了覆盖这些映射,请使用相应的IPAM插件,而不是编辑这个文件,因为它会被dnsmasq插件覆盖。

你不能编辑上述任何文件,因为它们是由 DHCP 插件管理的。为了自定义 dnsmasq 配置,你可以在配置文件夹中创建额外的文件(例如 `90-custom.conf`) - 这些文件不会被 dnsmasq DHCP 插件更改。

配置文件按顺序读取,因此你可以通过适当命名你的自定义配置文件来控制配置指令的顺序。

DHCP 租约存储在文件 `/var/lib/misc/dnsmasq.<zone>.leases` 中。

当使用 PVE IPAM 插件时,您可以更新、创建和删除 DHCP 租约。
有关更多信息,请参阅
xref:pvesdn_ipam_plugin_pveipam[the PVE IPAM 插件] 的文档。目前不支持更改其他 IPAM 插件的 DHCP 租约。

[[pvesdn_setup_examples]]
示例
--------

本节提供了针对常见SDN用例的多个配置示例。其目的是提供实际的实施方案,提供额外的细节以加深对可用配置选项的理解。


[[pvesdn_setup_example_simple]]
简单区域示例
~~~~~~

简单区域网络创建了一个隔离的网络,供单个主机上的客人相互连接。

TIP: 如果所有客户都驻留在同一主机上,则宾客之间的连接是可能的,但无法在其他节点上达到。

* 创建一个名为`simple`的简单区域。
* 添加一个名为`vnet1`的虚拟网络。
* 创建一个带有网关的子网,并启用SNAT选项。
* 这会在节点上创建一个名为 `vnet1` 的网络桥接。将这个桥接分配给需要加入网络的客户端,并配置一个IP地址。

两个虚拟机中的网络接口配置可能如下,这允许它们通过10.0.1.0/24网络进行通信。

----
allow-hotplug ens19
iface ens19 inet static
	address 10.0.1.14/24
----

----
allow-hotplug ens19
iface ens19 inet static
    address 10.0.1.15/24
----


[[pvesdn_setup_example_nat]]
源NAT示例
~~~~~~

如果你想允许在简单网络区域内的访客进行外部连接,简单区域提供了一个源网络地址转换(SNAT)选项。

从上述配置xref:pvesdn_setup_example_simple开始,向VNet `vnet1`添加一个子网,设置一个网关IP,并启用SNAT选项。

----
子网:172.16.0.0/24
网关:172.16.0.1
源地址转换(SNAT):已勾选
----

在客人中配置子网IP范围内的静态IP地址。

节点本身将使用网关IP '172.16.0.1' 加入此网络,并将作为位于子网范围内的访客的NAT网关功能。


[[pvesdn_setup_example_vlan]]
VLAN设置示例
~~~~~~~~

当不同节点上的虚拟机需要通过隔离的网络进行通信时,VLAN 区域允许使用 VLAN 标签进行网络级别的隔离。

创建一个名为`myvlanzone`的VLAN区域:

----
ID: myvlanzone
Bridge: vmbr0
----

创建一个名为`myvnet1`的VNet,其VLAN标签为10,并使用之前创建的`myvlanzone`。

----
ID: myvnet1
区域: myvlanzone
标签: 10
----

通过主SDN面板应用配置,在每个节点上本地创建VNet。

在节点node1上创建一个基于Debian的虚拟机('vm1'),其虚拟网络接口连接到`myvnet1`。

为此虚拟机使用以下网络配置:

----
auto eth0
iface eth0 inet static
	address 10.0.3.100/24
----

在node2上创建第二台虚拟机('vm2'),并在与vm1相同的虚拟网络`myvnet1`上配置一个虚拟网络接口。

为此虚拟机使用以下网络配置:

----
auto eth0
iface eth0 inet static
	address 10.0.3.101/24
----

在此之后,您应该能够使用那个网络在两个虚拟机之间进行ping操作。


[[pvesdn_setup_example_qinq]]
QinQ设置示例
~~~~~~~~


这个例子配置了两个QinQ区域,并且每个区域都加入了两个虚拟机,以此来展示额外一层的VLAN标签如何允许配置更多隔离的VLAN。

这种配置的典型用途是,托管服务提供商为客户提供一个隔离的网络以实现虚拟机之间的通信,但同时隔离了不同客户之间的虚拟机。

创建一个名为`qinqzone1`的QinQ区域,服务VLAN为20

----
ID: qinqzone1
Bridge: vmbr0
Service VLAN: 20
----

创建另一个名为`qinqzone2`的QinQ区域,其服务VLAN为30
----
ID:qinqzone2
桥接器:vmbr0
服务VLAN:30
----

在之前创建的`qinqzone1`区域上创建一个名为`myvnet1`的VNet,并设置VLAN-ID为100。

----
ID: qinqvnet1
Zone: qinqzone1
Tag: 100
----

在`qinqzone2`区域创建一个带有VLAN-ID 100的`myvnet2`。

----
ID: qinqvnet2
Zone: qinqzone2
Tag: 100
----

在主SDN网络接口面板上应用配置,在每个节点本地创建VNet。

创建四个基于Debian的虚拟机(vm1、vm2、vm3、vm4),并为vm1和vm2添加桥接`qinqvnet1`的网络接口,为vm3和vm4添加桥接`qinqvnet2`的网络接口。

在虚拟机内部,配置接口的IP地址,例如通过`/etc/network/interfaces`:

----
auto eth0
iface eth0 inet static
	address 10.0.3.101/24
----
// TODO: systemd-network example
将所有四个虚拟机的IP地址配置为从'10.0.3.101'到'10.0.3.104'的范围内。

现在你应该可以在虚拟机'vm1'和'vm2'之间,以及'vm3'和'vm4'之间进行ping通信。然而,任何一个'vm1'或'vm2'的虚拟机都不能ping通'vm3'或'vm4',因为它们位于不同的区域且拥有不同的服务VLAN。


[[pvesdn_setup_example_vxlan]]
VXLAN设置示例
~~~~~~~~~

该示例假设一个有三个节点的集群,节点的IP地址分别是192.168.0.1、192.168.0.2和192.168.0.3。

创建一个名为`myvxlanzone`的VXLAN区域,并将所有节点的IP地址添加到对等地址列表中。使用默认的MTU 1450,或者相应地进行配置。

----
ID: myvxlanzone
对等方地址列表: 192.168.0.1,192.168.0.2,192.168.0.3
----

创建一个名为 `vxvnet1` 的VNet,使用之前创建的VXLAN区域 `myvxlanzone`。

----
ID: vxvnet1
Zone: myvxlanzone
Tag: 100000
----

在主SDN网络接口面板上应用配置,以在每个节点上本地创建VNet。

在node1上创建一个基于Debian的虚拟机('vm1'),并配有一个位于`vxvnet1`上的虚拟网卡(vNIC)。

请为这个虚拟机使用以下网络配置(注意较低的MTU)。

----
auto eth0
iface eth0 inet static
	address 10.0.3.100/24
	mtu 1450
----

在node3上创建第二个虚拟机('vm2'),并使其虚拟网卡位于与vm1相同的虚拟网络`vxvnet1`上。

为此虚拟机使用以下网络配置:

----
auto eth0
iface eth0 inet static
	address 10.0.3.101/24
	mtu 1450
----

那么,你应该能够在'vm1'和'vm2'之间进行ping通。


[[pvesdn_setup_example_evpn]]
EVPN设置示例
~~~~~~~~

这个例子假设了一个具有三个节点(node1, node2, node3)的集群,其IP地址分别为192.168.0.1, 192.168.0.2和192.168.0.3.

创建一个EVPN控制器,使用一个私有ASN号码,并将上述节点地址作为对等体。

----
ID: myevpnctl
ASN#: 65000
Peers: 192.168.0.1,192.168.0.2,192.168.0.3
----

创建一个名为`myevpnzone`的EVPN区域,分配之前创建的EVPN控制器,并定义'node1'和'node2'为出口节点。

----
ID: myevpnzone
VRF VXLAN标签: 10000
控制器: myevpnctl
MTU: 1450
VNet MAC地址: 32:F4:05:FE:6C:0A
退出节点: node1,node2
----

使用EVPN区域 `myevpnzone` 创建名为 `myvnet1` 的第一个虚拟网络(VNet)。

----
ID: myvnet1
Zone: myevpnzone
Tag: 11000
----

在`myvnet1`上创建一个子网:

----
子网:10.0.1.0/24
网关:10.0.1.1
----

创建名为 `myvnet2` 的第二个虚拟网络,使用相同的 EVPN 区域 `myevpnzone`。

----
ID: myvnet2
区域: myevpnzone
标签: 12000
----

在`myvnet2`上创建一个不同的子网;

----
子网:10.0.2.0/24
网关:10.0.2.1
----

从主SDN网络界面面板应用配置,在每个节点上本地创建虚拟网络并生成FRR配置。

在节点node1上创建一个基于Debian的虚拟机('vm1'),其虚拟网络接口连接到`myvnet1`。

使用以下网络配置为 'vm1':

----
auto eth0
iface eth0 inet static
	address 10.0.1.100/24
	gateway 10.0.1.1
	mtu 1450
----

在节点node2上创建第二个虚拟机('vm2'),并在另一个虚拟网络`myvnet2`上配置一个虚拟网络接口卡(vNIC)。

请使用以下网络配置为'vm2':

----
auto eth0
iface eth0 inet static
	address 10.0.2.100/24
	gateway 10.0.2.1
	mtu 1450
----


现在你应该能够从vm1 ping到vm2,以及从vm2 ping到vm1。

如果你从非网关节点node3上的'vm2' ping一个外部IP,数据包将会发送到配置的'myvnet2' 网关,然后会被路由到出口节点('node1'或者'node2'),并且从那里通过在node1或node2上配置的默认网关离开这些节点。

NOTE: 您需要在外部网关上为'10.0.1.0/24'和'10.0.2.0/24'网络添加反向路由到node1和node2,以便公网能够回复。

如果你配置了一个外部的BGP路由器,在这个例子中BGP-EVPN路由(10.0.1.0/24 和 10.0.2.0/24),将会被动态宣告。


[[pvesdn_notes]]
笔记
--

多个EVPN出口节点
~~~~~~~~~~

如果您有多个网关节点,应该禁用`rp_filter`(严格反向路径过滤)选项,因为数据包可能从一个节点到达但从另一个节点离开。

将以下内容添加到 `/etc/sysctl.conf`:

-----
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
-----

VXLAN IPSEC 加密
~~~~~~~~~~~~~~

要在VXLAN上添加IPSEC加密,这个例子展示了如何使用`strongswan`。

您需要为IPv4额外减少60字节,或者为IPv6减少80字节的'MTU',以便处理加密。

所以,在默认的真实1500 MTU的情况下,你需要使用1370的MTU(1370 + 80(IPSEC)
+ 50 (VXLAN) == 1500).

在主机上安装strongswan。

----
apt install strongswan
----

将配置添加到 `/etc/ipsec.conf` 文件中。我们只需要加密来自 VXLAN UDP 端口 '4789' 的流量。

----
conn %default
    ike=aes256-sha1-modp1024!  # 最快的,但在现代硬件上相当安全的密码
    esp=aes256-sha1!
    leftfirewall=yes           # 使用Proxmox VE防火墙规则时这是必需的

conn output
    rightsubnet=%dynamic[udp/4789]
    right=%any
    type=transport
    authby=psk
    auto=route

conn input
    leftsubnet=%dynamic[udp/4789]
    type=transport
    authby=psk
    auto=route
----

使用以下方法生成一个预共享密钥:

----
openssl rand -base64 128
----

将密钥添加到`/etc/ipsec.secrets`文件中,使得文件内容如下所示:

----
: PSK <generatedbase64key>
----

将PSK(预共享密钥)和配置复制到参与VXLAN网络的所有节点。