管理 VRF

管理 VRF虚拟路由和转发 - VRF(虚拟路由表和转发)的一个子集,并在带外管理网络和带内数据平面网络之间提供隔离。 对于 VRF, 路由表是数据平面交换机端口的默认表。 使用管理 VRF,交换机使用第二个表 mgmt,用于通过交换机的以太网端口进行路由。 mgmt 名称是专门用于从数据平面 VRF 识别管理 VRF。

Cumulus Linux 仅支持 eth0(或 eth1,具体取决于交换机平台)用于带外管理。 以太网端口是纯软件端口,不由 switchd 进行硬件加速。 VLAN 子接口、绑定、网桥和前面板交换机端口不支持作为 OOB 管理接口。

可以使用环回口和 SVI(交换机虚拟接口)对 Cumulus Linux 进行带内管理。

Cumulus Linux 默认启用管理 VRF。 默认情况下,管理员运行的 IPv4 和 IPv6 网络应用程序(例如,Ansible、Chef 和 apt-get)通过管理网络进行通信。 此默认上下文不会影响通过 systemdsystemctl 命令运行的服务,也不会影响检查交换机状态的命令,例如列出链路、邻居或路由的 ip 命令。

本节中的管理 VRF 配置包含 127.0.0.1/8 的本地主机环回 IPv4 地址和 ::1/128 的 IPv6 地址。 管理 VRF 必须同时具有 IPv6 地址和 IPv4 地址才能正常工作。 将环回地址添加到管理 VRF 的第 3 层域可防止应用程序出现问题,这些应用程序期望环回 IP 地址存在于 VRF 中,例如 NTP。

启动管理 VRF

如果您使用 ifdown 关闭管理 VRF,要将其重新启动,您需要执行以下两项操作之一

  • 运行 ifup --with-depends mgmt 命令
  • 运行 ifreload -a 命令

以下命令示例关闭管理 VRF,然后使用 ifup --with-depends mgmt 命令将其重新启动

cumulus@switch:~$ sudo ifdown mgmt
cumulus@switch:~$ sudo ifup --with-depends mgmt

运行 ifreload -a 会断开配置为自动的任何接口的会话。

在管理 VRF 中运行服务

Cumulus Linux 中的大多数默认服务都支持 VRF。 如果您想在管理 VRF 而不是默认 VRF 中运行服务,请运行以下命令

  1. 如果服务正在运行,请停止该服务

    cumulus@switch:~$ sudo systemctl stop <service>.service
    
  2. 禁止该服务在默认 VRF 中自动启动

    cumulus@switch:~$ sudo systemctl disable <service>.service
    
  3. 在管理 VRF 中启动服务

    cumulus@switch:~$ sudo systemctl start <service>@mgmt.service
    
  4. 在管理 VRF 中启用该服务,以便在交换机启动时启动

    cumulus@switch:~$ sudo systemctl enable <service>@mgmt.service
    
  5. 使用 ps aux | grep <service> 命令验证该服务是否在管理 VRF 中运行。

运行以下命令以显示与管理 VRF 关联的进程 ID

cumulus@switch:~$ ip vrf pids mgmt
 2559  login
 2753  bash
 2045  dhclient
 5421  sshd
 5462  sshd
 5463  bash
37691  sshd
37732  sshd
37735  bash
55679  sshd
55720  sshd
55721  bash
55993  ip
 3834  ntpd
 2023  python3
 2563  netqd
 1855  login
 2770  bash

运行以下命令以显示指定进程的 VRF 关联

cumulus@switch:~$ ip vrf identify 2045
mgmt

运行 ip vrf help 以获取其他 ip vrf 命令。

在管理 VRF 中使用 snmpd 启用轮询

当您启用 snmpd 在管理 VRF 中运行时,您需要指定该 VRF,以便 snmpd 在管理 VRF 中的 eth0 上侦听; 您还可以配置 snmpd 在其他端口上侦听。 在 Cumulus Linux 中,SNMP 配置支持 VRF,因此 snmpd 可以绑定到配置有特定 VRF(路由表)的多个 IP 地址。 snmpd 守护程序响应传入请求的 VRF 接口上的轮询请求。 有关配置 SNMP 版本 1、2c 和 3 Trap 以及 (v3) Inform 消息的信息,请参阅 简单网络管理协议 - SNMP

