2

У меня есть несколько устройств Amazon Alexa (эхо, две точки) и интеллектуальный переключатель Belkin Wemo. Приложение Alexa позволяет сканировать устройства для «умного дома» и автоматически добавлять все найденное. Обычно это осуществляется путем связи между приложением, Amazon и сетевым облаком устройства, но, очевидно, Wemo, в частности, использует обнаружение устройств SSDP. Алекса находит Wemo почти каждый раз.

Я на самом деле хочу, чтобы он потерпел неудачу, при этом разрешая удаленное управление Wemo из IFTTT. Да, я знаю, что это странный вариант использования :) Моя первая попытка состояла в том, чтобы настроить вторичную сеть и прикрепить к ней Wemo. Но по какой-то причине Wemo и маршрутизатор не будут оставаться на связи в этой сети более минуты. Поэтому я отказался от этого и попытался сделать это с помощью правил брандмауэра, которые находятся далеко за пределами моей зоны комфорта. Я также незнаком с SSDP/UPNP, но быстро понимаю эту идею. Я использую DD WRT на роутере. Я назначил каждому устройству Alexa, моему телефону и Wemo статический IP-адрес.

Учитывая, что я не знаю деталей механизма обнаружения Alexa, я предполагаю, что мне нужно отказаться от получения сообщений M-SEARCH от Echo и отправки уведомлений NOTIFY с Wemo. Я бы хотел, чтобы функция обнаружения устройств работала в моей сети; Я использую пульты iTunes и Plex и могу добавить больше похожих устройств. Я также не уверен, какое устройство Alexa/ телефон будет инициировать обнаружение, поэтому я счастлив блокировать их все.

Итак, мне нужны некоторые правила маршрутизатора, которые сбрасывают связь SSDP между двумя устройствами, не отключая весь протокол или обычную связь HTTP (которую, как я полагаю, использует IFTTT) с любым устройством.

Что я пробовал, где A - это локальный IP-адрес Wemo, а 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 на маршрутизаторе. Даже это не похоже на работу. Я не знаю, как эти проклятые устройства общаются! Я бы понюхал пакет, но это Wi-Fi, и я на Windows, так что, видимо, это сложно. Мне повезло с более общими правилами, например, iptables -I FORWARD -d A -j logdrop но они слишком радикальны и, конечно, сломали способность IFTTT подключаться, и мне было трудно понять, какие правила делают магию затем.

Итак, после двух ночных попыток, пришло время обратиться за помощью. Как правильно настроить правила брандмауэра? Или что я в корне неправильно понимаю о SSDP или правилах маршрутизации (или теоретически Alexa)?

2 ответа2

2

Первая проблема заключается в том, что эти пакеты не маршрутизируются в первую очередь.

iptables -I FORWARD работает с пакетами, пересылаемыми на IP-уровне, т.е. когда устройство действует как маршрутизатор между двумя IP-сетями. Однако пакеты в одной подсети даже не достигают маршрутизатора - они пересылаются на канальном уровне самими точками доступа Wi-Fi и коммутаторами Ethernet.

Таким образом, вы можете фильтровать пакеты, которые достигают программного обеспечения, с помощью ebtables - например, обычно пакеты, пересекающиеся между точкой доступа Wi-Fi и встроенным коммутатором Ethernet, проходят через интерфейс «моста» Linux, и на самом деле о них говорят различные веб-сайты. это (например).

Например, это блокирует все многоадресные пакеты, выходящие через интерфейсы ath* (Atheros wireless):

ebtables -A FORWARD -o ath+ -d Multicast -j DROP

К сожалению, вы обычно не можете сделать то же самое для пакетов, пересылаемых на аппаратном уровне - даже ebtables не видит их.

Теперь, если бы все задействованные пакеты были обычными одноадресными, я бы предложил создать вторую подсеть и позволить маршрутизатору маршрутизировать вещи между двумя сетями. Однако это может быть проблематично, когда задействована многоадресная передача - большинство многоадресных функций "пересылки" или "проксирования" кажутся однонаправленными; полноценная многоадресная маршрутизация выходит за рамки возможностей DD-WRT; кроме того, многие пакеты обнаружения даже имеют TTL, равный 1, поэтому ни один маршрутизатор не пропустит их за пределы первой сети.

(Как примечание, iTunes обычно не использует SSDP - он использует DNS-SD поверх mDNS.)

1

У меня была похожая проблема с моими точками Echo. Когда они обнаруживают, мои динамики Sony SA-NS400 отключаются от сети и обычно не возвращаются. Все они на одном интерфейсе Wi-Fi. Это можно увидеть в Wireshark и Intel Device Sniffer. Поддержка Amazon была полезна, но никуда не делась. Я полагаю, что это именно пакет 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .