我在linux机器上有两个以太网接口。两者的IP地址如下:接口A: 10.0.1.5/24接口B: 10.0.2.5/24
两个接口都连接到在两个网络之间路由的路由器。
现在我想启动一个iperf3测试,在这里我将服务器绑定到接口A,客户机绑定到接口B。
问题是,流量不会离开物理接口,而是只通过内核,从而导致在链接上甚至不可能达到的速度。
我能做些什么来迫使流量通过物理接口?ip_forward是禁用的。
谢谢。
发布于 2022-02-18 18:43:14
要让Linux系统使用单一的路由堆栈,在不使用并非不可能接口的情况下从自身执行多归属的数据包路由是非常困难的(但是是lo
)。
但是,在Linux上很容易创建额外的网络栈来模拟一个系统中的多个系统:通过使用网络命名空间。
在这里,可以将两个NIC中的一个放弃给一个新的网络名称空间,该名称空间将是初始(主机)网络名称空间的对等点。他们不会直接通信,但只能通过外部路由器。让我们假设接口实际上名为A
和B
,路由器使用的是地址10.0.1.1/24
+ 10.0.2.1/24
。
B
移到新的网络命名空间: ip链路集、dev、netns、sideB注意:无线接口需要使用iw
命令。现在可以运行(在两个终端中):
iperf3 -s
ip netns exec sideB iperf3 -c 10.0.1.5
客户端在新的网络命名空间中运行。
一旦测量结束,删除网络命名空间将返回NIC到主机名称空间。但是,如果使用此网络命名空间(类似于ip netns exec side B setsid sleep 9999
)留下任何进程,下面的ip netns delete sideB
只会从iproute2工具的视图中删除名称空间,而不会在进程结束之前实际删除命名空间,从而使NIC难以恢复。所以最好先把它移回去:
ip -n sideB link set dev B netns 1
ip netns delete sideB
其中1
的意思是PID 1's网络名称空间:初始/主机名称空间。此外,这允许在一个容器内执行实验,该容器已被赋予物理NIC (因为1
的S网络名称空间是容器的名称空间,而不是实际的主机名称空间),或者物理NIC将再次出现在主机上,如果没有对主机的访问,物理NIC将永远丢失到容器中。
如果没有工具(如udev +ifupdown的allow-hotplug
或NetworkManager)检测NIC的幻影,则必须在返回时再次配置它。
https://serverfault.com/questions/1094092
复制相似问题