VRF:Virtual Routing and Forwarding/虚拟路由转发,是一种网络虚拟化技术,具体而言,它是一种在单台网络设备中,利用当前硬件或逻辑接口创建多个独立的网络设备,每个独立的网络设备相互隔离,具有各自的路由表,从而运行多个独立的网络。VRF的优点:主要用来解决IP地址重叠、降低成本、三层隔离(VLAN属于二层隔离)。在这么多优点的裹挟下,遇到合适的场景再不使用似乎只有“懒惰”这一个理由了。之所以打算通过Linux虚拟机运行VRF,是因为当下维护的生产环境:多个外部用户每家通过单或双MSTP专线接入我方系统,需要有一个平台使用反向代理多个内部服务后,再统一一个入口供外部用户访问。从管理便捷角度出发,我方需要考虑多个因素:1、提供唯一的服务IP供外部用户通过接口获取数据;2、对MSTP链路接口IP、用户源地址重复/冲突免疫;3、外部用户之间相互隔离。根据环境和需求,从一个虚拟机/操作系统角度绘制了一份图例:支持VRF的网络设备有很多,但特性、程度各有不同,不仅需要花大价钱购买的同时,单台设备还容易成为故障点,显然,使用Linux系统自建更符合各方利益(几乎免费、即便主机故障,虚拟机也可以漂移后重启)中的VRF Machine是一个虚拟机,分配2块虚拟网卡,一块配置管理接口的同时也成为反向代理内部服务的源地址,另一块配置trunk,不同用户使用vlan形式分离,同时每个vlan对应一个接口,每个接口属于一个逻辑的vrf设备,再为每个dev vrf创建一条路由表(由于已经VRF隔离,所以只需要一条默认路由)。以Debian 13系统为例,默认的软件包(主要是iproute2)已经能够满足使用要求,相关配置均使用IP命令,步骤如下:ip link add [vrf interface name] type vrf table 101 //添加一个类型为vrf的接口,同时指定到路由表101ip link set dev [vrf interface name] up //使添加的vrf接口上线ip link set dev [已添加的vlan子接口] master [vrf interface name] //将对应的vlan子接口绑定到vrf实例(需提前添加一个对应的vlan子接口并使其up,否则将报错)ip link set [已添加的vlan子接口] vrf [vrf interface name] //与上个命令功能一样,可根据习惯选择ip route add default via x.x.x.x table 101 //针对路由表101添加默认路由,使得vrf内可调用
ip route list table 101 //查看路由表101,可以看到除了添加的默认路由外,还有直连路由、广播等信息ip neighbor show master [vrf interface name] //可以看到直连的邻居建立情况,正常一般为REACHABLEip addr show vrf [vrf interface name] //查看vrf对应vlan子接口状况、接口是否up、ip地址等ip vrf show //查看vrf对应的路由表,如果将配置写入/etc/iproute2/rt_tables,则重启后也生效ping -I [vrf interface name] [dst_ip] //指定特定vrf接口以ICMP形式验证网络连通性(对端)
上述配置运行在内存中,重启将失效,但可将命令制作为脚本,添加为自动加载的服务,就不用担心重启。VRF的引入使用,不仅将管理、配置全部集中,还节约了大量硬件设备购买的资金。通常而言,此类点对点连接,源地址、目的地址与接口地址区分的前提下,一般至少需要用到带端口隔离或VRF功能的三层交换机(路由器、防火墙接口少,不足以应对几十条、上百条线路接入)。扩展阅读:iproute2软件包,还有一个和VRF类似的功能:Policy Routing,在多网卡下实现源进源出,即数据包从哪块网卡进入,就从哪块网卡原路返回,而默认情况下,即便多网卡、多IP,所有返回的数据包系统只从默认或明细路由返回,不符合多运营商情况下的访问优化。