2

我正在编写一个测试脚本来在制造过程中锻炼处理器板的老化周期。我想使用 netcat 将文件从一个进程传输到一个以太网端口并返回到另一个以太网端口到接收进程。看起来netcat将是一个简单的工具。

问题是,如果我在不同的 IP 子网上设置带有 IP 地址的以太网端口并尝试将数据从一个传输到另一个,内核的协议栈会检测到内部路由,尽管数据传输按预期完成,但它不会走出电线。数据包在内部路由。

这对网络优化非常有用,但它挫败了我想做的测试。

有没有简单的方法来完成这项工作?iptables有一个可以工作的技巧吗?或者你可以对路由表做些什么?

4

2 回答 2

2

首选内部路由,因为在默认路由行为中,您将所有内部路由标记为scope linklocal中。看看这个:

ip rule show
ip route show table local

如果你的内核支持多个路由表,你可以简单地改变local表来实现你的目标。你不需要iptables

假设 192.168.1.1 是您的目标 IP 地址,而 eth0 是您要将数据包发送到网络的接口。

ip route add 192.168.1.1/32 dev eth0 table local
于 2013-03-07T12:50:15.537 回答
1

我使用网络名称空间来做这种事情。对于不同命名空间中的每个适配器,数据流量肯定会通过线路而不是反映在网络堆栈中。单独的命名空间还可以防止反向数据包过滤器等阻碍。

所以假设 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 地址。所以我做的还不够,没有准备好示例代码花絮。

于 2018-04-03T02:10:42.113 回答