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

Linux 使用netcat进行两个端口之间的外部环回测试,linux,networking,iptables,netcat,Linux,Networking,Iptables,Netcat,我正在编写一个测试脚本,以便在制造过程中对处理器板进行老化测试。我想使用netcat将文件从一个进程传输到一个以太网端口,然后再传输回另一个以太网端口到接收进程。看来netcat是一个很容易使用的工具 问题是,如果我在单独的IP子网上设置具有IP地址的以太网端口,并尝试将数据从一个传输到另一个,内核的协议栈会检测到一条内部路由,尽管数据传输按预期完成,但不会通过线路传输出去。数据包在内部路由 这对网络优化很好,但它挫败了我想做的测试 有没有简单的方法来实现这一点?是否有一个iptables的技巧

我正在编写一个测试脚本,以便在制造过程中对处理器板进行老化测试。我想使用netcat将文件从一个进程传输到一个以太网端口,然后再传输回另一个以太网端口到接收进程。看来netcat是一个很容易使用的工具

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

这对网络优化很好,但它挫败了我想做的测试


有没有简单的方法来实现这一点?是否有一个iptables的技巧可以奏效?或者您可以对路由表执行一些操作?

首选内部路由,因为在默认路由行为中,您在
本地
表中将所有内部路由标记为
范围链接
。请通过以下方式查看此信息:

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

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

因此,假设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地址。因此,我还没有做足够的工作来准备一个示例代码提示。

是的,您可以使用
iptables
来完成。看到这个@BrianCain,谢谢你的链接——看起来确实很有希望。很复杂,但很有前途。哇,真的很有趣。我将在下周再次进行这个项目时尝试一下。从你的个人资料来看,你似乎是新来的,但如果你能拿出这样的答案,你应该在任何时候都达到rep>1000!