您好,我有 2 台 Ubuntu 22 机器,通过 netplan 配置了 3-3 个不同的 VRF。
当我执行“ping -I <source-interface> <destination-IP>
一切正常”操作时,ICMP 流量将通过正确的 VRF 作为关联的源接口。
我想进行性能测试iperf3但我找不到指定源接口的方法,因此应用程序将使用正确的 VRF。有没有办法做到这一点?
答案1
选项--bind-dev
加入为了您的特定目的:
enh:支持 SO_BINDTODEVICE (#1097)
这使得 iperf 能够更好地与多宿主计算机和 VRF 配合使用。
唉,这个选项在iperf3由 Ubuntu 22 LTS 提供。它可在下一个(尚未 EOL-ed)版本中使用乌班图23.04:
--bind-dev dev bind to the specified network interface. This option uses SO_BINDTODEVICE, and may require root permissions. (Available on Linux and possibly other systems.)
然后,该命令将用于客户端选择vrf-blue
接口并到达 198.51.100.2 的服务器:
iperf3 --bind-dev vrf-blue -c 198.51.100.2
同时,您可以:
使用
ip vrf exec
这是一个带通滤波器包装器/拦截器依赖cgroupv2。它将使应用程序自动使用SO_BINDTODEVICE
。在客户端上,命令如下:
ip vrf exec vrf-blue iperf3 -c 198.51.100.2
绑定到
vrf-blue
(并让它选择正确的源IP地址,否则也使用--bind
)。如果先决条件不可用,您可以创建一个
LD_PRELOAD
包装器bind(2)
以相同的方式改变行为。我已经在这个 Q/A 的答案中用 C 语言提供了这样的包装器:如何配置 podman 容器以仅使用我的wireguard 接口?
包装器有点不太直观,需要绑定到一个地址并将其与环境变量匹配,以确认它将绑定到接口(使用其他环境变量)。如果绑定时使用的本地源地址
vrf-blue
是 192.0.2.2,则上面的等效内容将是(实际上是一行):LD_PRELOAD=./bindtodevicewrapper.so \ WRAPPER_BINDTODEVICE=vrf-blue \ WRAPPER_INET=192.0.2.2 \ iperf3 --bind 192.0.2.2 -c 198.51.100.2