虚拟路由和转发 - VRF
虚拟路由和转发 (VRF) 使您能够在同一交换机上同时使用多个独立的路由表。其他实现将此功能称为 VRF-Lite。
您通常在数据中心中使用 VRF 来为多租户环境承载多个隔离的流量流。流量流只能在配置的边界点(例如防火墙或 IDS)处交叉。您还可以使用 VRF 将流量从私有云突发到企业网络,其中突发点位于 Layer 3。
Linux 内核完全支持 VRF,并具有以下特性
- VRF 是一个 Layer 3 主网络设备,具有其自身关联的路由表。
- 您可以将任何 Layer 3 接口与 VRF 关联,例如 SVI、swp 端口或 bond,或者 swp 端口或 bond 的 VLAN 子接口。
- 与 VRF 关联的 Layer 3 接口属于该 VRF;IP 规则将 FIB 查找定向到 VRF 设备的路由表。
- VRF 设备可以具有自己的 IP 地址,称为 VRF 本地环回。
- 默认情况下,交换机上的应用程序针对默认 VRF 运行。由
systemd
启动的服务在默认 VRF 中运行,除非您使用 VRF 实例。 - 连接的和本地路由进入相应的 VRF 表。
- 邻居条目仍然是每个接口的。您可以查看 VRF 设备的所有条目。
- VRF 不会映射到自己的网络命名空间;但是,您可以将 VRF 嵌套在网络命名空间中。
- 您可以使用现有的 Linux 工具(例如
tcpdump
)与 VRF 交互。
配置 VRF
Cumulus Linux 将每个路由表称为 VRF 表,它具有自己的表 ID。
要配置 VRF,您可以将接口子集与 VRF 路由表关联,并为每个路由表配置路由协议(BGP 或 OSPFv2)的实例。配置 VRF 类似于配置其他网络接口。请记住以下几点
- VRF 表可以具有 IP 地址,它是 VRF 的环回接口。
- Cumulus Linux 会自动添加关联的规则。
- 您可以添加默认路由,以避免在内核转发数据包时跳过表。
- VRF 表名称最多可以包含 15 个字符。但是,您不能使用名称 mgmt;Cumulus Linux 将此名称用于管理 VRF。
- Cumulus Linux 在一台交换机上最多支持 255 个 VRF。
以下示例命令配置 VRF BLUE 并自动分配表 ID。
cumulus@switch:~$ nv set vrf BLUE table auto
cumulus@switch:~$ nv set interface swp1 ip vrf BLUE
cumulus@switch:~$ nv config apply
编辑 /etc/network/interfaces
文件以添加 VRF 并自动分配表 ID
...
auto swp1
iface swp1
vrf BLUE
auto BLUE
iface BLUE
vrf-table auto
...
要加载新配置,请运行 ifreload -a
cumulus@switch:~$ sudo ifreload -a
指定表 ID
您可以指定自己的表 ID,而不是自动为 VRF 分配表 ID。Cumulus Linux 将表 ID 到名称的映射保存在 /etc/iproute2/rt_tables.d/
目录中。不要使用上面显示的 auto
选项,而是指定表 ID。例如
cumulus@switch:~$ nv set vrf BLUE table 1016
cumulus@switch:~$ nv config apply
编辑 /etc/network/interfaces
文件
...
auto swp1
iface swp1
vrf BLUE
auto BLUE
iface BLUE
vrf-table 1016
...
要加载新配置,请运行 ifreload -a
cumulus@switch:~$ sudo ifreload -a
表 ID 范围必须介于 1001 到 1255 之间。Cumulus Linux 为 VRF 表 ID 保留此范围。
在运行 ifdown 后启动 VRF
如果您使用 ifdown
关闭 VRF,请运行以下命令之一以重新启动 VRF
ifup --with-depends <vrf-name>
ifreload -a
例如
cumulus@switch:~$ sudo ifdown BLUE
cumulus@switch:~$ sudo ifup --with-depends BLUE
使用 vrf 命令
运行 vrf
命令以显示有关其他 Linux 命令(例如 iproute
)中不可用的 VRF 表的信息。
要显示 VRF 表的列表,请运行 vrf list
命令
cumulus@switch:~$ vrf list
VRF Table
---------------- -----
BLUE 1016
要显示特定 VRF 表的进程和 PID 列表,请运行 ip vrf pids <vrf-name>
命令。例如
cumulus@switch:~$ ip vrf pids BLUE
VRF: BLUE
-----------------------
dhclient 2508
sshd 2659
bash 2681
su 2702
bash 2720
vrf 2829
要确定哪个 VRF 表与特定 PID 关联,请运行 ip vrf identify <pid>
命令。例如
cumulus@switch:~$ ip vrf identify 2829
BLUE
VRF 上下文中的 IPv4 和 IPv6 命令
您可以执行非 VRF 特定的 Linux 命令,并针对给定的 VRF 表执行其他任务。这通常适用于从登录 shell 启动的单次使用命令,因为它们仅影响执行命令打开的 AF_INET 和 AF_INET6 套接字;它对与 ip
命令关联的 netlink 套接字没有影响。
要针对 VRF 表执行此类命令,请运行 ip vrf exec <vrf-name> <command>
。例如,要从交换机 SSH 到可通过 VRF BLUE 访问的设备
cumulus@switch:~$ sudo ip vrf exec BLUE ssh user@host
VRF 中的服务
对于需要在特定 VRF 上运行的服务,Cumulus Linux 使用 systemd
实例,其中实例是 VRF。您可以使用 systemctl start <service>@<vrf-name>
命令在 VRF 中启动服务。例如,要在 BLUE VRF 中运行 dhcpd
服务
cumulus@switch:~$ sudo systemctl start dhcpd@BLUE
在大多数情况下,您需要在 VRF 实例可以启动之前停止在默认 VRF 中运行的实例。这是因为在默认 VRF 中运行的实例拥有跨所有 VRF 的端口(它是 VRF 全局的)。当您重新启动网络或运行 ifdown
/ifup
序列时,Cumulus Linux 会停止基于 systemd
的服务。有关详细信息,请参阅管理 VRF。
以下服务适用于 VRF 实例
chef-client
collectd
dhcpd
dhcrelay
hsflowd
netq-agent
ntp
(只能在默认 VRF 或管理 VRF 中运行)puppet
snmptrapd
ssh
zabbix-agent
如果 systemd
实例不起作用;请改用特定于服务的配置选项。例如,要配置 rsyslogd
以通过 VRF 将消息发送到远程系统
action(type="omfwd" Target="hostname or ip here" Device="mgmt" Port=514
Protocol="udp")
VRF 路由泄漏
当您需要多个独立的路由和转发表时,通常使用 VRF;但是,您可能希望从一个 VRF 到达另一个 VRF 中的目标,如下列情况所示
- 使服务(例如防火墙)可用于多个 VRF。
- 为多个 VRF 启用到外部网络或 Internet 的路由,其中外部网络本身可通过特定 VRF 访问。
Cumulus Linux 支持动态 VRF 路由泄漏(而非静态路由泄漏)。
- 您只能将一个接口分配给一个 VRF;Cumulus Linux 使用关联的 VRF 路由表路由在该接口上到达的任何数据包。
- 您不能路由泄漏重叠地址。
- 您只能在对称路由配置中将 VRF 路由泄漏与 EVPN 结合使用。
- 您不能在使用 onlink 下一跳(BGP unnumbered)的情况下,在租户 VRF 和默认 VRF 之间使用 VRF 路由泄漏。
- 在具有 VRF 泄漏的 Spectrum-2 和 Spectrum-3 交换机上,您可能会在热启动期间看到五秒钟的流量丢失。
配置路由泄漏
通过路由泄漏,目标 VRF 想要了解源 VRF 的路由。当路由在源 VRF 中来回时,它们会通过 BGP 动态泄漏到目标 VRF。如果 BGP 在源 VRF 中学习到路由,则无需执行任何其他配置。如果 OSPF 在源 VRF 中学习到路由,如果您静态配置路由,或者您需要访问直接连接的网络,则需要首先将路由重分发到 BGP 中(在源 VRF 中)。
您还可以使用路由泄漏来访问远程目标以及另一个 VRF 中的直接连接目标。多个 VRF 可以从单个源 VRF 导入路由,并且一个 VRF 可以从多个源 VRF 导入路由。当单个 VRF 为其他 VRF 提供到外部网络或共享服务的连接时,可以使用此方法。您可以使用路由映射控制跨 VRF 动态泄漏的路由。
由于路由泄漏通过 BGP 发生,因此底层机制依赖于路由区分符 (RD) 和路由目标 (RT) 的 BGP 构造。但是,您无需配置这些参数;当您在 VRF 对之间启用路由泄漏时,Cumulus Linux 会自动派生它们。
当您使用路由泄漏时
- 您无法从另一个 VRF 到达 VRF 的环回地址(分配给 VRF 设备的地址)。
- 您必须在 BGP 中使用
redistribute
命令来泄漏非 BGP 路由(连接的或静态路由);您不能使用network
命令。 - Cumulus Linux 不会泄漏管理 VRF 中下一跳为 eth0 或管理接口的路由。
- 即使 iBGP 或多跳 eBGP 学习到的路由的下一跳变得不可达,您也可以泄漏这些路由。NVIDIA 建议为 BGP 通过单跳 eBGP 学习到的路由进行路由泄漏。
- 您不能在多个自治系统 (AS) 中或与全局 AS 不同的 AS 中配置 BGP 的 VRF 实例。
- 不要使用默认 VRF 作为共享服务 VRF。为共享服务创建另一个 VRF。
- Cumulus Linux 不会将扩展社区复制到目标 VRF。
- EVPN 对称路由配置在默认 VRF 和非默认 VRF 之间泄漏路由时存在某些限制。默认 VRF 具有到 VTEP 地址的路由,您无法将其泄漏到任何租户 VRF。如果您需要在默认 VRF 和非默认 VRF 之间泄漏路由,则必须过滤掉到 VTEP 地址的路由,以防止泄漏这些路由。使用此类配置时请务必小心。在单独的 VRF(服务 VRF)而不是默认 VRF 中运行常用服务,以简化配置并避免使用路由映射进行过滤。
在以下示例命令中,VRF BLUE
的 BGP 路由表中的路由动态泄漏到 VRF RED
中。
cumulus@switch:~$ nv set vrf RED router bgp address-family ipv4-unicast route-import from-vrf list BLUE
cumulus@switch:~$ nv config apply
cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# router bgp 65001 vrf RED
switch(config-router)# address-family ipv4 unicast
switch(config-router-af)# import vrf BLUE
switch(config-router-af)# end
switch# write memory
switch# exit
vtysh 命令将配置保存在 /etc/frr/frr.conf
文件中。例如
...
router bgp 65001 vrf RED
!
address-family ipv4 unicast
import vrf BLUE
...
排除某些前缀
要从导入过程中排除某些前缀,请在路由映射中配置前缀。
以下示例配置路由映射以匹配源协议 BGP,并将路由从 VRF BLUE 导入到 VRF RED。对于导入的路由,社区在 VRF RED 中为 11:11。
cumulus@switch:~$ nv set vrf RED router bgp address-family ipv4-unicast route-import from-vrf list BLUE
cumulus@switch:~$ nv set router policy route-map BLUEtoRED rule 10 match type ipv4
cumulus@switch:~$ nv set router policy route-map BLUEtoRED rule 10 match source-protocol bgp
cumulus@switch:~$ nv set router policy route-map BLUEtoRED rule 10 action permit
cumulus@switch:~$ nv set router policy route-map BLUEtoRED rule 10 set community 11:11
cumulus@switch:~$ nv set vrf RED router bgp address-family ipv4-unicast route-import from-vrf route-map BLUEtoRED
cumulus@switch:~$ nv config
cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# router bgp 65001 vrf RED
switch(config-router)# address-family ipv4 unicast
switch(config-router-af)# import vrf BLUE
switch(config-router-af)# route-map BLUEtoRED permit 10
switch(config-route-map)# match source-protocol bgp
switch(config-route-map)# set community 11:11
switch(config-route-map)# exit
switch(config)# router bgp 65001 vrf RED
switch(config-router)# address-family ipv4 unicast
switch(config-router-af)# import vrf route-map BLUEtoRED
switch(config-router-af)# end
switch# write memory
switch# exit
来自 eBGP 多跳邻居的路由
如果您要泄漏的路由是来自 eBGP 多跳邻居的连接路由,则必须禁用目标 VRF 中 eBGP 多跳对等会话的下一跳连接验证过程,以便 Cumulus Linux 可以将这些路由添加到路由表中。
要禁用下一跳连接验证过程,您需要运行 vtysh 命令;NVUE 不提供用于此选项的命令。
以下示例禁用目标 VRF BLUE 中 eBGP 多跳对等会话的下一跳连接验证过程
cumulus@leaf01:~$ sudo vtysh
...
leaf01# configure terminal
leaf01(config)# router bgp 65101 vrf BLUE
leaf01(config-router)# bgp disable-ebgp-connected-route-check
leaf01(config-router)# end
leaf01# write memory
leaf01# exit
如果您需要强制 Cumulus Linux 将路由重新导入到目标 VRF 中,请在要泄漏路由的 VRF 上运行 clear ip bgp vrf <source-vrf> *
命令。
验证路由泄漏配置
要检查 VRF 路由泄漏的状态,请运行 NVUE nv show vrf <vrf-name> router bgp address-family ipv4-unicast route-import
命令或 vtysh show ip bgp vrf <vrf-name> ipv4|ipv6 unicast route-leak
命令。例如
cumulus@switch:~$ nv show vrf RED router bgp address-family ipv4-unicast route-import
operational applied
-------------- ------------ ---------
from-vrf
enable on
route-map BLUEtoRED
[list] BLUE BLUE
[route-target] 10.10.10.1:3
要显示更详细的状态信息,您可以运行以下 NVUE 命令
nv show vrf <vrf-name> router bgp address-family ipv4-unicast route-import from-vrf
nv show vrf <vrf-name> router bgp address-family ipv4-unicast route-import from-vrf list
nv show vrf <vrf-name> router bgp address-family ipv4-unicast route-import from-vrf list <leak-vrf-id>
要查看 BGP 路由表,请运行 NVUE nv show vrf <vrf-name> router bgp address-family ipv4-unicast
命令或 vtysh show ip bgp vrf <vrf-name> ipv4|ipv6 unicast
命令。
要查看 FRR IP 路由表,请运行 vtysh show ip route vrf <vrf-name>
命令。这些命令显示所有路由,包括从其他 VRF 泄漏的路由。
以下示例命令显示 VRF RED
中的所有路由,包括从 VRF BLUE
泄漏的路由
cumulus@switch:~$ sudo vtysh
switch# show ip route vrf RED
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, P - PIM, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
F - PBR,
> - selected route, * - FIB route
VRF RED:
K * 0.0.0.0/0 [255/8192] unreachable (ICMP unreachable), 6d07h01m
C>* 10.1.1.1/32 is directly connected, BLUE, 6d07h01m
B>* 10.0.100.1/32 [200/0] is directly connected, RED(vrf RED), 6d05h10m
B>* 10.0.200.0/24 [20/0] via 10.10.2.2, swp1.11, 5d05h10m
B>* 10.0.300.0/24 [200/0] via 10.20.2.2, swp1.21(vrf RED), 5d05h10m
C>* 10.10.2.0/30 is directly connected, swp1.11, 6d07h01m
C>* 10.10.3.0/30 is directly connected, swp2.11, 6d07h01m
C>* 10.10.4.0/30 is directly connected, swp3.11, 6d07h01m
B>* 10.20.2.0/30 [200/0] is directly connected, swp1.21(vrf RED), 6d05h10m
删除路由泄漏配置
以下示例命令删除从 VRF BLUE
到 VRF RED
的泄漏路由
cumulus@switch:~$ nv unset vrf RED router bgp address-family ipv4-unicast route-import from-vrf list BLUE
cumulus@switch:~$ nv config apply
cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# router bgp 65001 vrf RED
switch(config-router)# address-family ipv4 unicast
switch(config-router-af)# no import vrf BLUE
switch(config-router-af)# end
switch# write memory
switch# exit
Cumulus Linux 不再支持内核命令。为避免 FRR 中的 VRF 路由泄漏出现问题,请勿使用内核命令。
VRF 中的 FRRouting
Cumulus Linux 支持 VRF 上下文中的 IPv4 和 IPv6 的BGP、OSPFv2 和静态路由。各种 “FRRouting”) 路由构造(例如路由表、下一跳、路由器 ID 和相关处理)也支持 VRF。
FRR 通过来自内核的通知了解系统上的 VRF 以及接口到 VRF 的连接。
以下部分显示了 BGP 和 OSPF 的示例 VRF 配置。有关静态路由的示例 VRF 配置,请参阅静态路由。
BGP
由于 BGP 支持 VRF,因此 Cumulus Linux 支持每个 VRF 邻居(包括 iBGP 和 eBGP)以及编号和未编号的接口。非基于接口的 VRF 邻居绑定到 VRF,因此您可以在不同的 VRF 中拥有重叠的地址空间。每个 VRF 都可以有自己的参数,例如地址族和重分发。传入连接依赖于 Linux 内核来实现 VRF 全局套接字。您可以使用BFD跟踪 BGP 邻居,包括单跳和多跳。您可以配置多个 BGP 实例,将每个实例与 VRF 关联。
以下示例显示了 VRF RED 中的BGP 未编号接口配置。在 BGP 未编号中,任何接口上都没有地址。但是,像 traceroute
这样的调试工具至少需要每个节点一个 IP 地址作为源 IP 地址。通常,此地址是环回设备。使用 VRF,您可以将 IP 地址与 VRF 设备关联,该设备充当该 VRF 的环回接口。
cumulus@switch:~$ nv set vrf RED table auto
cumulus@switch:~$ nv set vrf RED loopback ip address 10.10.10.1/32
cumulus@switch:~$ nv set interface swp51 ip vrf RED
cumulus@switch:~$ nv set vrf RED router bgp router-id 10.10.10.1
cumulus@switch:~$ nv set vrf RED router bgp autonomous-system 65001
cumulus@switch:~$ nv set vrf RED router bgp neighbor swp51 remote-as external
cumulus@switch:~$ nv set vrf RED router bgp address-family ipv4-unicast redistribute connected enable on
cumulus@switch:~$ nv set vrf RED router bgp neighbor swp51 address-family ipv4-unicast enable on
cumulus@switch:~$ nv config apply
/etc/network/interfaces
文件配置
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto RED
iface RED
address 10.10.10.1/32
vrf-table auto
auto swp51
iface swp51
vrf RED
...
vtysh 命令
cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# router bgp 65001 vrf RED
switch(config-router)# bgp router-id 10.10.10.1
switch(config-router)# neighbor swp51 interface remote-as external
switch(config-router)# address-family ipv4 unicast
switch(config-router-af)# redistribute connected
switch(config-router-af)# end
switch# write memory
switch# exit
vtysh 命令将配置保存在 /etc/frr/frr.conf
文件中。例如
...
router bgp 65001 vrf RED
bgp router-id 10.10.10.1
neighbor swp51 interface remote-as external
!
address-family ipv4 unicast
redistribute connected
exit-address-family
...
OSPF
支持 VRF 的 OSPFv2 配置支持编号和未编号的接口,以及 Layer 3 接口,例如 SVI、子接口和物理接口。VRF 支持类型 1 到 5(ABR 和 ASBR - 外部 LSA)和类型 9 到 11(不透明 LSA)链路状态通告、其他路由协议的重分发、连接的和静态路由以及路由映射。您可以使用BFD跟踪 OSPF 邻居。
Cumulus Linux 不支持多实例 OSPF 中的多个 VRF。
以下示例显示了 VRF RED 中的 OSPF 配置。
cumulus@switch:~$ nv set vrf RED loopback ip address 10.10.10.1/31
cumulus@switch:~$ nv set interface swp51 ip address 10.0.1.0/31
cumulus@switch:~$ nv set vrf RED router ospf enable on
cumulus@switch:~$ nv set vrf RED router ospf router-id 10.10.10.1
cumulus@switch:~$ nv set vrf RED router ospf redistribute connected
cumulus@switch:~$ nv set vrf RED router ospf redistribute bgp
cumulus@switch:~$ nv set vrf RED router ospf area 0.0.0.0 network 10.10.10.1/32
cumulus@switch:~$ nv set vrf RED router ospf area 0.0.0.0 network 10.0.1.0/31
cumulus@switch:~$ nv config apply
/etc/network/interfaces
文件配置
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto RED
iface RED
address 10.10.10.1/32
vrf-table auto
auto swp51
iface swp51
address 10.0.1.0/31
vtysh 命令
cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# router ospf vrf RED
switch(config-router)# ospf router-id 10.10.10.1
switch(config-router)# redistribute connected
switch(config-router)# redistribute bgp
switch(config-router)# network 10.10.10.1/32 area 0.0.0.0
switch(config-router)# network 10.0.1.0/31 area 0.0.0.0
switch(config-router)# end
switch# write memory
switch# exit
vtysh 命令将配置保存在 /etc/frr/frr.conf
文件中。例如
...
router ospf vrf RED
ospf router-id 10.10.10.1
network 10.10.10.1/32 area 0.0.0.0
network 10.0.1.0/31 area 0.0.0.0
redistribute connected
redistribute bgp
...
带有 VRF 的 DHCP
由于您可以使用 VRF 将 IPv4 和 IPv6 套接字绑定到非默认 VRF 表,因此您可以使用 dhcpd
和 dhcrelay
服务在任何非默认 VRF 表中启动 DHCP 服务器和中继。systemd
必须管理这些服务,并且 /etc/vrf/systemd.conf
文件必须列出这些服务。默认情况下,此文件已列出这两个服务以及其他服务。您可以根据需要添加更多服务,例如 IPv6 的 dhcpd6
和 dhcrelay6
。
如果您编辑 /etc/vrf/systemd.conf
,请运行 sudo systemctl daemon-reload
以生成新添加服务的 systemd
实例文件。然后,您可以使用 systemctl start <service>@<vrf-name>.service
在 VRF 中启动服务,其中 <service>
是服务的名称(例如 dhcpd
或 dhcrelay
),而 <vrf-name>
是 VRF 的名称。
例如,要在配置名为 BLUE 的 VRF 后启动 dhcrelay
服务,请运行
cumulus@switch:~$ sudo systemctl start dhcrelay@BLUE.service
要在启动时启用该服务,您还必须启用该服务
cumulus@switch:~$ sudo systemctl enable dhcrelay@BLUE.service
此外,您需要在 /etc/default
目录中为非默认 VRF 中的每个 DHCP 服务器或中继实例创建一个单独的默认文件。要运行任何这些服务的多个实例,您需要为每个实例创建一个单独的文件。这些文件必须具有以下名称
isc-dhcp-server-<vrf-name>
isc-dhcp-server6-<vrf-name>
isc-dhcp-relay-<vrf-name>
isc-dhcp-relay6-<vrf-name>
有关更多详细信息,请参阅下面的示例配置。
- Cumulus Linux不支持跨 VRF 的 DHCP 服务器和中继;服务器和主机不能位于不同的 VRF 表中。此外,服务器和中继不能位于不同的 VRF 表中。
- 通常,在默认 VRF 中运行的服务拥有跨所有 VRF 的端口。如果您首选 VRF 本地实例,请先禁用并停止全局实例。
- VRF 是 Layer 3 路由功能;仅在 VRF 中运行使用 AF_INET 和 AF_INET6 套接字的程序。VRF 上下文不影响程序操作的任何其他方面。
- 此方法仅适用于基于
systemd
的服务。
示例配置
在以下示例中,有一个 IPv4 网络,其 VRF 名为 RED,还有一个 IPv6 网络,其 VRF 名为 BLUE。
IPv4 DHCP 服务器/中继网络 | IPv6 DHCP 服务器/中继网络 |
---|---|
![]() | ![]() |
按如下方式配置每个 DHCP 服务器和中继
在
/etc/default/
中创建文件isc-dhcp-server-RED
。以下是示例内容# Defaults for isc-dhcp-server initscript # sourced by /etc/init.d/isc-dhcp-server # installed at /etc/default/isc-dhcp-server by the maintainer scripts # # This is a POSIX shell fragment # # Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf). DHCPD_CONF="-cf /etc/dhcp/dhcpd-RED.conf" # Path to dhcpd's PID file (default: /var/run/dhcpd.pid). DHCPD_PID="-pf /var/run/dhcpd-RED.pid" # Additional options to start dhcpd with. # Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead #OPTIONS="" # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACES="swp2"
启用 DHCP 服务器
cumulus@switch:~$ sudo systemctl enable dhcpd@RED.service
启动 DHCP 服务器
cumulus@switch:~$ sudo systemctl start dhcpd@RED.service
检查状态
cumulus@switch:~$ sudo systemctl status dhcpd@RED.service
您可以使用 vrf
命令创建此配置(有关更多详细信息,请参阅上面的VRF 上下文中的 IPv4 和 IPv6 命令)
cumulus@switch:~$ sudo ip vrf exec RED /usr/sbin/dhcpd -f -q -cf /
/etc/dhcp/dhcpd-RED.conf -pf /var/run/dhcpd-RED.pid swp2
在
/etc/default/
中创建文件isc-dhcp-server6-BLUE
。以下是示例内容# Defaults for isc-dhcp-server initscript # sourced by /etc/init.d/isc-dhcp-server # installed at /etc/default/isc-dhcp-server by the maintainer scripts # # This is a POSIX shell fragment # # Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf). DHCPD_CONF="-cf /etc/dhcp/dhcpd6-BLUE.conf" # Path to dhcpd's PID file (default: /var/run/dhcpd.pid). DHCPD_PID="-pf /var/run/dhcpd6-BLUE.pid" # Additional options to start dhcpd with. # Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead #OPTIONS="" # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACES="swp3"
启用 DHCP 服务器
cumulus@switch:~$ sudo systemctl enable dhcpd6@BLUE.service
启动 DHCP 服务器
cumulus@switch:~$ sudo systemctl start dhcpd6@BLUE.service
检查状态
cumulus@switch:~$ sudo systemctl status dhcpd6@BLUE.service
您可以使用 vrf
命令创建此配置(有关更多详细信息,请参阅上面的VRF 上下文中的 IPv4 和 IPv6 命令)
cumulus@switch:~$ sudo ip vrf exec BLUE dhcpd -6 -q -cf /
/etc/dhcp/dhcpd6-BLUE.conf -pf /var/run/dhcpd6-BLUE.pid swp3
在
/etc/default/
中创建文件isc-dhcp-relay-RED
。以下是示例内容# Defaults for isc-dhcp-relay initscript # sourced by /etc/init.d/isc-dhcp-relay # installed at /etc/default/isc-dhcp-relay by the maintainer scripts # # This is a POSIX shell fragment # # What servers should the DHCP relay forward requests to? SERVERS="102.0.0.2" # On what interfaces should the DHCP relay (dhrelay) serve DHCP requests? # Always include the interface towards the DHCP server. # This variable requires a -i for each interface configured above. # This will be used in the actual dhcrelay command # For example, "-i eth0 -i eth1" INTF_CMD="-i swp2s2 -i swp2s3" # Additional options that are passed to the DHCP relay daemon? OPTIONS=""
启用 DHCP 中继
cumulus@switch:~$ sudo systemctl enable dhcrelay@RED.service
启动 DHCP 中继
cumulus@switch:~$ sudo systemctl start dhcrelay@RED.service
检查状态
cumulus@switch:~$ sudo systemctl status dhcrelay@RED.service
您可以使用 vrf
命令创建此配置(有关更多详细信息,请参阅上面的VRF 上下文中的 IPv4 和 IPv6 命令)
cumulus@switch:~$ sudo ip vrf exec RED /usr/sbin/dhcrelay -d -q -i /
swp2s2 -i swp2s3 102.0.0.2
在
/etc/default/
中创建文件isc-dhcp-relay6-BLUE
。以下是示例内容# Defaults for isc-dhcp-relay initscript # sourced by /etc/init.d/isc-dhcp-relay # installed at /etc/default/isc-dhcp-relay by the maintainer scripts # # This is a POSIX shell fragment # # What servers should the DHCP relay forward requests to? #SERVERS="103.0.0.2" # On what interfaces should the DHCP relay (dhrelay) serve DHCP requests? # Always include the interface towards the DHCP server. # This variable requires a -i for each interface configured above. # This will be used in the actual dhcrelay command # For example, "-i eth0 -i eth1" INTF_CMD="-l swp18s0 -u swp18s1" # Additional options that are passed to the DHCP relay daemon? OPTIONS="-pf /var/run/dhcrelay6@BLUE.pid"
启用 DHCP 中继
cumulus@switch:~$ sudo systemctl enable dhcrelay6@BLUE.service
启动 DHCP 中继
cumulus@switch:~$ sudo systemctl start dhcrelay6@BLUE.service
检查状态
cumulus@switch:~$ sudo systemctl status dhcrelay6@BLUE.service
您可以使用 vrf
命令创建此配置(有关更多详细信息,请参阅上面的VRF 上下文中的 IPv4 和 IPv6 命令)
cumulus@switch:~$ sudo ip vrf exec BLUE /usr/sbin/dhcrelay -d -q -6 -l /
swp18s0 -u swp18s1 -pf /var/run/dhcrelay6@BLUE.pid
在 VRF 上使用 ping 或 traceroute
您可以从默认 VRF 在 VRF 上运行 ping
或 traceroute
。
要从默认 VRF ping VRF,请运行 ping
-I <vrf-name>
命令。例如
cumulus@switch:~$ ping -I BLUE
要从默认 VRF 在 VRF 上运行 traceroute
,请运行 traceroute -i <vrf-name>
命令。例如
cumulus@switch:~$ sudo traceroute -i BLUE
故障排除
您可以使用 vtysh 或 Linux show 命令来排除 VRF 故障。
要显示 FRR 从内核学习到的所有 VRF,请运行 show vrf
命令。表 ID 显示内核中相应的路由表。
cumulus@switch:~$ sudo vtysh
...
switch# show vrf
vrf RED id 14 table 1012
vrf BLUE id 21 table 1013
要显示在 BGP 中配置的 VRF(包括默认 VRF),请运行 show bgp vrfs
命令。非零 ID 是您在 /etc/network/interfaces
文件中定义的 VRF。
cumulus@switch:~$ sudo vtysh
...
switch# show bgp vrfs
Type Id RouterId #PeersCfg #PeersEstb Name
DFLT 0 6.0.0.7 0 0 Default
VRF 14 6.0.2.7 6 6 RED
VRF 21 6.0.3.7 6 6 BLUE
Total number of VRFs (including default): 3
要显示 FRR 已知的且连接到特定 VRF 的接口,请运行 show interface vrf <vrf-name>
命令。例如
cumulus@switch:~$ sudo vtysh
switch# show interface vrf vrf1012
Interface br2 is up, line protocol is down
PTM status: disabled
vrf: RED
index 13 metric 0 mtu 1500
flags: <UP,BROADCAST,MULTICAST>
inet 20.7.2.1/24
inet6 fe80::202:ff:fe00:a/64
ND advertised reachable time is 0 milliseconds
ND advertised retransmit interval is 0 milliseconds
ND router advertisements are sent every 600 seconds
ND router advertisements lifetime tracks ra-interval
ND router advertisement default router preference is medium
Hosts use stateless autoconfig for addresses.
要显示在 OSPF 中配置的 VRF,请运行 show ip ospf vrfs
命令。例如
cumulus@switch:~$ sudo vtysh
...
switch# show ip ospf vrfs
Name Id RouterId
Default-IP-Routing-Table 0 0.0.0.0
RED 57 0.0.0.10
BLUE 58 0.0.0.20
Total number of OSPF VRFs (including default): 3
要显示 VRF 中的所有 OSPF 路由,请运行 show ip ospf vrf all route
命令。例如
cumulus@switch:~$ sudo vtysh
...
switch# show ip ospf vrf all route
============ OSPF network routing table ============
N 7.0.0.0/24 [10] area: 0.0.0.0
directly attached to swp2
============ OSPF router routing table =============
============ OSPF external routing table ===========
============ OSPF network routing table ============
N 8.0.0.0/24 [10] area: 0.0.0.0
directly attached to swp1
============ OSPF router routing table =============
============ OSPF external routing table ===========
要查看每个 VRF 的路由表,请使用 show ip route vrf all
命令。OSPF 路由在以 O 开头的行中。
cumulus@switch:~$ sudo vtysh
...
switch# show ip route vrf all
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, P - PIM, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel,
> - selected route, * - FIB route
VRF BLUE:
K>* 0.0.0.0/0 [0/8192] unreachable (ICMP unreachable)
O 7.0.0.0/24 [110/10] is directly connected, swp2, 00:28:35
C>* 7.0.0.0/24 is directly connected, swp2
C>* 7.0.0.5/32 is directly connected, BLUE
C>* 7.0.0.100/32 is directly connected, BLUE
C>* 50.1.1.0/24 is directly connected, swp31s1
VRF RED:
K>* 0.0.0.0/0 [0/8192] unreachable (ICMP unreachable)
O
8.0.0.0/24 [110/10]
is directly connected, swp1, 00:23:26
C>* 8.0.0.0/24 is directly connected, swp1
C>* 8.0.0.5/32 is directly connected, RED
C>* 8.0.0.100/32 is directly connected, RED
C>* 50.0.1.0/24 is directly connected, swp31s0
要列出所有 VRF,并包括 VRF ID 和表 ID,请运行 ip -d link show type vrf
命令。例如
cumulus@switch:~$ ip -d link show type vrf
14: vrf1012: <NOARP,MASTER,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 46:96:c7:64:4d:fa brd ff:ff:ff:ff:ff:ff promiscuity 0
vrf table 1012 addrgenmode eui64
21: vrf1013: <NOARP,MASTER,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 7a:8a:29:0f:5e:52 brd ff:ff:ff:ff:ff:ff promiscuity 0
vrf table 1013 addrgenmode eui64
28: vrf1014: <NOARP,MASTER,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
link/ether e6:8c:4d:fc:eb:b1 brd ff:ff:ff:ff:ff:ff promiscuity 0
vrf table 1014 addrgenmode eui64
要显示连接到特定 VRF 的接口,请运行 ip -d link show vrf <vrf-name>
命令。例如
cumulus@switch:~$ ip -d link show vrf vrf1012
8: swp1.2@swp1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master vrf1012 state UP mode DEFAULT group default
link/ether 00:02:00:00:00:07 brd ff:ff:ff:ff:ff:ff promiscuity 0
vlan protocol 802.1Q id 2 <REORDER_HDR>
vrf_slave addrgenmode eui64
9: swp2.2@swp2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master vrf1012 state UP mode DEFAULT group default
link/ether 00:02:00:00:00:08 brd ff:ff:ff:ff:ff:ff promiscuity
vlan protocol 802.1Q id 2 <REORDER_HDR>
vrf_slave addrgenmode eui64
10: swp3.2@swp3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master vrf1012 state UP mode DEFAULT group default
link/ether 00:02:00:00:00:09 brd ff:ff:ff:ff:ff:ff promiscuity 0
vlan protocol 802.1Q id 2 <REORDER_HDR>
vrf_slave addrgenmode eui64
11: swp4.2@swp4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master vrf1012 state UP mode DEFAULT group default
link/ether 00:02:00:00:00:0a brd ff:ff:ff:ff:ff:ff promiscuity 0
vlan protocol 802.1Q id 2 <REORDER_HDR>
vrf_slave addrgenmode eui64
12: swp5.2@swp5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master vrf1012 state UP mode DEFAULT group default
link/ether 00:02:00:00:00:0b brd ff:ff:ff:ff:ff:ff promiscuity 0
vlan protocol 802.1Q id 2 <REORDER_HDR>
vrf_slave addrgenmode eui64
13: br2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue master vrf1012 state DOWN mode DEFAULT group default
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff promiscuity 0
bridge forward_delay 100 hello_time 200 max_age 2000 ageing_time 30000 stp_state 0 priority 32768
vlan_filtering 0 vlan_protocol 802.1Q bridge_id 8000.0:0:0:0:0:0 designated_root 8000.0:0:0:0:0:0
root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer 0.00
tcn_timer 0.00 topology_change_timer 0.00 gc_timer 202.23 vlan_default_pvid 1 group_fwd_mask 0
group_address 01:80:c2:00:00:00 mcast_snooping 1 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0
mcast_hash_elasticity 4096 mcast_hash_max 4096 mcast_last_member_count 2 mcast_startup_query_count 2
mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500
mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3125
nf_call_iptables 0 nf_call_ip6tables 0 nf_call_arptables 0
vrf_slave addrgenmode eui64
要显示 VRF 中的 IPv4 路由,请运行 ip route show table <vrf-name>
命令。例如
cumulus@switch:~$ ip route show table RED
unreachable default metric 240
broadcast 20.7.2.0 dev br2 proto kernel scope link src 20.7.2.1 dead linkdown
20.7.2.0/24 dev br2 proto kernel scope link src 20.7.2.1 dead linkdown
local 20.7.2.1 dev br2 proto kernel scope host src 20.7.2.1
broadcast 20.7.2.255 dev br2 proto kernel scope link src 20.7.2.1 dead linkdown
broadcast 169.254.2.8 dev swp1.2 proto kernel scope link src 169.254.2.9
169.254.2.8/30 dev swp1.2 proto kernel scope link src 169.254.2.9
local 169.254.2.9 dev swp1.2 proto kernel scope host src 169.254.2.9
broadcast 169.254.2.11 dev swp1.2 proto kernel scope link src 169.254.2.9
broadcast 169.254.2.12 dev swp2.2 proto kernel scope link src 169.254.2.13
169.254.2.12/30 dev swp2.2 proto kernel scope link src 169.254.2.13
local 169.254.2.13 dev swp2.2 proto kernel scope host src 169.254.2.13
broadcast 169.254.2.15 dev swp2.2 proto kernel scope link src 169.254.2.13
broadcast 169.254.2.16 dev swp3.2 proto kernel scope link src 169.254.2.17
169.254.2.16/30 dev swp3.2 proto kernel scope link src 169.254.2.17
local 169.254.2.17 dev swp3.2 proto kernel scope host src 169.254.2.17
broadcast 169.254.2.19 dev swp3.2 proto kernel scope link src 169.254.2.17
要显示 VRF 中的 IPv6 路由,请运行 ip -6 route show table <vrf-name>
命令。例如
cumulus@switch:~$ ip -6 route show table RED
local fe80:: dev lo proto none metric 0 pref medium
local fe80:: dev lo proto none metric 0 pref medium
local fe80:: dev lo proto none metric 0 pref medium
local fe80:: dev lo proto none metric 0 pref medium
local fe80::202:ff:fe00:7 dev lo proto none metric 0 pref medium
local fe80::202:ff:fe00:8 dev lo proto none metric 0 pref medium
local fe80::202:ff:fe00:9 dev lo proto none metric 0 pref medium
local fe80::202:ff:fe00:a dev lo proto none metric 0 pref medium
fe80::/64 dev br2 proto kernel metric 256 dead linkdown pref medium
fe80::/64 dev swp1.2 proto kernel metric 256 pref medium
fe80::/64 dev swp2.2 proto kernel metric 256 pref medium
fe80::/64 dev swp3.2 proto kernel metric 256 pref medium
ff00::/8 dev br2 metric 256 dead linkdown pref medium
ff00::/8 dev swp1.2 metric 256 pref medium
ff00::/8 dev swp2.2 metric 256 pref medium
ff00::/8 dev swp3.2 metric 256 pref medium
unreachable default dev lo metric 240 error -101 pref medium
要查看与特定 VRF 表关联的链接列表,请运行 ip link list <vrf-name>
命令。例如
cumulus@switch:~$ ip link list RED
VRF: RED
--------------------
swp1.10@swp1 UP 6c:64:1a:00:5a:0c <BROADCAST,MULTICAST,UP,LOWER_UP>
swp2.10@swp2 UP 6c:64:1a:00:5a:0d <BROADCAST,MULTICAST,UP,LOWER_UP>
要查看与特定 VRF 表关联的路由列表,请运行 ip route list <vrf-name>
命令。例如
cumulus@switch:~$ ip route list RED
VRF: RED
--------------------
unreachable default metric 8192
10.1.1.0/24 via 10.10.1.2 dev swp2.10
10.1.2.0/24 via 10.99.1.2 dev swp1.10
broadcast 10.10.1.0 dev swp2.10 proto kernel scope link src 10.10.1.1
10.10.1.0/28 dev swp2.10 proto kernel scope link src 10.10.1.1
local 10.10.1.1 dev swp2.10 proto kernel scope host src 10.10.1.1
broadcast 10.10.1.15 dev swp2.10 proto kernel scope link src 10.10.1.1
broadcast 10.99.1.0 dev swp1.10 proto kernel scope link src 10.99.1.1
10.99.1.0/30 dev swp1.10 proto kernel scope link src 10.99.1.1
local 10.99.1.1 dev swp1.10 proto kernel scope host src 10.99.1.1
broadcast 10.99.1.3 dev swp1.10 proto kernel scope link src 10.99.1.1
local fe80:: dev lo proto none metric 0 pref medium
local fe80:: dev lo proto none metric 0 pref medium
local fe80::6e64:1aff:fe00:5a0c dev lo proto none metric 0 pref medium
local fe80::6e64:1aff:fe00:5a0d dev lo proto none metric 0 pref medium
fe80::/64 dev swp1.10 proto kernel metric 256 pref medium
fe80::/64 dev swp2.10 proto kernel metric 256 pref medium
ff00::/8 dev swp1.10 metric 256 pref medium
ff00::/8 dev swp2.10 metric 256 pref medium
unreachable default dev lo metric 8192 error -101 pref medium
您还可以使用 ip [-6] route show vrf <vrf-name>
命令显示 VRF 中的路由。此命令省略了本地路由和广播路由,这些路由可能会使输出混乱。
考虑事项
- Cumulus Linux 仅根据入站接口进行表选择;数据包属性或基于出站接口的选择不可用。
- 在 BGP 外部使用
router-id
选项设置路由器 ID 会导致所有 BGP 实例获得相同的路由器 ID。如果您希望每个 BGP 实例都有自己的路由器 ID,请在使用bgp router-id
的 BGP 实例下指定router-id
。如果您同时指定router-id
和bgp router-id
,则 BGP 实例下的 ID 将覆盖您在 BGP 外部提供的 ID。 - 您无法在 VRF 中配置 EVPN 地址族。
- 当您使用
ifdown
关闭 VRF 时,Cumulus Linux 会从 FRR 中删除与该 VRF 关联的所有路由,但它 不会 从内核中删除路由。