我正在编写一个测试脚本,用于在制造过程中使用处理器板进行老化循环。我想使用netcat从一个进程传输文件,从一个以太网端口传输回另一个以太网端口到接收进程。看起来像 netcat 将是一个简单的工具。
问题是,如果我在不同的IP子网上设置带有IP地址的以太网端口并尝试将数据从一个传输到另一个,则内核的协议栈会检测内部路由,尽管数据传输按预期完成,它不会通过电线出去。数据包在内部路由。
这对于网络优化非常有用,但它会影响我想要做的测试。
有没有简单的方法让这项工作?是否有一个 iptables 的技巧可行?或者你可以对路线表做些什么?
答案 0 :(得分:2)
首选内部路由,因为在默认路由行为中,您在scope link
表中将所有内部路由标记为local
。用以下内容查看:
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
答案 1 :(得分: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
所以现在你已经创建了命名空间“target”,将一个适配器移动到该命名空间中。设置其IP地址。最后在目标命名空间中运行您的应用程序。
您现在可以在本机命名空间中运行任何(兼容的)程序,如果它引用xxx.xxx.xxx.xxx IP地址(显然必须通过某种路由可以访问)将导致在线流量,使用适当的环回路径,将在另一个命名空间中找到适配器,就好像它是一个不同的计算机一样。
完成后,您将终止守护程序服务器并按名称删除命名空间,然后命名空间成员还原,然后您又回到了vanilla。
killall iperf3
ip netns delete target
这也适用于单个界面的“虚拟功能”,但该示例需要梳理一个或多个虚拟功能---例如SR-IOV类型适配器 - 并分发本地mac地址。所以我还没有做到足以让样本代码准备就绪。