![有没有办法在不同的网卡上监听 2 个具有相同 IP(192.168.1.1)的主机,Ubuntu Linux](https://linux22.com/image/1599265/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E5%9C%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E7%BD%91%E5%8D%A1%E4%B8%8A%E7%9B%91%E5%90%AC%202%20%E4%B8%AA%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%20IP%EF%BC%88192.168.1.1%EF%BC%89%E7%9A%84%E4%B8%BB%E6%9C%BA%EF%BC%8CUbuntu%20Linux.png)
问题是我们有一台计算机(Ubuntu 18.04)必须与 192.168.1.0 LAN 上的服务器进行通信,并且不同的NIC 将不得不收到来自 IP 设置为 192.168.1.1 的设备通过 10G 以太网发送 UDP 数据包。LAN 的网关也是 192.168.1.1。我们不控制 LAN,所有者也不会更改它。我们想更改设备的 IP 地址,但到目前为止,制造商还没有提供帮助。
(编辑)另一个困难是,计算机和发送 UDP 的设备都位于一个标准机箱内,这个机箱已经满了。我们不允许使用其他机箱。我们不允许在机箱外添加设备。
我们不相信事情会这么简单,我们确实考虑过路由表仅用于发送而不用于接收的可能性。由于我们从未从 Ubuntu 盒子向设备发送信息,我们决定尝试删除路由。断开我们的测试 LAN。然后观察传入的 UDP 数据包。成功了。删除路由。数据包停止。添加路由,数据包开始。不幸的是,当我们连接到 LAN 时,系统无法工作。
研究——使用命名空间是我找到的第一篇文章。我继续搜索。虽然大多数文章都不太合适,但有几篇让我回到了相同的命名空间文章。问题是,侦听和处理 UDP 数据包的同一程序/进程需要将结果发送到 192.168.1.0 LAN 上的服务器。我认为我们不能在同一进程中同时使用 2 个名称空间。
然后我们还考虑尝试使用“wireshark”方法处理传入的 UPD。即使删除了路由,我们也确实看到了数据包。但是,由于用户空间过滤速度太慢,这种方法失败了。
有没有基于我们只想在 10G 接口上接收 UPD(从不发送)的解决方案?或者有没有办法让一个程序同时访问两个网络命名空间?还有其他方法吗?
(制造商仍有可能联系我们,告诉我们如何更改“UPD 设备”的 IP,这样一来,这一切都将变得毫无意义。)
答案1
这是在黑暗中拍摄的……如果你剥去部分以太网线并剪断发送数据的 tx 线,会怎么样?也许这可以解决只听的要求,哈哈。
答案2
我知道这是一个老问题。我只是偶然发现了它。
Appleoddity(在评论中)说得对,你需要一个可以进行 NAT 的路由器来访问普通 LAN,并需要桥接来访问特殊设备。但是,这不一定是物理路由器。你可以在 Linux 机器内将路由器作为虚拟机运行。(主机甚至不需要在 10 Gb/s 接口上有一个 IP 地址,因此不会发生任何冲突。)不过,性能可能是一个问题。
如果您无论如何都选择 VM 路线,那么另一个概念上更简单的解决方案就会出现:
只需将 Linux 应用程序放入具有 2 个虚拟网络接口的 VM 中。1 个直接桥接在 10 Gb/s 适配器上(同样,主机不需要此 NIC 上的 IP 地址),另一个使用 NAT 到 LAN 接口。
出于性能原因,我建议对 10 Gb/s 使用桥接。
这一切都假设 Linux 机器足够强大来处理这个问题。
答案3
感谢大家的帮助。对我来说,好消息是硬件制造商通过更新固件并允许我们更改 IP 解决了这个问题。