VPP Linux Router

Q&A

Q 都2025年了你还没有踏上信息高速路?

A 石丹理教授:“我勸他們不要安裝寬頻,56K已足夠”

Software Router

2025年基于Linux的网络操作系统网上一搜一大把,如ROS,VyOS,OpenWrt等,你甚至可以拿Windows当路由器。这么多系统总结下来,核心是一样的——利用操作系统内核的网络栈处理数据包。

然而内核转发并非万能解法,由于内核对于数据包的处理方式,处理大量数据包的效率是比较低的,直观感受就是需要高性能高主频的CPU来进行“大力出奇迹”,或者采用一些讨巧的办法让数据包在内核里少处理几步以提高效率如ROS的Fastpath。

无论怎么优化都是逃不掉内核转发的缺陷,对于400G内网Homelab玩家来说,这时候就得来一些别的办法了,把网卡扔去用户态让专用的软件进行高效转发。

Vector Packet Processing

Vector Packet Processing(VPP)是一个软件转发平面,常见的使用方式是通过DPDK技术来处理数据包,随着VPP的更新,其也可以通过其他方式如RDMA,XDP,AVF来处理数据包。

相对于内核网络栈的局限性,VPP通过矢量包处理的方式可以轻松地处理数十G或上百G的流量,VPP自身是一个数据平面,默认情况VPP控制的路由并不会和内核路由表交互,常见的路由控制平面如BIRD,FRRouting等在默认情况下并不能控制VPP内的路由。

Linux Control Plane

VPP包含了插件来实现其与内核的交互,通过插件可以镜像VPP内的接口到内核中并同步接口的状态与路由。这样在内核中就有了一份VPP FIB的副本,同时插件可以将内核中对于接口和路由的操作同步到VPP中,借此可以与控制面软件共用实现基于VPP转发的Linux软路由。

踩坑记录

VPP的LCP插件本身并不具备识别内核中不同路由表的能力,但是我们可以通过一些操作来解决路由表的同步。

操作流程可以简化为如下几步

1. VPP配置LCP插件并镜像接口到内核
2. 通过iproute2创建VRF并配置接口VRF
3. VPP配置路由表并将相关接口加入到路由表中
4. 通过iproute2配置接口IP地址等
5. 使用FRRouting/BIRD等控制路由

具体操作如下:

Host配置:

Namespace
    default
        master
    dataplane
        master
        vrf-red(table 10)
Interface
    eth1
    eth0(GigabitEthernet0/13/0)
        192.168.1.3/26(Gateway: 192.168.1.1)

目标:

使用VPP控制eth0接口并创建vrf-red,eth0加入新建的vrf并控制路由。

命令:

除非特殊注明namespace,命令无需在特定namespace中执行

1
2
3
4
5
6
7
8
9
vppctl lcp lcp-sync on
vppctl ip table 10
(dataplane)ip link add vrf-red type vrf table 10
(dataplane)ip link set vrf-red up
vppctl lcp create GigabitEthernet0/13/0 host-if eth0
(dataplane)ip link set eth0 master vrf-red
(dataplane)ip link set eth0 up
vppctl set interface ip table GigabitEthernet0/13/0 10
(dataplane)ip address add 192.168.1.3/26 dev eth0

验证:

在FRRouting中配置到172.16.1.0/24的路由,在VPP中查看路由表

1
vppctl show ip fib table 10

可看到:

1
2
3
4
172.16.1.0/24
unicast-ip4-chain
[@0]: dpo-load-balance: [proto:ip4 index:24 buckets:1 uRPF:26 to:[0:0]]
[0] [@5]: ipv4 via 192.168.1.1 GigabitEthernet0/13/0: mtu:9000 next:5 flags:[] a09351e842c35ebc80b7db310800