有没有办法设置套接字选项来指示使用哪个VRF?

时间:2015-05-13 06:50:09

标签: c networking tcp

我正在打开一个连接,并希望套接字不使用默认的VRF,而是使用特定的VRF名称或ID。

我接受连接时是否有可以设置的袜子选项,还是有其他方法可以设置?

由于

1 个答案:

答案 0 :(得分:0)

要在VRF中运行的应用程序需要将其套接字绑定到 VRF设备:

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

或使用cmsg和IP_PKTINFO指定输出设备。

默认情况下,未绑定套接字的端口绑定范围是 限于默认VRF。也就是说,它不会与数据包匹配 到达从属到l3mdev的接口,并且进程可能绑定到 如果它们绑定到l3mdev,则为相同的端口。

在默认VRF上下文中运行的TCP和UDP服务(即未绑定) 到任何VRF设备)可以通过启用以下功能在所有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上下文中运行。