在管理 VRF 中启动 snmpd 后,会显示消息 Duplicate IPv4 address detected, some interfaces may not be visible in IP-MIB。 这是因为 IP-MIB 假设您不能在同一设备上两次使用相同的 IP 地址; IP-MIB 不支持 VRF。 此消息是警告 SNMP IP-MIB 检测到系统上重叠的 IP 地址; 它表示存在问题,也不会影响交换机的运行。

在管理 VRF 上 ping 或 traceroute

默认情况下,当您发出 pingtraceroute 时,数据包会转到数据平面网络(主路由表)。 要在管理网络上使用 pingtraceroute,请使用 ping -I mgmttraceroute -i mgmt。 要选择管理 VRF 中的源地址,请对 traceroute 使用 -s 标志。

cumulus@switch:~$ ping -I mgmt <destination-ip>
cumulus@switch:~$ sudo traceroute -i mgmt -s <source-ip> <destination-ip>

有关使用 pingtraceroute 的更多信息,请参阅 网络故障排除

以非 root 用户身份运行服务

要以非 root 用户身份在管理 VRF 中运行服务,您需要基于原始服务文件创建自定义服务。 以下示例命令将 SSH 服务配置为以非 root 用户身份在管理 VRF 中运行。

  1. 运行以下命令以在 /etc/systemd/system 目录中创建自定义服务文件。

    cumulus@switch:~$ sudo -E systemctl edit --full ssh.service
    
  2. 如果 [Service] 下存在 User 指令,请将其注释掉。

    cumulus@switch:~$ sudo nano /etc/systemd/system/ssh.service
    ...
    [Service]
    #User=username
    ExecStart=/usr/local/bin/ssh agent -data-dir=/tmp/ssh -bind=192.168.0.11
    ...
    
  3. 修改 ExecStart 行为 /usr/bin/ip vrf exec mgmt /sbin/runuser -u USER -- ssh

    ...
    [Service]
    #User=username
    ExecStart=/usr/bin/ip vrf exec mgmt /sbin/runuser -u cumulus -- ssh
    ...
    

OSPF 和 BGP

FRR 支持 VRF,并根据交换机端口路由表发送数据包。 这包括通过环回接口的 BGP 对等互连。 BGP 在默认表中查找路由。 但是,根据您重新分发路由的方式,您可以执行以下修改。

管理 VRF 使用 mgmt 表,包括本地路由。 当您使用路由协议(例如 OSPF 和 BGP)时,这不会影响路由重分发。

要在您的网络中重新分发路由,请在 BGP 或 OSPF 下使用 redistribute connected 命令。 这使 eth0 的直接连接网络能够通告到其邻居。

这还在邻居设备上创建一条通过数据平面到管理网络的路由。

NVIDIA 建议使用路由映射来控制您使用 redistribute connected 命令重新分发的通告网络。

