软件定义网络(SDN)特性允许用户在数据中心级别创建虚拟网络(vnets)。

  1. 警告
  2. SDN目前是Proxmox VE的一个实验性功能。该文档还在开发中,请在我们的邮件列表或论坛1.10部分询问问题和反馈。

12.1、安装

要启用实验性的SDN集成,您需要安装“libpve-network-perl”包

apt install libpve-network-perl

您需要在每个节点上安装ifupdown2包,以管理本地配置重新加载,而不需要重新引导:

apt install ifupdown2

12.2、基本概述

Proxmox VE SDN允许使用灵活的软件控制配置对虚拟客户网络进行分离和细粒度控制。

隔离区由区域组成,一个区域就是它自己虚拟的网络隔离区。VNet是连接到区域的虚拟网络的一种。根据zone使用的类型或插件,它可以有不同的行为,并提供不同的特性、优点或缺点。通常,VNet是一个普通的Linux网桥,带有VLAN或VXLAN标签,但也有一些VNet可以使用第三层路由进行控制。从集群宽数据中心SDN管理接口提交配置后,vnet在每个节点上本地部署。

12.3、主配置

配置是在数据中心(集群范围)级别完成的,它将保存在共享配置文件系统:/etc/pve/sdn中的配置文件中

在web界面上SDN特性有4个主要的配置部分

  • SDN:对SDN网络状态的概述
  • 区域:创建和管理虚拟分离的网络区域
  • Nets:每个节点的构建块,为虚拟机提供一个分区
  • 控制器:用于复杂的设置,以控制层3路由

12.3.1、SDN

这是主状态面板。这里可以看到不同节点上分区的部署状态。有一个Apply按钮,用于在所有集群节点节点上推送和重新加载本地配置。

12.3.2、Zones

一个区域将定义一个实际上分开的网络。

它可以使用不同的技术进行分离:

  • VLAN:虚拟局域网是划分局域网的经典方法
  • QinQ:堆叠VLAN (ieee802.1 ad)
  • VXLAN:(二层VXLAN)
  • bgp-evpn: vxlan使用三层边界网关协议路由

您可以将一个区域限制为特定的节点。

还可以在一个区域上添加权限,以限制用户仅使用特定的区域和该区域中的vnet

12.3.3、VNets

VNet的基本形式是一个Linux桥,它将在节点上本地部署,用于虚拟机通信。

联接属性是:

  • ID: 8个字符的ID,用于命名和识别VNet
  • Alias:如果ID不够,可选较长的名称
  • Zone:这个VNet关联的Zone
  • Tag:唯一的VLAN或VXLAN id
  • VLAN感知:允许在虚拟机或容器vNIC配置中添加额外的VLAN标签,或允许客户操作系统管理VLAN的标签。
  • Pv4:一个任播IPv4地址,它将被配置在区域的每个节点的底层桥上。仅适用于bgp-evpn路由。
  • IPv6:一个任播IPv6地址,它将被配置在区域的每个节点的底层桥上。仅适用于bgp-evpn路由。

  • 12.3.4、控制器

一些区域类型需要一个外部控制器来管理VNet控制平面。目前仅在bgp-evpn zone插件中需要配置。

12.4、区(zones)插件

12.4.1、常见的选项

nodes
仅在这些节点上部署并允许使用为该Zone配置的VNets。

12.4.2、VLAN Zones

这是最简单的插件,它将重用现有的本地Linux或OVS桥,并在其上管理vlan。使用SDN模块的好处是可以使用特定的VNets VLAN tag创建不同的区域,并将虚拟机限制在不同的区域内。

具体的VLAN配置选项:

bridge
重用已经在每个本地节点上配置的本地桥接器或OVS交换机。

12.4.3、QinQ Zones

QinQ是堆叠VLAN。第一个VLAN标签定义为zone(即service-vlan),第二个VLAN标签定义为vnets

请注意
您的物理网络交换机必须支持堆叠的vlan !

具体的QinQ配置选项:

bridge
在每个本地节点上已经配置了一个支持本地vlan的桥

service vlan
该区域的主VLAN标签

mtu
由于标签的双重堆叠,QinQ vlan需要多4个字节。例如,如果物理接口MTU为1500,则可以将MTU减为1496。

12.4.4、VXLAN Zones

