我是一名软件工程师,只具备非常基本的网络技能,因此,如果我在这里的解释有些不准确,我提前道歉。
我有一台实体设备(具体来说,是一台较旧的这个网络电视调谐器) 那需要客户端与它位于同一子网。它的客户端软件会进行广播以发现任何调谐器,并且直到发现过程成功后才能继续进行。您不能只给它一个 IP 地址就完事了。
我已经设置了一个基于 Docker 的堆栈(使用 Docker Compose),该堆栈通过使用ipvlan
网络成功与此设备集成,以便每个容器在我的子网上分配自己的 IP 地址。但是,Docker 对网络的支持ipvlan
相当糟糕,因此我无法让堆栈在我的“生产”Synology NAS 上运行,即使它在我的开发 Linux Mint 机器上运行良好(似乎ipvlan
那里根本不支持网络)。
因此,我正在探索其他选择。我想知道的一件事是,我是否可以欺骗网络调谐器,让其认为客户端在其子网上,即使它不在。这就是我在网络知识方面迅速遇到瓶颈的地方。
我知道有一种工具叫socat
这也许能有所帮助,我甚至设法通过在这样的容器中运行来使最初的发现发挥作用socat
(网络调谐器位于192.168.10.45
):
socat -d -d -v udp4-recvfrom:65001,broadcast,fork udp4-sendto:192.168.10.45:65001
但显然这还不够,因为仅有的发现成功了 - 除此之外的一切都失败了,所以我的猜测是,一旦发现,通信就会切换到其他协议/端口,而我也需要socat
“中继”它。
基本上,我现在不确定我希望实现的目标是否可行。我设想我的 Docker 设置将包括一个容器,该容器仅以socat
在该堆栈中的其他容器和网络调谐器之间“中继”的方式运行,从而欺骗调谐器认为它正在与与我的物理网络位于同一子网上的机器进行通信,即使这些容器位于bridge
Docker 网络上。大致如下:
我还可以socat
在后端容器内作为守护进程运行,这可能会简化事情。
有人能告诉我我是不是选错了方向吗?有没有什么建议可以指导我如何实现这一目标?