我正在尝试使用 SSDP 在我的本地网络上发现 Onvif 摄像机。我的代码可以在我的工作站上运行,它也可以在使用主机网络的容器中运行。我不想使用主机网络(我需要与主机上的其他容器连接,这很好用)。我的选择也很有限,因为这是一个运行 BalenaOS 的小型设备,所以不是所有可以用 docker 完成的事情都是可能的。例如,我认为不可能使用管道系统。
这是我到目前为止所知道的:
- 使用wireshark我可以看到多播数据包没有离开我的主机
- 我已经增加了数据包的 TTL(我确定这是必要的,但它没有产生明显的差异)
似乎应该可以iptables
在主机上使用将数据包从桥接网络转发到,eth0
但实际上,我对多播/广播的理解不够好,无法知道这是否足够。
我看到有专门的工具来管理类似pimd
的mrouted
案例。作者(?)在他的网站上有很多信息(例如https://troglobit.com/2016/03/07/testing-multicast-with-docker/)但我不完全理解如何翻译变成我可以尝试的东西。无论如何,正在讨论的情况与我的情况并不完全相同(他们希望在 docker 中接收多播消息而不是将它们发送出去)。
有一些 stackoverflow 问题看起来很相似,但实际上并非如此:
- Docker 接收多播流量:这实际上是相反的情况,用户需要在他们的容器中接收多播消息,在我的情况下,回复是单播的,更容易路由(但无论如何我都没有走得足够远来回复完全发送)
- 从 docker 容器发送 udp 广播:没有明确的解决方案,评论建议使用主机网络
理想情况下,我希望找到一种方法来使用 iptables 进行我需要的路由,但我不确定这是否可能。
更新:我不想发布答案,因为我永远无法让它按照我想要的方式工作。我最终在主机网络上的一个新容器中放置了一个小过程 - 足以进行发现。这能够进行发现并将结果发送回我最初想要进行发现的容器。这不是让我满意的妥协,但我无法找到另一种解决方法。我仍然认为这可能是可能的,所以我不回答这个问题,以防有一天有人偶然发现它有一个解决方案。