Proxmox VE 中的软件定义网络(Software-Defined Network,SDN) 功能可用于创建虚拟区域和虚拟网络(VNet)。该功能简化了高级网络配置和多租户 环境的搭建。
简介
Proxmox VE SDN 通过灵活的软件控制配置,实现客户机虚拟网络的隔离和细粒度控制。
隔离通过*区域*(zone)、虚拟网络(VNet)和*子网*进行管理。区域是一个 独立的虚拟隔离网络范围。VNet 是隶属于某个区域的虚拟网络。子网是 VNet 内部的 IP 地址范围。
根据区域类型不同,网络行为也会不同,并提供各自特定的功能、优势和限制。
SDN 的使用场景范围很广,从每个独立节点上的隔离私有网络,到跨多个不同位置 PVE 集群的复杂覆盖网络都可以覆盖。
在集群范围的数据中心 SDN 管理界面中配置 VNet 后,每个节点本地都会出现一个 普通 Linux 网桥,可分配给虚拟机和容器使用。
支持状态
历史
Proxmox VE SDN 栈自 2019 年起作为实验性功能提供,并持续由众多开发者和用户改进、 测试。随着它在 Proxmox VE 6.2 中集成到 Web 界面,SDN 朝更广泛集成迈出了重要一步。 在 Proxmox VE 7 发布周期中,又加入了大量改进和功能。根据用户反馈可以看出,其基础 设计选择和实现已经相当可靠、稳定。因此,继续将 SDN 栈标记为 ‘experimental’ 已经不能准确反映其状态。到 Proxmox VE 8,项目决定为 SDN 功能的完整集成奠定基础, 将网络和接口管理提升为 Proxmox VE 访问控制栈中的核心组件。在 Proxmox VE 8.1 中达成了 两个重要里程碑:首先,为 IP 地址管理(IPAM)功能加入了 DHCP 集成;其次, SDN 集成现在默认安装。
安装
SDN 核心
自 Proxmox VE 8.1 起,核心软件定义网络(SDN)软件包会默认安装。
如果从旧版本升级,需要在每个节点上安装 libpve-network-perl 软件包:
apt update apt install libpve-network-perl
|
|
Proxmox VE 7.0 及以上版本默认安装 ifupdown2 软件包。如果系统最初是用更早 版本安装的,则需要显式安装 ifupdown2 软件包。 |
安装完成后,需要确保所有节点的 /etc/network/interfaces 配置文件末尾存在以下 一行,以便包含并激活 SDN 配置。
source /etc/network/interfaces.d/*
DHCP IPAM
内置 PVE IP 地址管理栈中的 DHCP 集成目前使用 dnsmasq 分配 DHCP 租约。 该功能目前需要显式启用。
要使用该功能,需要在每个节点上安装 dnsmasq 软件包:
dnf makecache apt install dnsmasq # disable default instance systemctl disable --now dnsmasq
FRRouting
Proxmox VE SDN 栈在高级场景中使用 FRRouting 项目。 该功能目前需要显式启用。
要使用 SDN 路由集成,需要在所有节点上安装 frr-pythontools 软件包:
apt update apt install frr-pythontools
然后在所有节点上启用 frr 服务:
systemctl enable frr.service
配置概览
配置在数据中心级别的 Web UI 中完成,并分为以下几个部分:
Options 类别可用于添加和管理 SDN 设置中使用的附加服务。
-
Controllers: 用于在复杂设置中控制第 3 层路由
-
DHCP: 为区域定义 DHCP 服务器,在 IPAM 中自动为客户机分配 IP,并通过 DHCP 将其租约提供给客户机。
-
IPAM: 为客户机启用外部 IP 地址管理
-
DNS: 定义 DNS 服务器集成,用于注册虚拟客户机的主机名 和 IP 地址
# pvesh get /cluster/sdn # pvesh get /cluster/sdn/zones # pvesh get /cluster/sdn/vnets
技术与配置
Proxmox VE 软件定义网络实现尽可能使用标准 Linux 网络能力。原因是现代 Linux 网络功能 已经能够满足功能完整的 SDN 实现所需的几乎全部需求,同时避免增加外部依赖, 并减少可能发生故障的组件总数。
Proxmox VE SDN 配置位于 /etc/pve/sdn,并通过 Proxmox VE 配置文件系统 与所有其他集群节点共享。这些配置会转换为 底层网络栈管理工具各自的配置格式(例如 ifupdown2 或 frr)。
新的变更不会立即应用,而是先记录为待处理状态。随后可以在 Web 界面的主 SDN 概览面板中一次性应用一组不同变更。该机制允许将多项变更作为一个原子操作统一 推出。
SDN 通过位于 /etc/pve/sdn 的 .running-config 和 .version 文件跟踪已推出 状态。
区域
区域定义一个虚拟隔离网络。区域会限制到特定节点并分配权限,从而将用户限制在 某个区域及其包含的 VNet 内。
可使用不同技术实现隔离:
-
Simple: 隔离网桥。简单的第 3 层路由网桥(NAT)
-
VLAN: 虚拟 LAN,是划分 LAN 的经典方法
-
QinQ: 堆叠 VLAN(正式名称为 IEEE 802.1ad)
-
VXLAN: 通过 UDP 隧道实现第 2 层 VXLAN 网络
-
EVPN (BGP EVPN): 结合 BGP 的 VXLAN,用于建立第 3 层路由
通用选项
以下选项适用于所有区域类型:
- Nodes
-
应部署该区域及其关联 VNet 的节点。
- IPAM
-
使用 IP 地址管理(IPAM)工具管理区域中的 IP。可选,默认为 pve。
- DNS
-
DNS API 服务器。可选。
- ReverseDNS
-
反向 DNS API 服务器。可选。
- DNSZone
-
DNS 域名。用于注册主机名,例如 <hostname>.<domain>。DNS 区域必须 已经存在于 DNS 服务器上。可选。
VLAN 区域
VLAN 插件使用现有的本地 Linux 或 OVS 网桥连接到节点的物理接口。它使用 VNet 中 定义的 VLAN 标记来隔离网段。这样可实现不同节点上虚拟机之间的连通。
VLAN 区域配置选项:
- Bridge
-
本地网桥或 OVS 交换机,需已在允许节点间连接的*每个*节点上配置。
QinQ 区域
QinQ 也称为 VLAN 堆叠,它使用多层 VLAN 标记进行隔离。QinQ 区域定义外层 VLAN 标记(Service VLAN),内层 VLAN 标记则由 VNet 定义。
|
|
要使用该配置,物理网络交换机必须支持堆叠 VLAN。 |
QinQ 区域配置选项:
- Bridge
-
已在每个本地节点上配置的本地 VLAN 感知网桥
- Service VLAN
-
该区域的主 VLAN 标记
- Service VLAN Protocol
-
允许选择 802.1q(默认)或 802.1ad 服务 VLAN 类型。
- MTU
-
由于标记会双层堆叠,QinQ VLAN 需要额外 4 字节。例如,如果物理接口 MTU 为 1500,则必须将 MTU 降至 1496。
VXLAN 区域
VXLAN 插件在现有网络(underlay)之上建立隧道(overlay)。它使用默认目标端口 4789,将第 2 层以太网帧封装在第 4 层 UDP 数据报中。
需要自行配置 underlay 网络,以启用所有对等节点之间的 UDP 连通性。
例如,可以在公网之上创建 VXLAN 覆盖网络,让虚拟机看起来像共享同一个本地 第 2 层网络。
|
|
VXLAN 本身不提供任何加密。通过 VXLAN 连接多个站点时,请确保在站点 之间建立安全连接,例如使用站点到站点 VPN。 |
VXLAN 区域配置选项:
- Peers Address List
-
VXLAN 区域中各节点的 IP 地址列表。这里也可以是可通过这些 IP 地址访问的外部节点。集群中的所有节点都需要列在此处。
- MTU
-
由于 VXLAN 封装会使用 50 字节,MTU 需要比出站物理接口低 50 字节。
EVPN 区域
EVPN 区域会创建可路由的第 3 层网络,并能够跨越多个集群。这通过建立 VPN 并将 BGP 用作路由协议来实现。
EVPN 的 VNet 可以拥有任播 IP 地址和/或 MAC 地址。每个节点上的网桥 IP 相同, 这意味着虚拟客户机可以将该地址用作网关。
路由可以通过 VRF(Virtual Routing and Forwarding)接口在不同区域的 VNet 之间 工作。
EVPN 区域配置选项:
- VRF VXLAN ID
-
用于 VNet 间专用路由互连的 VXLAN-ID。它必须不同于各 VNet 的 VXLAN-ID。
- Controller
-
该区域要使用的 EVPN-controller。(参见控制器插件章节)。
- VNet MAC Address
-
分配给该区域中所有 VNet 的任播 MAC 地址。如果未定义,将自动 生成。
- Exit Nodes
-
应配置为 EVPN 网络出口网关的节点,通过真实网络出站。配置的节点会 在 EVPN 网络中通告默认路由。可选。
- Primary Exit Node
-
如果使用多个出口节点,可强制流量经过该主出口节点,而不是在 所有节点上负载均衡。可选;但如果要使用 SNAT,或上游路由器不支持 ECMP,则是 必需的。
- Exit Nodes Local Routing
-
如果需要从出口节点访问 VM/CT 服务,可以使用该特殊 选项。(默认情况下,出口节点只允许在真实网络和 EVPN 网络之间转发流量)。可选。
- Advertise Subnets
-
在 EVPN 网络中通告完整子网。如果存在静默 VM/CT(例如,有 多个 IP,而任播网关没有看到来自这些 IP 的流量,则这些 IP 地址在 EVPN 网络内 将无法访问)。可选。
- Disable ARP ND Suppression
-
不抑制 ARP 或 ND(Neighbor Discovery)数据包。 如果虚拟机中使用浮动 IP(IP 和 MAC 地址会在系统之间迁移),则需要该选项。 可选。
- Route-target Import
-
允许导入外部 EVPN route target 列表。用于跨数据中心或不同 EVPN 网络之间的互连。可选。
- MTU
-
由于 VXLAN 封装会使用 50 字节,MTU 需要比出站物理接口的最大 MTU 小 50 字节。可选,默认为 1450。
VNet
通过 SDN GUI 创建虚拟网络(VNet)后,每个节点上都会出现一个同名的本地网络 接口。要将客户机连接到该 VNet,请将该接口分配给客户机,并相应设置 IP 地址。
根据区域不同,这些选项具有不同含义,并在本文档对应区域章节中说明。
|
|
在当前状态下,某些选项在特定区域中可能没有效果或无法工作。 |
VNet 配置选项:
- ID
-
用于标识 VNet 的 ID,最长 8 个字符
- Comment
-
更具描述性的标识符。会作为接口别名分配。可选
- Zone
-
该 VNet 关联的区域
- Tag
-
唯一的 VLAN 或 VXLAN ID
- VLAN Aware
-
在接口上启用 vlan-aware 选项,从而允许在客户机内进行配置。
- Isolate Ports
-
为该接口的所有客户机端口设置 isolated 标志,但不为接口本身设置。 这意味着客户机只能向非隔离的桥端口发送流量,即网桥本身。要使该设置生效,需要 重启受影响的客户机。
|
|
端口隔离是每台主机本地的行为。请使用 VNET Firewall 进一步隔离跨节点 VNET 流量。 例如,默认 DROP,只允许 IP 子网到网关以及反向的流量。 |
子网
子网定义一个由 CIDR 网络地址描述的特定 IP 范围。每个 VNet 可以有一个或多个 子网。
子网可用于:
-
限制可在特定 VNet 上定义的 IP 地址
-
在第 3 层区域中的 VNet 上分配路由/网关
-
在第 3 层区域中的 VNet 上启用 SNAT
-
通过 IPAM 插件为虚拟客户机(VM 或 CT)自动分配 IP
-
通过 DNS 插件进行 DNS 注册
如果子网所在区域关联了 IPAM 服务器,子网前缀会自动注册到 IPAM 中。
子网配置选项:
- ID
-
CIDR 网络地址,例如 10.0.0.0/8
- Gateway
-
网络默认网关的 IP 地址。在第 3 层区域(Simple/EVPN 插件)中,它会 部署到 VNet 上。
- SNAT
-
启用 Source NAT,允许 VNet 内部的虚拟机通过将数据包转发到节点出站接口 来连接外部网络。在 EVPN 区域中,转发由 EVPN gateway-nodes 完成。可选。
- DNS Zone Prefix
-
为域注册添加前缀,例如 <hostname>.prefix.<domain>。可选。
控制器
某些区域实现了分离的控制平面和数据平面,因此需要外部控制器来管理 VNet 的控制 平面。
目前,只有 EVPN 区域需要外部控制器。
EVPN Controller
EVPN 区域需要外部控制器来管理控制平面。EVPN controller 插件会配置 Free Range Routing(frr)路由器。
要启用 EVPN controller,需要在每个节点上启用 FRR,参见 安装 FRRouting。
EVPN controller 配置选项:
- ASN #
-
唯一的 BGP ASN 编号。强烈建议使用私有 ASN 编号(64512 - 65534, 4200000000 - 4294967294),否则可能会意外破坏全局路由。
- Peers
-
属于 EVPN 区域的所有节点 IP 列表。(也可以是外部节点或 route reflector 服务器)
BGP Controller
BGP controller 不会被区域直接使用。可以使用它配置 FRR 以管理 BGP 对等体。
对于 BGP-EVPN,它可用于按节点定义不同 ASN,从而实现 EBGP。它也可用于向外部 BGP 对等体导出 EVPN 路由。
|
|
默认情况下,对于简单的全网状 EVPN,不需要定义 BGP controller。 |
BGP controller 配置选项:
- Node
-
该 BGP controller 所在节点
- ASN #
-
唯一的 BGP ASN 编号。强烈建议使用 (64512 - 65534) 或 (4200000000 - 4294967294) 范围内的私有 ASN 编号,否则可能会意外破坏全局路由。
- Peer
-
要通过底层 BGP 网络通信的对等 IP 地址列表。
- EBGP
-
如果对等体的 remote-AS 不同,此选项会启用 EBGP。
- Loopback Interface
-
使用 loopback 或 dummy 接口作为 EVPN 网络源地址(用于 多路径)。
- ebgp-mutltihop
-
增加到达对等体的跳数,用于对等体不直接相连或使用 loopback 的 情况。
- bgp-multipath-as-path-relax
-
当对等体使用不同 ASN 时允许 ECMP。
IPAM
IP 地址管理(IPAM)工具用于管理网络中客户端的 IP 地址。Proxmox VE 中的 SDN 会使用 IPAM,例如为新客户机查找空闲 IP 地址。
单个 IPAM 实例可以关联到一个或多个区域。
PVE IPAM Plugin
Proxmox VE 集群默认内置的 IPAM。
可以通过数据中心配置中 SDN 部分的 IPAM 面板查看 PVE IPAM Plugin 的当前状态。 该 UI 可用于创建、更新和删除 IP 映射。配合 DHCP 功能 使用时尤其方便。
如果正在使用 DHCP,可以通过 IPAM 面板为特定虚拟机创建或编辑租约,从而更改通过 DHCP 分配的 IP。编辑使用 DHCP 的虚拟机 IP 时,必须确保强制客户机获取新的 DHCP 租约。通常可以通过重新加载客户机网络栈或重启客户机完成。
NetBox IPAM Plugin
NetBox 是一个开源 IP 地址管理 (IPAM)和数据中心基础设施管理(DCIM)工具。
要将 NetBox 与 Proxmox VE SDN 集成,请按照此处说明在 NetBox 中创建 API token: https://docs.netbox.dev/en/stable/integrations/rest-api/#tokens
NetBox 配置属性如下:
- URL
-
NetBox REST API 端点:http://yournetbox.domain.com/api
- Token
-
API 访问 token
phpIPAM Plugin
在 phpIPAM 中,需要创建一个 "application",并向该 application 添加具有管理员权限的 API token。
phpIPAM 配置属性如下:
- URL
-
REST-API 端点:http://phpipam.domain.com/api/<appname>/
- Token
-
API 访问 token
- Section
-
整数 ID。Section 是 phpIPAM 中的一组子网。默认安装会为客户使用 sectionid=1。
DNS
Proxmox VE SDN 中的 DNS 插件用于定义 DNS API 服务器,以注册主机名和 IP 地址。DNS 配置会关联到一个或多个区域,为某个区域中配置的所有子网 IP 提供 DNS 注册。
DHCP
Proxmox VE SDN 中的 DHCP 插件可用于为区域自动部署 DHCP 服务器。它会为区域内已配置 DHCP 范围的所有子网提供 DHCP。目前唯一可用的 DHCP 后端插件是 dnsmasq 插件。
DHCP 插件的工作方式是:为 VM/CT 添加新网络接口时,在该区域配置的 IPAM 插件中 分配一个 IP。关于如何配置 IPAM,可以在本文档 相应章节中找到更多信息。
虚拟机启动时,该区域的 DHCP 插件会创建 MAC 地址和 IP 的映射。当网络接口被移除, 或 VM/CT 被销毁时,IPAM 和 DHCP 服务器中的条目也会被删除。
|
|
某些功能(添加/编辑/移除 IP 映射)目前仅在使用 PVE IPAM plugin 时可用。 |
配置
可以在 Web UI 的 Zones 面板中,通过区域高级选项启用 DHCP,为区域启用自动 DHCP。
|
|
目前只有 Simple Zones 支持自动 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。
也不要忘记按照 dnsmasq DHCP plugin 的安装步骤 操作。
Plugins
Dnsmasq Plugin
目前这是唯一的 DHCP 插件,因此启用区域 DHCP 时会使用该插件。
安装说明请参见 DHCP IPAM 章节。
该插件会为每个部署 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 plugin 时,可以更新、创建和删除 DHCP 租约。更多信息请参阅 PVE IPAM plugin 文档。其他 IPAM 插件目前不支持 更改 DHCP 租约。
防火墙集成
SDN 会与 Proxmox VE 防火墙集成,自动生成 IPSets;随后可在防火墙规则的 source / destination 字段中引用这些 IPSets。对于 VNet 和 IPAM 条目,这一过程会自动发生。
VNet 和子网
防火墙会在 SDN 范围内为每个 VNet 自动生成以下 IPSets:
- vnet-all
-
包含 VNet 中所有子网的 CIDR
- vnet-gateway
-
包含 VNet 中所有子网网关的 IP
- vnet-no-gateway
-
包含 VNet 中所有子网的 CIDR,但排除网关
- vnet-dhcp
-
包含 VNet 中各子网配置的所有 DHCP 范围
更改配置时,IPSets 会自动更新,因此更改子网配置时不必同步更新防火墙规则。
Simple 区域示例
假设某个 VNet 及其包含子网的配置如下:
# /etc/pve/sdn/vnets.cfg
vnet: vnet0
zone simple
# /etc/pve/sdn/subnets.cfg
subnet: simple-192.0.2.0-24
vnet vnet0
dhcp-range start-address=192.0.2.100,end-address=192.0.2.199
gateway 192.0.2.1
subnet: simple-2001:db8::-64
vnet vnet0
dhcp-range start-address=2001:db8::1000,end-address=2001:db8::1999
gateway 2001:db8::1
在此示例中,我们在 VNet vnet0 中配置了一个 IPv4 子网,其 IP 范围为 192.0.2.0/24,网关为 192.0.2.1,DHCP 范围为 192.0.2.100 - 192.0.2.199。
此外,我们还配置了一个 IPv6 子网,其 IP 范围为 2001:db8::/64,网关为 2001:db8::1,DHCP 范围为 2001:db8::1000 - 2001:db8::1999。
随后,vnet0 对应的自动生成 IPsets 将包含以下元素:
- vnet0-all
-
-
192.0.2.0/24
-
2001:db8::/64
-
- vnet0-gateway
-
-
192.0.2.1
-
2001:db8::1
-
- vnet0-no-gateway
-
-
192.0.2.0/24
-
2001:db8::/64
-
!192.0.2.1
-
!2001:db8::1
-
- vnet0-dhcp
-
-
192.0.2.100 - 192.0.2.199
-
2001:db8::1000 - 2001:db8::1999
-
示例
本节给出多个面向常见 SDN 使用场景的配置示例。其目标是提供具体实现,并补充 细节,帮助理解可用配置选项。
Simple 区域示例
Simple 区域网络会为单台主机上的客户机创建一个隔离网络,使它们能够互相通信。
|
|
如果所有客户机都位于同一主机上,则客户机之间可以通信,但其他节点无法访问 它们。 |
-
创建名为 simple 的 simple 区域。
-
添加名为 vnet1 的 VNet。
-
创建一个带网关且启用 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
源 NAT 示例
如果希望允许 simple 网络区域中的客户机向外建立连接,simple 区域提供了 源 NAT(SNAT)选项。
基于link:/pve-docs/chapter-pvesdn.html#pvesdn_setup_example_simple[上述]配置,向 VNet vnet1 添加一个子网, 设置网关 IP,并启用 SNAT 选项。
Subnet: 172.16.0.0/24 Gateway: 172.16.0.1 SNAT: checked
在客户机中配置位于该子网 IP 范围内的静态 IP 地址。
节点本身会使用网关 IP 172.16.0.1 加入该网络,并作为子网范围内客户机的 NAT 网关。
VLAN 设置示例
当不同节点上的虚拟机需要通过隔离网络通信时,VLAN 区域可使用 VLAN 标记实现 网络级隔离。
创建名为 myvlanzone 的 VLAN 区域:
ID: myvlanzone Bridge: vmbr0
创建名为 myvnet1 的 VNet,使用 VLAN 标记 10,并关联前面创建的 myvlanzone。
ID: myvnet1 Zone: myvlanzone Tag: 10
通过主 SDN 面板应用配置,以便在每个节点本地创建 VNet。
在 node1 上创建一个基于 Debian 的虚拟机(vm1),并为其配置位于 myvnet1 上的 vNIC。
该虚拟机使用以下网络配置:
auto eth0
iface eth0 inet static
address 10.0.3.100/24
在 node2 上创建第二台虚拟机(vm2),并为其配置与 vm1 相同 VNet myvnet1 上的 vNIC。
该虚拟机使用以下网络配置:
auto eth0
iface eth0 inet static
address 10.0.3.101/24
完成后,应能够通过该网络在两台虚拟机之间互相 ping 通。
QinQ 设置示例
本示例配置两个 QinQ 区域,并向每个区域添加两台虚拟机,用于演示额外 VLAN 标记层 如何支持配置更隔离的 VLAN。
该配置的典型使用场景是托管服务提供商为客户提供隔离网络供虚拟机通信,同时将 这些虚拟机与其他客户隔离。
创建名为 qinqzone1、service VLAN 为 20 的 QinQ 区域
ID: qinqzone1 Bridge: vmbr0 Service VLAN: 20
创建另一个名为 qinqzone2、service VLAN 为 30 的 QinQ 区域
ID: qinqzone2 Bridge: vmbr0 Service VLAN: 30
在前面创建的 qinqzone1 区域上创建名为 myvnet1、VLAN-ID 为 100 的 VNet。
ID: qinqvnet1 Zone: qinqzone1 Tag: 100
在 qinqzone2 区域上创建 VLAN-ID 为 100 的 myvnet2。
ID: qinqvnet2 Zone: qinqzone2 Tag: 100
在主 SDN Web 界面面板上应用配置,以在每个节点本地创建 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
为四台虚拟机配置 10.0.3.101 到 10.0.3.104 范围内的 IP 地址。
现在应能够在虚拟机 vm1 与 vm2 之间,以及 vm3 与 vm4 之间互相 ping 通。 但是,vm1 或 vm2 都无法 ping 通 vm3 或 vm4,因为它们位于不同区域,并 使用不同的 service-VLAN。
VXLAN 设置示例
本示例假设有一个包含三个节点的集群,节点 IP 地址分别为 192.168.0.1、 192.168.0.2 和 192.168.0.3。
创建名为 myvxlanzone 的 VXLAN 区域,并将所有节点 IP 添加到 peer address list。 使用默认 MTU 1450,或根据实际情况配置。
ID: myvxlanzone Peers Address List: 192.168.0.1,192.168.0.2,192.168.0.3
使用前面创建的 VXLAN 区域 myvxlanzone 创建名为 vxvnet1 的 VNet。
ID: vxvnet1 Zone: myvxlanzone Tag: 100000
在主 SDN Web 界面面板上应用配置,以在每个节点本地创建 VNet。
在 node1 上创建一台基于 Debian 的虚拟机(vm1),并为其配置位于 vxvnet1 上的 vNIC。
该虚拟机使用以下网络配置(注意较低的 MTU)。
auto eth0
iface eth0 inet static
address 10.0.3.100/24
mtu 1450
在 node3 上创建第二台虚拟机(vm2),并为其配置与 vm1 相同 VNet vxvnet1 上的 vNIC。
该虚拟机使用以下网络配置:
auto eth0
iface eth0 inet static
address 10.0.3.101/24
mtu 1450
随后,应能够在 vm1 与 vm2 之间互相 ping 通。
EVPN 设置示例
本示例假设有一个包含三个节点(node1、node2、node3)的集群,节点 IP 地址分别为 192.168.0.1、192.168.0.2 和 192.168.0.3。
创建一个 EVPN controller,使用私有 ASN 编号,并将上述节点地址作为 peers。
ID: myevpnctl ASN#: 65000 Peers: 192.168.0.1,192.168.0.2,192.168.0.3
创建名为 myevpnzone 的 EVPN 区域,分配前面创建的 EVPN-controller,并将 node1 和 node2 定义为出口节点。
ID: myevpnzone VRF VXLAN Tag: 10000 Controller: myevpnctl MTU: 1450 VNet MAC Address: 32:F4:05:FE:6C:0A Exit Nodes: node1,node2
使用 EVPN 区域 myevpnzone 创建第一个名为 myvnet1 的 VNet。
ID: myvnet1 Zone: myevpnzone Tag: 11000
在 myvnet1 上创建子网:
Subnet: 10.0.1.0/24 Gateway: 10.0.1.1
使用同一个 EVPN 区域 myevpnzone 创建第二个名为 myvnet2 的 VNet。
ID: myvnet2 Zone: myevpnzone Tag: 12000
在 myvnet2 上创建另一个子网:
Subnet: 10.0.2.0/24 Gateway: 10.0.2.1
从主 SDN Web 界面面板应用配置,以在每个节点本地创建 VNet 并生成 FRR 配置。
在 node1 上创建一台基于 Debian 的虚拟机(vm1),并为其配置位于 myvnet1 上的 vNIC。
为 vm1 使用以下网络配置:
auto eth0
iface eth0 inet static
address 10.0.1.100/24
gateway 10.0.1.1
mtu 1450
在 node2 上创建第二台虚拟机(vm2),并为其配置位于另一个 VNet 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 上配置的默认网关离开。
|
|
需要在外部网关上为 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)将动态通告。
说明
多个 EVPN 出口节点
如果有多个网关节点,应禁用 rp_filter(Strict Reverse Path Filter)选项,因为 数据包可能从一个节点进入,却从另一个节点发出。
将以下内容添加到 /etc/sysctl.conf:
net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.all.rp_filter=0
VXLAN IPSEC 加密
要在 VXLAN 之上添加 IPSEC 加密,本示例展示了如何使用 strongswan。
需要为加密额外降低 MTU:IPv4 降低 60 字节,IPv6 降低 80 字节。
因此,在实际默认 MTU 为 1500 的情况下,需要使用 1370 的 MTU(1370 + 80 (IPSEC) + 50 (VXLAN) == 1500)。
在主机上安装 strongswan。
apt install strongswan
向 /etc/ipsec.conf 添加配置。这里只需要加密来自 VXLAN UDP 端口 4789 的 流量。
conn %default
ike=aes256-sha1-modp1024! # the fastest, but reasonably secure cipher on modern HW
esp=aes256-sha1!
leftfirewall=yes # this is necessary when using Proxmox VE firewall rules
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 网络的所有节点。