cumulus@switch:~$ nv set router policy route-map REDISTRIBUTE rule 10 match type ipv4
cumulus@switch:~$ nv set router policy route-map REDISTRIBUTE rule 10 match interface eth0
cumulus@switch:~$ nv set router policy route-map REDISTRIBUTE rule 10 action deny
cumulus@switch:~$ nv set vrf default router bgp address-family ipv4-unicast redistribute connected route-map REDISTRIBUTE
cumulus@switch:~$ nv config apply
cumulus@switch:$ sudo vtysh
...
switch# configure terminal
switch(config)# route-map REDISTRIBUTE-CONNECTED deny 10 
switch(config-route-map)# match interface eth0
switch(config)# route-map REDISTRIBUTE-CONNECTED permit 100
switch(config-route-map)# exit
switch(config)# router bgp
switch(config-router)# address-family ipv4 unicast
switch((config-router-af)# redistribute connected route-map REDISTRIBUTE-CONNECTED
switch(config)# end
switch# write memory
switch# exit

vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。 例如

...
router bgp 65101
 bgp router-id 10.10.10.1
 neighbor swp51 interface remote-as external
 neighbor swp52 interface remote-as external
 !
 address-family ipv4 unicast
  network 10.1.10.0/24
  network 10.10.10.1/32
  redistribute connected route-map REDISTRIBUTE-CONNECTED
  maximum-paths 64
  maximum-paths ibgp 64
 exit-address-family
!
route-map REDISTRIBUTE-CONNECTED deny 100
match interface eth0
!
route-map REDISTRIBUTE-CONNECTED permit 1000
...

SSH

  • 要限制 SSH 仅在管理 VRF 上或管理 VRF 上的特定 IP 地址上侦听,请参阅 SSH 和 VRF

  • 如果您通过交换机端口 SSH 连接到交换机,则 SSH 按预期工作。 如果您需要从交换机通过交换机端口 SSH 连接出去,请使用 ip vrf exec default ssh <switch-port-ip-address> 命令。 例如

    cumulus@switch:~$ sudo ip vrf exec default ssh 10.3.3.3
    

查看路由表

当您使用 ip route get 返回有关单个路由的信息时,该命令默认通过 mgmt 表解析。 要显示有关交换芯片中路由的信息,请运行此命令

cumulus@switch:~$ ip route get <ip-address>

要获取任何 VRF 的路由,请运行 ip route get <ip-address> oif <vrf-name> 命令。 例如,要显示管理 VRF 的路由,请运行

cumulus@switch:~$ ip route get <ip-address> oif mgmt

mgmt 接口类

ifupdown2 使用 接口类 来为接口创建用户定义的分组。 特殊类 mgmt 可用于将交换机的管理接口与数据接口分开。 这允许您默认情况下使用 ifupdown2 命令管理数据接口。 对 mgmt 接口执行操作需要指定 --allow-mgmt 选项,这可以防止管理接口上发生意外中断。 默认情况下,Cumulus Linux 会在交换机启动时启动 auto(默认)类和 mgmt 接口类中的所有接口。

您可以在 /etc/network/interfaces 文件中配置管理接口。 以下示例将管理接口 eth0 和管理 VRF 节添加到 mgmt 接口类

...
auto lo
iface lo inet loopback

allow-mgmt eth0
iface eth0 inet dhcp
    vrf mgmt

allow-mgmt mgmt
iface mgmt
    address 127.0.0.1/8
    address ::1/128
    vrf-table auto
...

当您对 mgmt 类中的接口运行 ifupdown2 命令时,请在命令中包含 --allow=mgmt。 例如,要查看哪些接口在 mgmt 接口类中,请运行

cumulus@switch:~$ ifquery l --allow=mgmt
eth0
mgmt

要重新加载 mgmt 类中接口的配置,请运行

cumulus@switch:~$ sudo ifreload --allow=mgmt

您仍然可以使用 ifup eth0ifdown eth0 启动和关闭管理接口。

管理 VRF 和 DNS

Cumulus Linux 通过 IP FIB 规则支持通过管理 VRF 的 DHCP 和静态 DNS 条目,它添加这些规则以将查找定向到管理 VRF 的 DNS 地址。

为了让 DNS 使用管理 VRF,静态 DNS 条目必须在 /etc/resolv.conf 文件中引用管理 VRF。 您不能两次指定相同的 DNS 服务器地址以将其与不同的 VRF 关联。

例如,要指定 DNS 服务器并将其中一些服务器与管理 VRF 关联,请运行以下命令

cumulus@switch:~$ nv set service dns default server 192.0.2.1
cumulus@switch:~$ nv set service dns mgmt server 198.51.100.31
cumulus@switch:~$ nv set service dns mgmt server 203.0.113.13
cumulus@switch:~$ nv config apply

编辑 /etc/resolv.conf 文件以添加 DNS 服务器并将其中一些服务器与管理 VRF 关联。 例如

cumulus@switch:~$ sudo nano /etc/resolv.conf
nameserver 192.0.2.1
nameserver 198.51.100.31 # vrf mgmt
nameserver 203.0.113.13 # vrf mgmt

运行 ifreload -a 命令以加载新配置

cumulus@switch:~$ ifreload -a

  • 由于 FIB 规则强制 DNS 查找通过管理接口进行,因此如果您使用重叠地址,这可能会影响数据平面端口。 例如,当交换机通过管理 VRF 学习 DNS 服务器 IP 地址时,它会为该 IP 地址创建 FIB 规则。 当 DHCP 中继具有相同的 IP 地址时,即使前面板端口上存在路由,交换机也会将到达前面板端口的任何 DHCP 发现数据包转发到管理接口 (eth0) 之外。
  • 如果您未指定 DNS 服务器并且您丢失了带内连接,则 DNS 将无法通过管理 VRF 工作。 Cumulus Linux 不假设所有 DNS 服务器都可以通过管理 VRF 访问。