我使用网络名称空间来做这种事情。对于不同命名空间中的每个适配器,数据流量肯定会通过线路而不是反映在网络堆栈中。单独的命名空间还可以防止反向数据包过滤器等阻碍。
所以假设 eth0 和 eth1,以 iperf3 作为反射代理(ping 服务器或其他)。[免责声明:文字来自记忆,所有错别字都是错别字,YMMV]
ip netns add target
ip link set dev eth1 up netns target
ip netns exec target ip address add dev eth1 xxx.xxx.xxx.xxx/y
ip netns exec target iperf3 --server
所以现在您已经创建了命名空间“目标”,将您的一个适配器移动到该命名空间中。设置它的IP地址。最后在该目标命名空间中运行您的应用程序。
您现在可以在本机命名空间中运行任何(兼容的)程序,如果它引用 xxx.xxx.xxx.xxx IP 地址(显然必须可以通过某些路由访问)将导致在线流量环回路径,将在另一个名称空间中找到适配器,就好像它是不同的计算机一样。
完成后,您终止守护程序服务器并按名称删除命名空间,然后命名空间成员恢复,您将返回原版。
killall iperf3
ip netns delete target
这也适用于单个接口的“虚拟功能”,但该示例需要梳理出一个或多个虚拟功能——例如 SR-IOV 类型适配器——并分发本地 MAC 地址。所以我做的还不够,没有准备好示例代码花絮。