Linux 防火墙后的 Alljoyn 服务 (iptables)

Alljoyn Service behind a Linux firewall (iptables)

我想在嵌入式 linux 设备上使用 Alljoyn 框架。由于安全原因,有必要为该设备配置防火墙。这是通过 iptables 完成的。

到目前为止我做了什么: 我尝试 运行 该设备上没有防火墙的 AboutService 示例,然后检查了 TCPDump。作为客户,我使用 AllJoyn (Windows 10) 的 IoT Explorer,但 AboutClient 应该也能正常工作。用wireshark查TCPDump,通告的端口很清楚,我得打开端口 9955 (alljoyn-mcm) 9956 (alljoyn) and 5353 (MDNS?!?) 用于 UDP。我用以下规则解决了这个问题:

$ iptables -A OUTPUT -p udp --sport 9955 -j ACCEPT
$ iptables -A OUTPUT -p udp --sport 9956 -j ACCEPT
$ iptables -A OUTPUT -p udp --dport 5353 -j ACCEPT
$ iptables -A INPUT  -p udp --sport 9955 -j ACCEPT

根据这些规则,在 IoT Explorer 中成功发现了设备。

但是当访问设备时(例如获取完整的关于数据)TCP 通信开始。而且这不是在某个端口上。端口似乎是随机的。 NMap 显示例如以下端口,当(重新)启动 AboutService 时。

如何确定端口?我如何强制 Alljoyn 框架将 TCP 通信固定到某个端口或至少较小的端口范围,例如41000-41100?或者是否有任何其他方法来配置防火墙以便不阻止 Alljoyn 通信?

通常是 AllJoyn 框架,使用 UDP 进行发现,使用 TCP 进行直接通信

Wellkown(已注册)端口是;

  • 端口号 9956:IANA 为 AllJoyn 分配的 UDP 多播端口
  • 端口号 5353:IANA 为 mDNS 分配的 UDP 多播端口

当设备相互发现时,TCP 通信将在一个随机的临时端口上开始。此实现是目标依赖代码,您可以查看目标的源代码。

我用另一种方式解决了:

在启动我的 Alljoyn 服务之前,我从 Alljoyn 核心库启动了 alljoyn-daemon 二进制文件。这通过可定义的端口路由流量,默认情况下通过端口 9955 (alljoyn-mcm).

通过此设置,我可以配置以下防火墙规则并且一切正常:

$ iptables -A INPUT  -p udp -m multiport --dports 9955,9956,5353 -j ACCEPT
$ iptables -A INPUT  -p udp -m multiport --sports 9955,9956,5353 -j ACCEPT
$ iptables -A INPUT  -p tcp -m multiport --dports 9955,9956,5353 -j ACCEPT
$ iptables -A INPUT  -p tcp -m multiport --sports 9955,9956,5353 -j ACCEPT
$ iptables -A OUTPUT -p udp -m multiport --dports 9955,9956,5353 -j ACCEPT
$ iptables -A OUTPUT -p udp -m multiport --sports 9955,9956,5353 -j ACCEPT
$ iptables -A OUTPUT -p tcp -m multiport --dports 9955,9956,5353 -j ACCEPT
$ iptables -A OUTPUT -p tcp -m multiport --sports 9955,9956,5353 -j ACCEPT

提示:我想这些开放端口太多了,但这对我来说已经足够了。随着更多的调查,这个名单肯定可以减少。