我的问题是,紫红绿和橙色电脑实际上是硬编码的工业系统,我无法更改它们的任何设置。
我需要通过添加拦截PC来拦截和操作UDP数据包。
示例 - 红色 PC 192.168.0.20 向紫色 PC 发送 UDP 数据包。这实际上到达了我的拦截电脑(Ubuntu 16.04),我在那里接收并回复数据包。然后,我构造一条不同的消息并将其发送到紫色 PC。
问题是,网络都在同一个子网上,并且内核不知道要发送我的传出数据包的NIC,因为我已经拥有我要转发到的IP。
我尝试创建单独的命名空间来拥有 NICS ,并编写了几个单独的进程来通过命名空间之间的 Dbus 进行通信,然后才意识到它们无法通信。如果需要,我可以购买更多硬件,但我正在寻找有关如何实现此结果的建议。
答案1
是的,使用网络命名空间来隔离两个“相同”的网络是可行的。
例如,右侧有一个网络命名空间,所有三个接口都位于该命名空间中,此外,该命名空间中还有一个网桥和一个用于流量拦截和转发的分接头。将分接头和三个 NIC 添加到网桥,并仅将 192.168.0.10 分配给分接头。因此,没有为 NIC 分配 IP;只到水龙头。网桥将负责将所有流量引导至右侧的 192.168.0.10 并通过相应的 NIC 将所有流量引导至 192.168.0.{20,21,22}。
编写拦截程序来读/写tap(级别2),并通过stdin/stdout(无缓冲)转发数据包。还编写一个类似的简单传输程序,将 stdin/stdout 数据包传输到一个 Tap(另一个 Tap),将其放入左侧全局命名空间中。程序必须转发所有数据包,并对其中一些数据包应用拦截。
左侧命名空间(全局命名空间)按照相应的方式排列,有网卡的桥和tap,然后将所有IP地址192.168.0.{20,21,22}添加到tap中。
接下来,使用包dpipe
中的程序vde2
(或编写您自己的程序)启动两个 Tap 连接器,以便它们的 stdin/stdout 相互连接。执行dpipe
此操作的命令将类似于以下内容:
# dpipe program1 tap1 = ip netns exec RHS program2 tap2
效果是program1的stdout转到program2的stdin,而program2的stdin转到program1的stdin。 (为了便于说明,我在理论上包含了程序的 Tap 名称参数)
总而言之,这将是一种在两个命名空间之间拦截和传输数据包的方法,而无需干扰 IP 转换。
请注意,如果每侧都有一个 NIC,并且右侧有一个交换机,则该设置同样可以正常工作。因此,不需要两个三块 NIC,但您只需两个即可:一个在左边,一个在右边,当然还有一个用于右侧网络的交换机,该网络有 4 个物理主机。
答案2
我无法评论,所以添加另一个答案。我是根据自己的经验来写的:对于网络命名空间来说,这绝对可行,但没有通用的解决方案。因此它会更加贴近需求和实际的网络拓扑。在大多数情况下,还需要编写一些脚本来自动执行此类网络初始化和配置。
但话又说回来,这绝对是可行的