VXLAN插件将在现有网络(名为underlay)的基础上建立一条隧道(名为overlay)。它在第4层UDP数据报中封装第2层以太网帧,使用4789作为默认目的端口。例如,在公网internet节点上创建私有IPv4 VXLAN网络。这是一个二层隧道,不同的vnet之间没有路由是可能的。

每个VNet将使用特定的VXLAN id范围(1 - 16777215)。

具体的EVPN配置选项:

peers address list:同行地址列表
您想要通信的所有节点的IPs列表。也可以是外部节点。

mtu
由于VXLAN封装使用50字节,所以MTU需要比出接口的物理接口低50字节。

12.4.5、EVPN Zones

这是所有支持的插件中最复杂的一个。

BGP-EVPN允许创建路由可达的三层网络。vpn的VNet可以是任意播IP地址和任意播mac地址。网桥IP在每个节点上都是相同的,因此虚拟客户可以使用该地址作为网关。

通过一个VRF (Virtual Routing and Forwarding)接口,路由可以在不同区域的vnet之间工作。

具体的EVPN配置选项:

VRF VXLAN Tag
vxlan-id,用于vnet之间的路由对接,不能与vnet中的vxlan-id相同

controller
需要先定义EVPN-controller(参见controller plugins部分)

mtu
由于VXLAN封装使用50字节,所以MTU需要比出接口的物理接口低50字节。

12.5、控制插件

用于需要控制平面的复杂区域。

12.5.1、EVPN控制器

对于BGP-EVPN,我们需要一个控制器来管理控制平面。目前支持的软件控制器是“frr”路由器。您可能需要在希望部署EVPN分区的每个节点上安装它。

apt install frr

配置选项:

asn
唯一的BGP ASN号。强烈建议使用私有ASN编号(64512 - 65534,4200000000 - 4294967294),否则你可能会因全局路由错误而中断或被破坏。

peers
您想要通信的所有节点的ip列表(也可以是外部节点或路由反射器服务器)

另外,如果你想把流量从SDN BGP-EVPN网络路由到外部世界:

gateway-nodes
bgp-evpn流量将从proxmox节点通过节点默认网关出口到外部

gateway-external-peers
如果你希望网关节点不使用默认网关,但是,例如,发送流量到外部BGP路由器,它处理(反向)路由,然后你可以使用动态。例如“192.168.0.253,192.168.0.254”

12.6、本地部署监控

通过主SDN web-interface面板应用配置后,本地网络配置会在/etc/network/interfaces.d/sdn文件中在每个节点本地生成并重新加载ifupdown2。

你需要添加

