使用Netcat进行两个端口之间的外部环回测试

3
我正在编写一个测试脚本,在制造过程中对处理器板进行烧入循环测试。我想使用netcat从一个进程传输文件,从一个以太网口输出并返回到另一个以太网口传输给接收进程。看起来,netcat是一个易于使用的工具。
问题是,如果我在不同的IP子网上设置以太网口的IP地址,并尝试从一个端口传输数据到另一个端口,内核协议栈会检测到一个内部路由,尽管数据传输如预期完成,但它不会通过网线传输。 数据包被内部路由。
这对于网络优化很好,但它破坏了我的测试。
有没有简单的方法使它正常工作?是否有iptables技巧可用?或者也许可以在路由表中进行操作?

1
是的,你可以使用 iptables 完成这个任务。参见 serverfault 上的这个回答 - Brian Cain
@BrianCain 感谢您提供的链接 - 看起来很有前途。虽然有些复杂,但还是很有前途的。 - AlanObject
2个回答

3
我使用网络命名空间来完成这种事情。将每个适配器放在不同的命名空间中,数据流量一定会通过电线传输,而不是在网络堆栈中反射。独立的命名空间还可以防止反向数据包过滤器等工具干扰。

因此,假设有eth0和eth1,以iperf3作为反射代理(ping服务器或其他)。[免责声明:根据记忆记录,所有的拼写错误都是拼写错误,结果可能会有所不同]

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地址(显然必须通过某些路由可达),将导致在线流量,在合适的回环路径下,会发现在另一个命名空间中的适配器,就像完全不同的计算机一样。

完成后,您可以通过名称杀死守护程序服务器并删除命名空间,然后命名空间成员将恢复为基本状态。

killall iperf3
ip netns delete target

这也适用于单个接口的“虚函数”,但该示例需要解出一个或多个虚函数,例如SR-IOV类型的适配器,并分配本地MAC地址。因此,我还没有做到足够的程度,以便准备好一个样本代码片段。

2

首选内部路由,因为在默认路由行为中,您可以将所有内部路由标记为范围链接本地表中。请使用以下命令进行检查:

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

哇,这真的很有趣。下周我再次开始这个项目时,我会尝试一下。从你的个人资料来看,你似乎是新来的,但如果你能像这样提供答案,你很快就可以达到1000的声望值! - AlanObject

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接