【问题标题】:Is there a way to set a socket option to indicate which VRF to use?有没有办法设置一个套接字选项来指示要使用哪个 VRF?
【发布时间】:2015-07-24 07:31:11
【问题描述】:

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

当我接受连接时我可以设置一个 sock opt 还是有其他方法可以做到这一点?

谢谢

【问题讨论】:

  • 我过去曾为此苦苦挣扎,那是内核 2.6,据我所知,它不支持此功能。从那以后我没有更新它,但你可能会发现这个补丁:sourceforge.net/p/linux-vrf/patches/1很有用
  • 您可以添加操作系统。首先评论假定 Linux。

标签: c networking tcp


【解决方案1】:

在 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 上下文中运行。

【讨论】:

    猜你喜欢
    • 2013-05-22
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多