source /etc/network/interfaces.d/*

在/etc/network/interfaces的末尾包含sdn配置

通过主树可以监控local zone和vnet的状态。

12.7、VLAN配置示例

  1. 提示
  2. 虽然我们在这里显示的是普通的配置内容,但几乎所有内容都应该使用web界面进行配置


Node1: /etc/network/interfaces**

  1. auto vmbr0
  2. iface vmbr0 inet manual
  3. bridge-ports eno1
  4. bridge-stp off
  5. bridge-fd 0
  6. bridge-vlan-aware yes
  7. bridge-vids 2-4094
  8. #management ip on vlan100
  9. auto vmbr0.100
  10. iface vmbr0.100 inet static
  11. address 192.168.0.1/24
  12. source /etc/network/interfaces.d/*


Node2: /etc/network/interfaces**

  1. auto vmbr0
  2. iface vmbr0 inet manual
  3. bridge-ports eno1
  4. bridge-stp off
  5. bridge-fd 0
  6. bridge-vlan-aware yes
  7. bridge-vids 2-4094
  8. #management ip on vlan100
  9. auto vmbr0.100
  10. iface vmbr0.100 inet static
  11. address 192.168.0.2/24
  12. source /etc/network/interfaces.d/*

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

id: myvlanzone
bridge: vmbr0

创建一个名为“ myvnet1”的VNet,并带有“ vlan-id” 10,并将先前创建的“ myvlanzone”作为其区域。

id: myvnet1
zone: myvlanzone
tag: 10

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

在node1上创建基于Debian的虚拟机(vm1),并在“ myvnet1”上创建vNIC。

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

  1. auto eth0
  2. iface eth0 inet static
  3. address 10.0.3.100/24

在node2上创建第二个虚拟机(vm2),并将vNIC与vm1放在同一VNet“ myvnet1”上。

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

  1. auto eth0
  2. iface eth0 inet static
  3. address 10.0.3.101/24

然后,您应该能够在该网络上的两个VM之间执行ping操作。

12.8、QinQ配置示例

  1. Tip
  2. 虽然我们在此处显示简单的配置内容,但是几乎所有内容都只能使用Web界面进行配置。

node1:/etc/network/interfaces

  1. auto vmbr0
  2. iface vmbr0 inet manual
  3. bridge-ports eno1
  4. bridge-stp off
  5. bridge-fd 0
  6. bridge-vlan-aware yes
  7. bridge-vids 2-4094
  8. #management ip on vlan100
  9. auto vmbr0.100
  10. iface vmbr0.100 inet static
  11. address 192.168.0.1/24
  12. source /etc/network/interfaces.d/*

node2:/etc/network/interfaces

  1. auto vmbr0
  2. iface vmbr0 inet manual
  3. bridge-ports eno1
  4. bridge-stp off
  5. bridge-fd 0
  6. bridge-vlan-aware yes
  7. bridge-vids 2-4094
  8. #management ip on vlan100
  9. auto vmbr0.100
  10. iface vmbr0.100 inet static
  11. address 192.168.0.2/24
  12. source /etc/network/interfaces.d/*

使用服务VLAN 20创建名为“ qinqzone1”的QinQ区域

id: qinqzone1
bridge: vmbr0
service vlan: 20

使用服务VLAN 30创建另一个名为“ qinqzone2”的QinQ区域

id: qinqzone2
bridge: vmbr0
service vlan: 30

在先前创建的“ qinqzone1”区域上创建一个名为myvnet1的vNet,客户vlan-id为100。

id: myvnet1
zone: qinqzone1
tag: 100

在先前创建的“ qinqzone2”区域上创建一个具有客户VLAN-id 100的“ myvnet2”。

id: myvnet2
zone: qinqzone2
tag: 100

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

在node1上创建基于Debian的虚拟机(vm1),并在“ myvnet1”上创建vNIC。

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

  1. auto eth0
  2. iface eth0 inet static
  3. address 10.0.3.100/24

在node2上创建第二个虚拟机(vm2),并将vNIC与vm1放在同一VNet“ myvnet1”上。

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

  1. auto eth0
  2. iface eth0 inet static
  3. address 10.0.3.101/24

在node1上创建第三个虚拟机(vm3),在另一个VNet“ myvnet2”上创建一个vNIC。

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

  1. auto eth0
  2. iface eth0 inet static
  3. address 10.0.3.102/24

在node2上创建另一个虚拟机(vm4),并将vNIC与vm3放在同一VNet“ myvnet2”上。

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

  1. auto eth0
  2. iface eth0 inet static
  3. address 10.0.3.103/24

然后,您应该能够在虚拟机vm1和vm2之间,以及vm3和vm4之间进行ping操作。 但是,VM vm1或vm2都不能ping通VM vm3或vm4,因为它们位于具有不同service-vlan的不同区域中。

12.9、VXLAN配置示例

  1. tip
  2. 虽然我们在此处显示简单的配置内容,但是几乎所有内容都只能使用Web界面进行配置。

node1: /etc/network/interfaces

  1. auto vmbr0
  2. iface vmbr0 inet static
  3. address 192.168.0.1/24
  4. gateway 192.168.0.254
  5. bridge-ports eno1
  6. bridge-stp off
  7. bridge-fd 0
  8. mtu 1500
  9. source /etc/network/interfaces.d/*


node2: /etc/network/interfaces**

  1. auto vmbr0
  2. iface vmbr0 inet static
  3. address 192.168.0.2/24
  4. gateway 192.168.0.254
  5. bridge-ports eno1
  6. bridge-stp off
  7. bridge-fd 0
  8. mtu 1500
  9. source /etc/network/interfaces.d/*


node3: /etc/network/interfaces**

  1. auto vmbr0
  2. iface vmbr0 inet static
  3. address 192.168.0.3/24
  4. gateway 192.168.0.254
  5. bridge-ports eno1
  6. bridge-stp off
  7. bridge-fd 0
  8. mtu 1500
  9. source /etc/network/interfaces.d/*

创建一个名为“ myvxlanzone”的VXLAN区域,使用较低的MTU确保VXLAN标头的额外50个字节可以容纳。 将节点中所有先前配置的IP添加为对等地址列表。

id: myvxlanzone
peers address list: 192.168.0.1,192.168.0.2,192.168.0.3
mtu: 1450

使用之前创建的VXLAN区域“ myvxlanzone”创建一个名为“ myvnet1”的VNet。

id: myvnet1
zone: myvxlanzone
tag: 100000

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

在node1上创建基于Debian的虚拟机(vm1),并在“ myvnet1”上创建vNIC。

为此虚拟机使用以下网络配置,请在此处注意较低的MTU。

  1. auto eth0
  2. iface eth0 inet static
  3. address 10.0.3.100/24
  4. mtu 1450

在node3上创建第二个虚拟机(vm2),并将vNIC与vm1放在同一VNet“ myvnet1”上。

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

  1. auto eth0
  2. iface eth0 inet static
  3. address 10.0.3.101/24
  4. mtu 1450

然后,您应该能够在vm1和vm2之间进行ping操作。

12.10、EVPN配置示例

node1: /etc/network/interfaces

  1. auto vmbr0
  2. iface vmbr0 inet static
  3. address 192.168.0.1/24
  4. gateway 192.168.0.254
  5. bridge-ports eno1
  6. bridge-stp off
  7. bridge-fd 0
  8. mtu 1500
  9. source /etc/network/interfaces.d/*


node2 /etc/network/interfaces**

  1. auto vmbr0
  2. iface vmbr0 inet static
  3. address 192.168.0.2/24
  4. gateway 192.168.0.254
  5. bridge-ports eno1
  6. bridge-stp off
  7. bridge-fd 0
  8. mtu 1500
  9. source /etc/network/interfaces.d/*


node3: /etc/network/interfaces**

  1. auto vmbr0
  2. iface vmbr0 inet static
  3. address 192.168.0.3/24
  4. gateway 192.168.0.254
  5. bridge-ports eno1
  6. bridge-stp off
  7. bridge-fd 0
  8. mtu 1500
  9. source /etc/network/interfaces.d/*

创建一个EVPN控制器,使用一个私有ASN编号,并将上面的节点addreesses作为对等节点。 将node1和node2定义为网关节点。

  1. id: myevpnctl
  2. asn: 65000
  3. peers: 192.168.0.1,192.168.0.2,192.168.0.3
  4. gateway nodes: node1,node2

使用先前创建的EVPN控制器创建一个名为“ myevpnzone”的EVPN区域。

  1. id: myevpnzone
  2. vrf vxlan tag: 10000
  3. controller: myevpnctl
  4. mtu: 1450

使用EVPN区域“ myevpnzone”,IPv4 CIDR网络和随机MAC地址创建第一个名为“ myvnet1”的VNet。

  1. id: myvnet1
  2. zone: myevpnzone
  3. tag: 11000
  4. ipv4: 10.0.1.1/24
  5. mac address: 8C:73:B2:7B:F9:60 #random generate mac address

使用与“ myvnet1”相同的EVPN区域“ myevpnzone”,不同的IPv4 CIDR网络和不同的随机MAC地址创建第二个名为“ myvnet2”的VNet。

  1. id: myvnet2
  2. zone: myevpnzone
  3. tag: 12000
  4. ipv4: 10.0.2.1/24
  5. mac address: 8C:73:B2:7B:F9:61#random mac, need to be different on each vnet

在SDN Web界面主面板上应用配置,以在每个节点上本地创建VNet并生成FRR配置。

在node1上创建基于Debian的虚拟机(vm1),并在“ myvnet1”上创建vNIC。

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

  1. auto eth0
  2. iface eth0 inet static
  3. address 10.0.1.100/24
  4. gateway 10.0.1.1#this is the ip of the vnet1
  5. mtu 1450

在node2上创建第二个虚拟机(vm2),在另一个VNet“ myvnet2”上创建一个vNIC。

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

  1. auto eth0
  2. iface eth0 inet static
  3. address 10.0.2.100/24
  4. gateway 10.0.2.1#this is the ip of the vnet2
  5. mtu 1450

然后,您应该能够从vm1 ping vm2,并从vm2 ping vm1。

如果从非网关节点3上的vm2 ping外部IP,则数据包将转到配置的myvnet2网关,然后将路由到网关节点(节点1或节点2),并从那里将这些节点保留在配置的默认网关上 在node1或node2上。

  1. 注意
  2. 当然,您需要为外部网关上的node1node2添加10.0.1.0/2410.0.2.0/24网络的反向路由,以便公共网络可以回复。

如果您配置了外部BGP路由器,则BGP-EVPN路由(在本示例中为10.0.1.0/24和10.0.2.0/24)将动态发布。