我们的机器人设备数量不断增长,因此我们需要改进网络配置。机器人设备这一事实对于问题本身来说并不重要,但在我看来,它有助于理解我们的需求。
因此,我们有几个机器人,每个机器人都可以通过 wifi 连接到公共网络,并且还运行自己的内部网络。我们现在开始需要的是从外部(通过 wifi 链接)访问机器人内部网络中的计算机。该方案显示了我们设置的当前状态。所有 PC 都运行 Ubuntu 或 Raspbian。
机器人上运行的主要程序是活性氧。这是一个发布-订阅消息传递系统。每个机器人在主 PC 上运行一个“服务器”/代理。所有发布者从其运行的系统获取一个随机的空闲端口(无法配置),并以“topic_name:hostname:port”的形式将其传递给代理。然后,订阅者联系代理,获取感兴趣主题的发布者的地址,然后与发布者建立直接 P2P 连接(再次使用他们从代理获得的“hostname:port”信息)。
我们希望在机器人上保留统一的设置(即网络设置等)。我们经常需要将传感器或计算机从一个机器人换到另一个机器人,而每次更改都必须更改大量配置,这是不可接受的。此外,大多数使用机器人的同事都不是网络专家,因此需要尽可能保持简单(接近默认值)。
网络的基本要求是机器人可以完全独立地运行(即没有提供 DHCP 服务器的 wifi 链接)。这就是我们在内部网络中使用静态 IP 的原因。但是,一旦 wifi 链接可用,我们希望能够通过 ROS 订阅者的 wifi 链接访问 x-robot、x-robot-nuc 和 x-robot-jetson。我们还希望允许内部网络通过 wifi 链接访问互联网。
我们的尝试:
- 在 x-robot 上:
iptables -t nat -A POSTROUTING -m iprange --src-range 192.168.1.98-192.168.1.98 ! --dst-range 192.168.2.0-192.168.2.255 -o eth_bullet -j MASQUERADE
- 这允许 x-robot-jetson 访问互联网,但不允许访问其他任何内容 - 在 x-robot 上:
iptables -t nat -A POSTROUTING -o eth_bullet -j MASQUERADE
- 这允许 x-robot-jetson 访问互联网和网络中的其他计算机,但随后来自 y-robot 的传感器 192.168.1.72 的数据包也开始“泄漏”到 x-robot,并且路由变得疯狂 - 在 x-robot 上:桥接 eth_laser 和 eth_bullet 以桥接 br0。在其他计算机(x-robot-jetson 等)上,设置一个使用 DHCP 客户端和静态地址 192.168.1.* 的连接,用于内部网络。这最接近我想要的,但同样,x-robot 上 192.168.1.72 的数据包开始“泄漏”到 y-robot,路由也变得疯狂……这里的想法是,应该留在机器人内部的通信将使用 1.* 网络,而与“外部”的通信将使用通过桥接的 DHCP 到达那里的 2.* 网络。
- x-robot 上的 NAT 不是一个选项,因为用户需要从外部到 的有效连接
x-robot-jetson:any_port
。
因此,假设桥接 eth_bullet 和 eth_laser 的第 3 个选项并不是一个完全坏主意,我该如何设置它,以便 DHCP 和 192.168.2.* 网络通过桥接器流动,但 192.168.1.*(可能还有其他子网)保持彼此隔离?我尝试过 arptables、ebtables、iptables 等,但我从未找到可以防止 ARP 请求泄露给其他机器人的解决方案。然后路由变得疯狂,糟糕的事情开始发生......