Virtual Routing and Forwarding (VRF)

Linux内核的Virtual Routing and Forwarding (VRF) 是由路由表和一组网络设备组成的路由实例。

VRF安装

Ubuntu默认不包括vrf内核模块,需要额外安装:

  1. apt-get install linux-headers-4.10.0-14-generic linux-image-extra-4.10.0-14-generic
  2. reboot
  3. apt-get install linux-image-extra-$(uname -r)
  4. modprobe vrf

VRF示例

  1. # create vrf device
  2. ip link add vrf-blue type vrf table 10
  3. ip link set dev vrf-blue up
  4. # An l3mdev FIB rule directs lookups to the table associated with the device.
  5. # A single l3mdev rule is sufficient for all VRFs.
  6. # Prior to the v4.8 kernel iif and oif rules are needed for each VRF device:
  7. ip ru add oif vrf-blue table 10
  8. ip ru add iif vrf-blue table 10
  9. #Set the default route for the table (and hence default route for the VRF).
  10. ip route add table 10 unreachable default
  11. # Enslave L3 interfaces to a VRF device.
  12. # Local and connected routes for enslaved devices are automatically moved to
  13. # the table associated with VRF device. Any additional routes depending on
  14. # the enslaved device are dropped and will need to be reinserted to the VRF
  15. # FIB table following the enslavement.
  16. ip link set dev eth1 master vrf-blue
  17. # The IPv6 sysctl option keep_addr_on_down can be enabled to keep IPv6 global
  18. # addresses as VRF enslavement changes.
  19. sysctl -w net.ipv6.conf.all.keep_addr_on_down=1
  20. # Additional VRF routes are added to associated table.
  21. ip route add table 10 ...

进程绑定VRF

Linux进程可以通过在VRF设备上监听socket来绑定VRF:

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

TCP & UDP services running in the default VRF context (ie., not bound
to any VRF device) can work across all VRF domains by enabling the
tcp_l3mdev_accept and udp_l3mdev_accept sysctl options:

  1. sysctl -w net.ipv4.tcp_l3mdev_accept=1
  2. sysctl -w net.ipv4.udp_l3mdev_accept=1

VRF操作

创建VRF

  1. ip link add dev NAME type vrf table ID

查询VRF列表

  1. # ip -d link show type vrf
  2. 16: vrf-blue: <NOARP,MASTER,UP,LOWER_UP> mtu 65536 qdisc noqueue state UP mode DEFAULT group default qlen 1000
  3. link/ether 9e:9c:8e:7b:32:a4 brd ff:ff:ff:ff:ff:ff promiscuity 0
  4. vrf table 10 addrgenmode eui64

添加网卡到VRF

  1. ip link set dev eth0 master vrf-blue

查询VRF邻接表和路由

  1. ip neigh show vrf vrf-blue
  2. ip addr show vrf vrf-blue
  3. ip -br addr show vrf vrf-blue
  4. ip route show vrf vrf-blue

从VRF中删除网卡

  1. ip link set dev eth0 nomaster

参考文档