我正在编写一个测试脚本来测试处理器板在制造过程中的老化周期。我想使用 netcat 将文件从一个进程传输到一个以太网端口并返回到另一个以太网端口以接收进程。看起来 netcat 是一个很容易使用的工具。
问题是,如果我在单独的 IP 子网上设置具有 IP 地址的以太网端口并尝试从一个到另一个传输数据,内核的协议(protocol)堆栈会检测到内部路由,尽管数据传输按预期完成,它不会通过电线出去。数据包在内部路由。
这对网络优化非常有用,但它阻碍了我想做的测试。
有没有简单的方法来完成这项工作? iptables 有什么有用的技巧吗?或者您可以对路由表做些什么?
最佳答案
我使用网络 namespace 来做这类事情。对于不同 namespace 中的每个适配器,数据流量肯定会通过线路而不是反射(reflect)在网络堆栈中。单独的命名空间还可以防止反向数据包过滤器等妨碍。
因此假定 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 地址。最后在该目标命名空间中运行您的应用程序。
您现在可以在 native 命名空间中运行任何(兼容)程序,如果它引用 xxx.xxx.xxx.xxx IP 地址(显然必须可以通过某些路由访问)将导致在线流量,具有适当的环回路径,将在另一个 namespace 中找到适配器,就好像它是一台不同的计算机一样。
完成后,您终止守护进程服务器并按名称删除命名空间,然后命名空间成员恢复,您又回到原版。
killall iperf3
ip netns delete target
这也适用于单个接口(interface)的“虚函数”,但该示例需要梳理出一个或多个虚函数——例如SR-IOV 型适配器——并分发本地 MAC 地址。所以我做的还不够多,无法准备好示例代码花絮。
关于linux - 使用 netcat 进行两个端口之间的外部环回测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13095909/