我有几台亚马逊 Alexa 设备(一台 Echo、两台 Dots)和一台 Belkin Wemo 智能开关。Alexa 应用程序允许您扫描智能家居设备,它会自动添加找到的任何设备。这通常由应用程序、亚马逊和设备网络云之间的通信来处理,但显然 Wemo 特别使用 SSDP 设备发现。Alexa 几乎每次都能找到 Wemo。
我实际上希望它失败,同时允许从 IFTTT 远程控制 Wemo。是的,我知道这是一个奇怪的用例 :) 我最初的尝试是设置一个辅助网络并将 Wemo 粘在上面。但出于某种原因,Wemo 和路由器在该网络上的连接时间不会超过一分钟。所以我放弃了,并尝试通过防火墙规则来做到这一点 - 这远远超出了我的舒适区。我也不熟悉 SSDP/UPNP,但很快就明白了。我在路由器上使用 DD WRT。我为每个 Alexa 设备、我的手机和 Wemo 分配了一个静态 IP 地址。
鉴于我不知道 Alexa 发现机制的细节,我认为我需要放弃从 Echo 接收 M-SEARCH 消息和从 Wemo 发送 NOTIFY 公告。我希望设备发现功能在我的网络上正常运行;我使用 iTunes 遥控器和 Plex,可能会添加更多类似设备。我也不确定哪个 Alexa/手机设备会启动发现功能,所以我很乐意阻止所有这些设备。
因此,我需要一些路由器规则,这些规则可以中断两个设备之间的 SSDP 通信,而不会禁用整个协议或任一设备的正常 HTTP 通信(我假设 IFTTT 正在使用)。
我尝试过,其中 A 是 Wemo 的 IP 本地 IP 地址,B 是其他四个设备的 IP 地址之一:
iptables -I FORWARD -s A -d B -j logdrop
iptables -I FORWARD -s B -d A -j logdrop
响应应该是单播的,所以我以为这会丢弃对 M-SEARCH 的响应。也许我使用了错误的表格?
iptables -I INPUT -s A -d B -j logdrop
iptables -I INPUT -s B -d A -j logdrop
repeat for OUTPUT, PREROUTING, POSTROUTING
不行。尝试添加 UDP(并单独添加 TCP,或者两者都不添加,只是为了好用 - 同时保留上表的变化):
iptables -I FORWARD -p udp -s A -d B logdrop
iptables -I FORWARD -p udp -s B -d A logdrop
所以这仍然不起作用。也许我可以尝试使用多播功能?
iptables -I FORWARD -p udp -s A -d 239.255.255.250 -j logdrop
iptables -I FORWARD -p udp -s 239.255.255.250 -d A -j logdrop
iptables -I FORWARD -p udp -s B -d 239.255.255.250 -j logdrop
iptables -I FORWARD -p udp -s 239.255.255.250 -d B -j logdrop
also the INPUT/OUTPUT/PRE/POSTROUTING tables
没有。
所以我尝试了很多组合(不是我展示的每种排列组合,但有很多),并且通常无法阻止它们互相找到。哎呀,我甚至尝试在路由器上完全禁用 UPNP。即使这样似乎也不起作用。我不知道这些该死的设备是如何通信的!我会嗅探数据包,但这是 wifi,而我在 Windows 上,所以显然这很难。我曾使用更通用的规则,例如,但iptables -I FORWARD -d A -j logdrop
它们太过激烈,当然破坏了 IFTTT 的连接能力,而且即使在那时我也很难弄清楚哪些规则在发挥魔力。
因此,经过两个晚上的独自尝试后,是时候寻求帮助了。设置防火墙规则的正确方法是什么?或者我对 SSDP 或路由规则(或理论上的 Alexa)有什么根本误解?
答案1
第一个问题是这些数据包没有路由首先。
iptables -I FORWARD
处理在 IP 层转发的数据包 - 即当设备充当两个 IP 网络之间的路由器时。但是,相同的子网甚至无法到达路由器——它们由 Wi-Fi AP 和以太网交换机本身在链路层转发。
那么你可能能够使用以下方式过滤到达软件的数据包ebtables
——例如,通常在 Wi-Fi AP 和内置以太网交换机之间传输的数据包会通过 Linux 的“桥接”接口,事实上有很多网站都在谈论这个(例如)。
例如,这阻止全部通过ath*
(Atheros 无线)接口退出的多播数据包:
ebtables -A FORWARD -o ath+ -d Multicast -j DROP
不幸的是,您通常无法对硬件转发的数据包执行相同的操作 - 甚至 ebtables 也看不到这些数据包。
现在,如果涉及的所有数据包都是常规单播,我建议设置第二个子网并让路由器在两个网络之间路由内容。但是,当涉及多播时,这可能会很麻烦——大多数多播“转发”或“代理”功能似乎都是单向的;全面的多播路由超出了 DD-WRT 的能力;最重要的是,许多发现数据包的 TTL 甚至为 1,因此无论如何路由器都不会将它们传递到第一个网络之外。
(顺便说一句,iTunes 通常不使用 SSDP – 它使用 DNS-SD 而不是 mDNS。)
答案2
我的 Echo 点也遇到了类似的问题。当它们进行发现时,我的 Sony SA-NS400 扬声器会断开与网络的连接,并且通常不会恢复。它们都在同一个 wifi 接口上。这可以在 Wireshark 和 Intel Device Sniffer 中看到。亚马逊的支持很有帮助,但没有任何进展。我相信这是 urn:Belkin:device:** 数据包造成的(我自己还没有重新创建它来确认)。我的解决方案是为每个点(XXXX 是点的 IP)设置此规则:
ebtables -A FORWARD --protocol IPv4 --ip-source X.X.X.X --ip-destination 239.255.255.250 -j DROP
这只会阻止来自点的发现,并允许其他设备进行发现。当我真正需要从点进行发现时,我会运行一个脚本来更改 ebtables,然后在完成后将其改回。我还没有找到解决这个问题的方法,也没有找到允许多播到达其他接口的方法,这样就可以在不更改 ebtables 的情况下获取对我的 hue-emulator 的更改。