在 VRF 中工作的应用程序需要将其套接字绑定到
VRF 设备:
setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, dev, strlen(dev)+1);
或使用 cmsg 和 IP_PKTINFO 指定输出设备。
默认情况下,未绑定套接字的端口绑定范围是
仅限于默认 VRF。即不会被包匹配
到达受 l3mdev 奴役的接口,并且进程可能绑定到
如果它们绑定到 l3mdev,则使用相同的端口。
在默认 VRF 上下文中运行的 TCP 和 UDP 服务(即,未绑定
到任何 VRF 设备)可以通过启用
tcp_l3mdev_accept 和 udp_l3mdev_accept sysctl 选项:
sysctl -w net.ipv4.tcp_l3mdev_accept=1
sysctl -w net.ipv4.udp_l3mdev_accept=1
这些选项默认禁用,因此 VRF 中的套接字仅
为该 VRF 中的数据包选择。 RAW 也有类似的选项
套接字,出于向后兼容性的原因,默认情况下启用。
这是为了用 cmsg 和 IP_PKTINFO 指定输出设备,但是
使用未绑定到相应 VRF 的套接字。这允许例如老平
在指定设备但不执行设备的情况下运行的实现
在 VRF 中。可以禁用此选项,以便在 VRF 中接收到的数据包
上下文仅由绑定到 VRF 的原始套接字处理,而数据包在
默认 VRF 仅由未绑定到任何 VRF 的套接字处理:
sysctl -w net.ipv4.raw_l3mdev_accept=0
VRF 设备上的 netfilter 规则可用于限制对服务的访问
也在默认 VRF 上下文中运行。