Virtual Routing and Forwarding

本文深入探讨了VRF策略在Linux网络协议栈中的作用,如何通过VRF实现多租户环境下的路由与转发域隔离,以及VRF与命名空间、策略路由的结合使用。文章详细介绍了VRF的创建、配置过程,以及在不同应用场景下的实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 简介
VRF策略和路由规则配合在Linux网络协议栈中提供了一种创建虚拟路由与转发域地能力。一个典型的例子就是多租户问题,租户有自己地路由表,并且是不同的网关。

进程清晰地知道使用哪个VRF,通过将socket绑定在特定的VRF策略上。数据包通过socket系统调用后,使用与VRF策略关联的路由表发出。VRF策略实现的一个重要特性就是它只影响L3层及以上,所以L2工具(如LLDP)不受影响(即它们不需要在每个VRF中运行)。该设计还支持在VRF策略规则的基础上使用更高优先级的ip规则(策略路由PBR)进行优先引导特定流量。

此外,VRF策略允许将VRF嵌入到命名空间中,例如网络命名空间提供VRF虚拟网络接口层的隔离,命名空间内接口上的vlan提供L2隔离,VRF提供L3隔离。

二 设计
在创建VRF策略时,也会创建出一个虚拟网卡,所以文中的VRF策略与VRF虚拟网卡基本等同。

VRF虚拟网卡的创建会关联一张路由表,然后将实际网络接口或者VLAN等虚拟接口加入到特定的VRF策略,如下图所示:

网络接口收到报文后在IPv4和IPv6协议栈上处理给中会交给VRF虚拟网络接口, 造成一种是数据报文是经过VRF设备的假象(因为VRF是三层隔离,所以在ip-input中修改入接口为VRF虚拟接口)。与之类似,出接口上的路由规则让报文先经过VRF设备,而后再经过实际接口发出。这种实现就支持了tcpdump在VRF虚拟接口上对进出的报文进行tcpdump抓包,同时包括netfilter,tc在内。

[1] 转发的报文不会经过VRF虚拟网卡,因此这种报文无法被tcpdump抓取。------->求证

[2] IPtable在入方向实际接口支持PREROUTINT钩子点,在VRF虚拟接口支持INPUT和PREROUTING。在出方向,不管是实际接口还是VRF虚拟接口,都支持POSTROUTING和OUTPUT。

三 步骤

  1. VRF虚拟接口在创建时会关联一张FIB路由表,命令如下

 ip link add vrf-blue type vrf table 10 创建一个虚拟接口并关联一张表

 ip link set dev vrf-blue up 将虚拟接口状态置为UP

  1. 通过ip rule show 可知在虚拟网卡创建时,会生成一条策略路由指向l3mdev-table,这条策略路由对所有的VRF生效。用户可以修改这条策略路由的优先级,或者添加针对每个VRF虚拟网卡的策略。

ip rule add oif vrf-blue table 10

  1. 设置默认路由

ip route add table 10 unreachable default metric 4278198272

较高的metric 值保证可默认不可达路由可被路由协议生成的路由覆盖。FRR将metric解释为前一个字节表示距离,后面三个字节表示优先级。上述值即为[255/8192]

4,  设置L3接口归属于VRF虚拟接口

    ip link set dev ens6 master vrf-blue

    L3接口的主机路由和直连路由会自动的加入到VRF虚拟接口对应的路由表中,其

它依赖此接口的路由将被丢弃,需要重新加入到VRF接口对应的表中。

5,添加路由到表中

        ip route add table …….

        ip route add vrf vrf-xxx ……….

   

四 应用

     应用在使用VRF时,需要将socket绑定到相应的VRF 虚拟网卡上,或者在发送数据时通过IP_PKTINFO指定出接口信息。

     setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, dev, strlen(dev)+1)

      对于没有绑定接口的socket,端口范围就是在默认VRF(全局VRF)中。也就是说当归属于VRF虚拟网口的接口收到报文后,将无法匹配到对应的socket,因为应用程序可能绑定同样的端口。

     TCP和UDP服务运行在默认VRF上下文(即是没有绑定到任何VRF接口上) 可以在所有VRF域中生效通过设置下述选项:

     sysctl –w net.ipv4.tcp_l3mdev_accept = 1

     sysctl –w net.ipv4.udp_l3mdev_accept = 1

     这两个选项在默认情况下是关闭的,因此socket 只会选择对应VRF的报文。与之类似的是原始套接字,为了更好的向后兼容性,默认使能,效果相当于是没有绑定虚拟网口,每次通过IP_PKTINFO指定出接口发送报文。

   

五 使用iproute2 配置VRF

     ip link add dev NAME type vrf table ID
     ip [-d] link show type vrf
     ip -br link show type vrf
     ip link set dev NAME master NAME
     ip link show vrf NAME
     ip [-6] neigh show vrf NAME
     ip addr show vrf NAME
     ip [-6] route show vrf NAME
     ip [-6] route show table ID
     ip link set dev NAME nomaster

 

 

 

 

https://blog.youkuaiyun.com/dog250/article/details/78069964

 

 

03-11
### VRF (Virtual Routing and Forwarding) 配置与文档 #### Linux 内核中的 VRF 实现 VRF(虚拟路由转发)是由路由表和一组网络接口组成的逻辑实体,用于隔离不同租户或服务之间的流量。通过创建独立的路由空间,可以有效地管理多个不同的路由环境而不互相干扰[^1]。 对于 Linux 系统而言,在内核层面支持 VRF 功能意味着可以通过特定命令来管理和操作这些虚拟化的路由实例。例如,`ip link set dev eth1 master vrf-blue` 命令能够将第三层接口绑定至指定名称为 `vrf-blue` 的 VRF 设备上[^3]。 当涉及到实际的数据传输过程中,Linux 内核会依据接收到或者发出的数据包所对应的物理网卡属性自动判断其归属哪个具体的 VRF 范围,并执行相应的处理流程。比如发送数据时,`l3mdev_ip_out()` 函数负责设置目的地址解析结构体 (`dst_entry`) 并最终调用 `vrf_xmit()` 来完成报文的实际传送工作[^4]。 #### 技术文档资源推荐 为了更深入理解如何配置以及优化基于 VRF 构建的企业级解决方案,建议查阅官方手册和其他权威资料: - **《Linux Networking Documentation》**:提供有关于整个操作系统网络子系统的全面介绍,其中包含了关于 VRF 特性的描述及其应用场景说明。 - **Red Hat Enterprise Linux Network Guide**:针对企业版发行版本编写的操作指南,详细记录了各种高级特性如 VRF 的部署方法和技术细节。 - **Cisco IOS XE Virtual Routing and Forwarding Configuration Guide**:虽然主要面向思科产品线,但对于通用概念的理解同样具有很高的参考价值。 ```bash # 创建一个新的 VRF 接口并分配给它一个 IP 地址 ip netns add blue ip -n blue link set lo up ip -n blue addr add 192.0.2.1/24 dev lo ip link add name vrf-blue type vrf table 100 ip link set dev vrf-blue up ip link set dev eth1 master vrf-blue ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值