Телевизор я включал один раз, утром, минут на десять. Потом выключил пультом и больше не трогал. За следующие сутки он обратился к 172 разным доменам — среди них компания, которая занимается распознаванием картинки на экране.

Нашёл я это не специально. Просто включил на домашнем роутере файловый журнал DNS-запросов и оставил на выходные. За 39 часов набралось 106 875 запросов от восьми устройств. Ниже — как это поднять у себя за вечер, полные команды, и что показали цифры по каждому прибору в квартире.

Зачем это вообще нужно

Любое устройство, прежде чем куда-то подключиться, спрашивает у DNS-сервера адрес по имени. Если DNS-сервер свой, в журнале видно каждое такое имя: кто спросил, когда и как часто. Содержимое трафика при этом остаётся зашифрованным — мы видим адресатов, но не переписку.

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

У меня уже стоял AdGuard Home на роутере с OpenWrt — как DNS-сервер для всей локальной сети с блокировкой рекламы по фильтрам. Оставалось включить журнал. Оказалось, что это не одна галка, а несколько неочевидных шагов.

Почему на роутере, и в чём сложность

Отдельной машины под домашние сервисы у меня нет, а роутер работает круглосуточно. Логичное место.

Проблема в объёме. Вот что показывает свободное место:

root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 5.3M      5.3M         0 100% /rom
tmpfs                   242.5M    231.8M     10.7M  96% /tmp
/dev/ubi0_2              44.0M     28.8M     12.9M  69% /overlay
overlayfs:/overlay       44.0M     28.8M     12.9M  69% /

Раздел /overlay — это всё пользовательское пространство роутера: 44 МБ, из них свободно 12.9. Журнал DNS на живой домашней сети растёт примерно на 5 МБ в сутки. Через двое суток он забьёт раздел и положит систему.

Раздел /tmp живёт в оперативной памяти и стирается при перезагрузке. Как раз в нём AdGuard Home по умолчанию и работает — то есть вся статистика существует до первого ребута.

Свободного места под журнал не годится
Свободного места под журнал не годится

Решение — USB-флешка. Дальше по шагам, всё воспроизводится на любом OpenWrt с USB-портом.

Шаг 1. Драйверы

В базовой прошивке поддержки USB-накопителей обычно нет. В OpenWrt 25.x пакетный менеджер сменился с opkg на apk:

apk update
apk add kmod-usb-storage block-mount

Если установка обрывается с сообщением Terminated — виноват сторож памяти. У меня стоит earlyoom, и в его списке приоритетного отстрела оказались как раз apk, opkg, sed и awk. Он честно убивал установщик, чтобы спасти память.

Лечится так: посмотреть конфиг, убрать административные утилиты из списка на отстрел, оставив там только фоновые скрипты, которые не жалко перезапустить.

uci show earlyoom
uci set earlyoom.main.prefer_regex='^(имя-фонового-скрипта|ещё-один)$'
uci commit earlyoom && service earlyoom restart

Заодно стоит проверить, есть ли на роутере раздел подкачки. Если нет — сделаем чуть позже, он снимает эту проблему целиком.

После установки драйверов флешку надо переткнуть и убедиться, что ядро её увидело:

ls /dev/sd*

Шаг 2. Разметка

Я взял старую загрузочную флешку с двумя разделами NTFS. NTFS под OpenWrt работает медленно и требует отдельного драйвера, для журнала он не годится. Правильный вариант — один раздел ext4 на весь объём.

apk add parted e2fsprogs kmod-fs-ext4
parted -s /dev/sda mklabel gpt
parted -s /dev/sda mkpart primary ext4 1MiB 100%
mkfs.ext4 -F -L AGHDATA -E lazy_itable_init=1,lazy_journal_init=1 /dev/sda1

Про флаги в последней строке. lazy_itable_init и lazy_journal_init откладывают запись части метаданных: они допишутся в фоне при первом использовании. Форматирование проходит за пару секунд вместо минуты. На роутере со сторожем памяти это принципиально — в моей первой попытке mkfs работал долго и был убит ровно на записи суперблоков, оставив мне полубитую файловую систему.

Проверяем результат:

apk add lsblk
lsblk -f
Один раздел ext4 на 29 ГБ вместо двух NTFS
Один раздел ext4 на 29 ГБ вместо двух NTFS

Шаг 3. Монтирование, которое переживёт перезагрузку

mkdir -p /mnt/aghdata
mount /dev/sda1 /mnt/aghdata
block detect > /etc/config/fstab

Команда block detect сама просканирует накопители и сгенерирует конфиг с идентификаторами разделов. Дальше его надо поправить — открыть /etc/config/fstab, найти секцию с нашим разделом и убедиться, что там стоит:

config 'mount'
        option  target  '/mnt/aghdata'
        option  uuid    'c1b17845-33a9-4343-a2a3-b64603c4a2f0'
        option  enabled '1'

Ключевое — enabled '1'. По умолчанию генератор ставит ноль, и после перезагрузки флешка не смонтируется.

Подробное описание работы с накопителями есть в документации OpenWrt.

Шаг 4. Заодно раздел подкачки

Раз флешка уже есть, стоит сразу сделать подкачку — она снимает проблему с убитыми установщиками навсегда. Размер берём примерно равным оперативной памяти:

dd if=/dev/zero of=/mnt/aghdata/swapfile bs=1M count=512
chmod 600 /mnt/aghdata/swapfile
mkswap /mnt/aghdata/swapfile
swapon /mnt/aghdata/swapfile

Обратите внимание: в BusyBox у dd нет флага status=progress, команда с ним просто не выполнится. Процесс идёт молча секунд пятнадцать.

Автоподключение дописываем в тот же /etc/config/fstab:

config 'swap'
        option  device  '/mnt/aghdata/swapfile'
        option  enabled '1'

Проверка:

root@OpenWrt:~# free -h
              total        used        free      shared  buff/cache   available
Mem:         496724      165768       23696      237372      307260       42588
Swap:        524284           0      524284

Шаг 5. Самое интересное — куда положить данные

Здесь была основная возня, поэтому подробно.

Пакет AdGuard Home в моей сборке устроен так: init-скрипт при старте распаковывает бинарь в /tmp/adguardhome-bin и работает с рабочей директорией /tmp/adguardhome. То есть целиком в оперативной памяти. Для роутера с крошечным флеш-разделом решение разумное, но означает, что данные не переживают перезагрузку.

Переписывать init-скрипт целиком не хотелось. Вместо этого — bind mount: директория с флешки подставляется вместо data/ внутри рабочей папки. Сервис продолжает работать со своими привычными путями, а физически всё пишется на флешку.

Сначала копируем то, что уже накопилось:

mkdir -p /mnt/aghdata/adguardhome
cp -a /tmp/adguardhome/data /mnt/aghdata/adguardhome/

Флаг -a сохраняет права и владельцев, без него сервис не сможет писать.

Дальше нужно, чтобы монтирование поднималось само при каждом старте. Добавляем блок в /etc/init.d/adguardhome прямо перед строкой procd_open_instance:

AGH_DATA_SRC="/mnt/aghdata/adguardhome/data"
AGH_DATA_DST="$AGH_DIR/data"
if grep -q " /mnt/aghdata " /proc/mounts; then
    mkdir -p "$AGH_DATA_SRC" "$AGH_DATA_DST"
    if ! grep -q " $AGH_DATA_DST " /proc/mounts; then
        mount --bind "$AGH_DATA_SRC" "$AGH_DATA_DST" \
            && logger -t adguardhome "data bind-mounted to USB" \
            || logger -t adguardhome "data bind FAILED"
    fi
else
    logger -t adguardhome "WARNING /mnt/aghdata not mounted, data goes to RAM"
fi

После этого один и тот же раздел оказывается смонтирован сразу в двух местах — так сервис не замечает подмены:

root@OpenWrt:~# df -h | grep sda1
/dev/sda1                28.3G    554.2M     26.3G   2% /mnt/aghdata
/dev/sda1                28.3G    554.2M     26.3G   2% /tmp/adguardhome/data

Грабля первая: проверки, которых нет

Первую версию этого блока я написал с mountpoint -q — стандартной утилитой для проверки, смонтировано ли что-то. В BusyBox моей сборки её нет. Обе проверки молча провалились, но bind при этом остался с предыдущего ручного запуска, и всё выглядело работающим.

Обнаружилось только когда я специально снял монтирование и перезапустил сервис — вот тогда оно не поднялось.

Отсюда две вещи. Первая: проверять надо через /proc/mounts и grep, это работает везде без дополнительных пакетов. Вторая: любую такую автоматику надо проверять с чистого листа, а не по факту «вроде работает».

Проверка, что хук отработал сам:

service adguardhome stop
umount /tmp/adguardhome/data
service adguardhome start
logread | grep bind-mounted

В логе должно появиться data bind-mounted to USB.

Шаг 6. Две настройки, без которых журнала не существует

Грабля вторая: два разных параметра

В конфиге AdGuardHome.yaml за журнал отвечают два независимых параметра:

querylog:
  enabled: true
  file_enabled: true
  interval: 168h
  size_memory: 100

enabled включает журнал вообще. file_enabled — запись в файл. У меня второй был выключен по умолчанию, и это давало очень обманчивую картину: веб-интерфейс исправно показывал поток запросов в реальном времени, всё выглядело работающим, а файла querylog.json на диске не существовало вовсе. Журнал жил в оперативной памяти кольцевым буфером и стирался.

Обратите внимание: в веб-интерфейсе параметра file_enabled нет вообще. Он правится только в конфиге.

interval: 168h — это срок хранения, семь суток. size_memory — размер буфера перед сбросом на диск.

Про буфер отдельно. По умолчанию там 1000 записей, и на спокойной сети файл может не появляться часами: я нагенерировал две сотни запросов вручную, подождал полчаса и не увидел ничего. Поставил 10 — файл появился мгновенно, но запись пошла практически непрерывно, что для флешки плохо. Остановился на 100: сброс примерно раз в минуту, износ приемлемый.

Полный список параметров есть в вики AdGuard Home.

Анонимизация

Вторая обязательная настройка — в веб-интерфейсе, раздел «Настройки → Общие настройки». Пункт «Анонимизировать IP-адрес клиента» должен быть выключен. Иначе все устройства сольются в обезличенный поток, и весь разбор потеряет смысл.

Три галки, без которых дальше можно не продолжать
Три галки, без которых дальше можно не продолжать

Шаг 7. Перехват запросов в обход

Часть устройств игнорирует DNS-сервер, выданный по DHCP, и ходит напрямую на публичные резолверы с зашитыми в прошивку адресами. Такие запросы пройдут мимо журнала.

Одно правило в межсетевом экране заворачивает весь 53-й порт из локальной сети обратно на роутер:

uci add firewall redirect
uci set firewall.@redirect[-1].name='DNS-hijack'
uci set firewall.@redirect[-1].src='lan'
uci set firewall.@redirect[-1].proto='tcp udp'
uci set firewall.@redirect[-1].src_dport='53'
uci set firewall.@redirect[-1].dest_port='53'
uci set firewall.@redirect[-1].dest_ip='192.168.1.1'
uci set firewall.@redirect[-1].target='DNAT'
uci commit firewall && service firewall restart

Запросы поверх зашифрованных протоколов так не поймать — они идут по другим портам и выглядят как обычный веб-трафик. Но простой DNS на 53-м порту после этого из сети не уходит.

Описание синтаксиса правил — в документации по межсетевому экрану OpenWrt.

Шаг 8. Подписать устройства

Последнее и самое нужное для разбора. В веб-интерфейсе, раздел «Клиенты», добавляем устройства с человекочитаемыми именами.

Здесь есть неочевидная деталь. Указывать надо и MAC-адрес, и локальный IPv6-адрес. Почти все мои устройства резолвили именно по IPv6, и по одному только MAC не опознавались — в журнале так и оставались строки вида fe80::f8a7:887b:7f08:bfdf.

Сопоставить одно с другим помогает таблица соседей:

ip -6 neigh show
cat /tmp/dhcp.leases

Первая команда покажет соответствие IPv6-адресов и MAC-адресов, вторая — какие имена устройства сообщили при получении адреса.

Ещё одна тонкость: телефон с рандомизацией MAC-адреса всплыл в журнале отдельным клиентом. Android перегенерирует адрес при переподключении к сети, и одно физическое устройство расползается на несколько «клиентов». В карточке клиента можно указать несколько идентификаторов сразу — туда и надо сложить все известные пары.

Восемь устройств. У телефона четыре идентификатора — из-за рандомизации MAC-адреса одно устройство расползлось по журналу на два клиента
Восемь устройств. У телефона четыре идентификатора — из-за рандомизации MAC-адреса одно устройство расползлось по журналу на два клиента

Что стоит в фильтрах — чтобы цифры читались правильно

Один момент, без которого дальнейшие проценты можно понять неверно.

Список блокировки у меня ровно один — базовый AdGuard DNS filter, около 158 тысяч правил. Ничего экзотического, никаких агрессивных сборок.

А вот в пользовательских правилах лежат два разрешения:

@@||analytics.google.com^$important
@@||report.appmetrica.yandex.net^$important

Оба домена фильтр по умолчанию блокирует, а я их явно разрешил — они нужны мне по работе. Практический эффект для этого разбора такой: часть аналитического трафика, которую AdGuard срезал бы, у меня проходит и попадает в журнал. Так что там, где ниже написано «заблокировано столько-то процентов», у человека без этих правил цифра будет выше. Особенно это касается умной колонки — у неё в топе как раз report.appmetrica.yandex.net.

Мне для наблюдения это скорее плюс: разрешённые запросы видно в журнале целиком, а не как оборванную попытку.

Методика: сначала вычесть себя

Прежде чем смотреть на результаты, важный шаг, без которого выводы будут неверными.

У меня на роутере работает прокси-шлюз со своим сторожем: он раз в минуту проверяет живость соединения, раз в полчаса обновляет список узлов, плюс регулярно опрашивает их доступность. Каждая проверка начинается с резолва имени.

В сумме это дало 46 754 запроса за 39 часов — 43.7% всего трафика сети, обращение к одному имени в среднем раз в 7.7 секунды.

Никакой сенсации тут нет: это особенность конкретной настройки, и лечится она кэшированием или работой по адресу вместо имени. Но для разбора это критично. Если смотреть на сводку веб-интерфейса не разбираясь, свои же служебные домены займут весь топ и перекроют всё остальное.

Поэтому первым делом стоит определить собственную инфраструктуру и вынести её за скобки. Дальше все цифры — без неё.

Общая картина

Восемь устройств: настольный компьютер, ноутбук, телефон, умная колонка, робот-пылесос, телевизор, стиральная машина.

Устройство

Запросов

Доменов

Заблокировано

Компьютер

48 520

1423

17.8%

Телефон

8 276

1009

18.2%

Колонка

1 731

36

0.9%

Ноутбук

535

141

26.2%

Телевизор

503

172

6.0%

Пылесос

476

3

0%

Стиральная машина

80

4

0%

Компьютер ожидаемо впереди, но интересна не величина, а соотношение числа запросов и числа доменов
Компьютер ожидаемо впереди, но интересна не величина, а соотношение числа запросов и числа доменов

Компьютер с ноутбуком дают основную массу — это обычный веб-сёрфинг, там ничего удивительного. Интересное начинается, если посмотреть на бытовые приборы и особенно на соотношение «сколько запросов» к «сколько разных адресатов».

Телевизор дал в полсотни раз меньше запросов, чем компьютер, но обошёл по разнообразию адресатов всё, кроме него и телефона
Телевизор дал в полсотни раз меньше запросов, чем компьютер, но обошёл по разнообразию адресатов всё, кроме него и телефона

Колонка: раз в 43 секунды, круглосуточно

Умная колонка — самый разговорчивый бытовой прибор в квартире. 1731 запрос при всего 36 доменах: она ходит по одному и тому же кругу с медианой 83 запроса в час, то есть примерно раз в 43 секунды и никогда не останавливаясь.

Домен

Запросов

quasar.yandex.ru

325

clck.yandex.net

323

report.appmetrica.yandex.net

316

quasar.yandex.net

287

cdnruflu6uy5xwhrbokm.svc.cdn.yandex.net

96

push.yandex.ru

95

uniproxy.alice.yandex.net

85

Первый и четвёртый — рабочие интерфейсы устройства. Шестой — доставка уведомлений, седьмой — голосовой канал. А вот второй и третий — счётчик переходов и мобильная аналитика, и обращений к ним ровно столько же, сколько к рабочему API.

Третья строка — тот самый домен, который у меня разрешён вручную. На скриншоте ниже он помечен как «Разрешённые — пользовательские правила фильтрации». Без моего правила эти 316 обращений были бы заблокированы, но сама колонка их всё равно бы делала — просто не получала бы ответа.

На каждое обращение по делу приходится обращение в аналитику
На каждое обращение по делу приходится обращение в аналитику

Ночью, с часу до семи, колонка сделала 545 запросов — то есть примерно столько же в час, сколько днём. Спящего режима у неё нет.

Три часа ночи, в квартире все спят
Три часа ночи, в квартире все спят

Пылесос: три домена и швейцарская точность

Робот-пылесос оказался самым дисциплинированным устройством в квартире. Три домена за 39 часов, и всё:

Домен

Запросов

Назначение

api-ru.roborock.com

318

облако производителя

mqtt-ru-b.roborock.com

156

брокер команд

rr-vacuum.ks3-rus.ksyun.com

2

хранилище файлов

Ночью — ровно 24 запроса в час, час за часом, без единого отклонения. Интервал 150 секунд. Никакой аналитики, никаких сторонних счётчиков.

При этом за двое суток пылесос ни разу не убирался. 476 запросов — цена простого присутствия устройства в сети.

Отдельно отмечу локализацию: и API, и брокер сообщений в российском сегменте, судя по именам. Хранилище — на инфраструктуре китайского облачного провайдера.

Стиральная машина: тише всех, но с нюансом

80 запросов за 39 часов, четыре домена, все — облако производителя:

common.iot.ruic.lgthinq.com     75
objectcontent.lgthinq.com        2
ruic-common.lgthinq.com          2
common.lgthinq.com               1

Интервал около 20 минут, ночью 18 запросов, за всё время наблюдения машина не стирала ни разу. По поведению — образцовый прибор: ходит только к своему производителю, ничего лишнего.

Нюанс обнаружился в другом месте. Когда я подключал машину к сети, в журнале всплыл новый клиент с рандомизированным адресом — это оказался мой же телефон с установленным приложением производителя. И вместе с доменами облака он потянул за собой:

z-m-gateway.facebook.com
www.google-analytics.com
region1.app-measurement.com

То есть сама стиральная машина ходит только к производителю. А приложение для управления ею приносит три сторонних аналитических сервиса.

Телевизор: молчит ночью, но набирает 172 домена днём

Здесь всё оказалось не так, как я ожидал, причём дважды.

Первая неожиданность — ночью телевизор ведёт себя лучше всех. Два запроса за шесть часов, и те к службе времени и системе уведомлений. Колонка за то же время сделала 545, пылесос 144, стиральная машина 18.

С часу до семи утра. Телевизор — единственный, кто действительно спит
С часу до семи утра. Телевизор — единственный, кто действительно спит

Вторая неожиданность — что происходит днём. 503 запроса при 172 уникальных доменах. Для сравнения: у пылесоса их три, у стиральной машины четыре, у колонки тридцать шесть.

Хронология простая. В восемь утра я включил телевизор минут на десять — тогда прошло 209 запросов, это старт системы, проверка обновлений, загрузка лаунчера. Потом выключил пультом и больше не подходил.

Дальше он продолжал ходить в сеть сам:

Час

Запросов

08:00 (включал)

209

09:00

164

10:00

43

11:00

20

12:00

25

14:00

19

20:00

21

02:00

2

Суточный цикл четырёх бытовых приборов. Телевизор — единственный с выраженным профилем активности
Суточный цикл четырёх бытовых приборов. Телевизор — единственный с выраженным профилем активности

Основная масса — инфраструктура операционной системы: play.googleapis.com, android.googleapis.com, connectivitycheck.gstatic.com, mtalk.google.com. Телевизор работает на Android, это ожидаемо.

Но помимо неё в списке лежит вот что:

Домен

Кому принадлежит

preferences.cid.samba.tv

Samba TV

mediaservices.cdn-apple.com

Apple

arcus-uswest.amazon.com

Amazon

*.prod.service.minerva.devices.a2z.com

Amazon

nrdp26.appboot.netflix.com

Netflix

occ.a.nflxso.net

Netflix

firebase-settings.crashlytics.com

Google

region1.app-measurement.com

Google

report.appmetrica.yandex.net

Яндекс

api.ivi.ru

ivi

Приложения Netflix, ivi и сервисы Amazon я на этом телевизоре не открывал ни разу.

Телевизор не включался со вчерашнего утра
Телевизор не включался со вчерашнего утра

Про первую строку таблицы

Samba TV — компания, которая занимается технологией автоматического распознавания контента, ACR. Работает это так: компонент, встроенный в операционную систему телевизора, периодически снимает отпечаток изображения на экране и отправляет на сервер. Сервер сопоставляет отпечаток с базой и определяет, что именно показывают.

Ключевой момент — источник не имеет значения. Эфирный канал, стриминговый сервис, игровая приставка, флешка с фильмом, презентация с ноутбука. Распознавание идёт по картинке, поэтому видит всё, что попадает на экран.

Упрощённая схема работы распознавания контента
Упрощённая схема работы распознавания контента

Дальше я полез искать, откуда этот компонент взялся на телевизоре Philips. И нашёл не в статьях, а в документе самого производителя.

Телевизоры Philips выпускает TP Vision, и в её политике конфиденциальности Samba TV названа поимённо — вместе с юридическим лицом Free Stream Media Corp. и адресом в Сан-Франциско.

Формулировка там следующая. Если пользователь включает настройку «Enable Personalized Content» в разделе Privacy Center, производитель получает данные о просмотре и передаёт их Samba TV, которая на их основе показывает рекомендации и рекламу. Причём — и это отдельно указано — не только на самом телевизоре, но и на других устройствах с тем же IP-адресом. То есть на телефоне и ноутбуке в той же квартире.

Там же рядом есть отдельная настройка «Relevant Advertising», отвечающая за рекламные идентификаторы.

У других производителей та же технология называется по-своему: у Samsung — «Информационные сервисы просмотра», у LG — Live Plus, у Sony — Samba Interactive TV.

Важная оговорка, чтобы не преувеличивать. Обращение к домену означает, что соответствующий компонент присутствует в системе и активен. Согласие на передачу данных даётся при первичной настройке телевизора — и, судя по документу, на экране это выглядит как «персонализированный контент», а не как «отправлять отпечатки изображения на сторонний сервер». Свой телевизор я настраивал давно и что именно тогда нажал, не помню. Утверждать, что распознавание работает без согласия, я не берусь — но и осознанного выбора я не делал.

Где искать у себя: Настройки → Privacy Center → «Персонализированный контент», в англоязычном интерфейсе Enable Personalized Content. Рядом должна быть «Relevant Advertising». Предупрежу честно: на своём телевизоре с Google TV я этот раздел с первого захода не нашёл — меню Philips и меню операционной системы разнесены, и часть настроек производителя лежит не там, где системные. Если через меню не находится, помогает поиск по настройкам: ключевые слова «конфиденциальность», «персонализ», privacy.

И стоит перепроверять этот пункт после крупных обновлений прошивки — настройки приватности иногда возвращаются к значениям по умолчанию.

Телефон ночью

Телефон дал 8276 запросов и 1009 доменов. С часу до семи утра — 1667 запросов, то есть по ночам он тоже не спит.

Домен

Запросов ночью

a.wb.ru

114

federatedcompute-pa.googleapis.com

88

www.google.com

58

proxy.telemetry.us-ashburn-1.oci.oraclecloud.com

45

play.googleapis.com

38

mtalk.google.com

34

z-m-gateway.facebook.com

31

mapi.speedtest.net

27

app-measurement.com

21

mobile.events.data.microsoft.com

21

findnms.samsungiotcloud.com

18

Первая строка — приложение маркетплейса, которое будит телефон 114 раз за ночь.

Вторая — федеративное обучение: телефон участвует в обучении моделей, пока стоит на зарядке и не используется. Формально данные при этом с устройства не уходят, уходят только результаты вычислений, но сеть он всё равно дёргает регулярно.

Четвёртая строка — телеметрия, приехавшая внутрь какого-то приложения вместе с чужим набором инструментов разработки. Определить, какого именно, по DNS невозможно — видно только адресата.

Что режут фильтры

За 39 часов фильтры заблокировали 10 307 запросов — 9.6% всего трафика.

Домен

Заблокировано

beacons*.gvt2.com и beacons*.gvt3.com (9 поддоменов)

4 459

browser-intake-us5-datadoghq.com

923

srtb.msn.com

525

log.strm.yandex.ru

429

eye.targetads.io

344

sdk-api.apptracer.ru

341

mc.yandex.ru

324

proxy.telemetry.us-ashburn-1.oci.oraclecloud.com

266

rap.skcrtxr.com

161

Почти половина заблокированного — девять поддоменов одного семейства
Почти половина заблокированного — девять поддоменов одного семейства

Первая строка заслуживает отдельного внимания. Это девять разных поддоменов, к которым обращаются примерно поровну — по 480–500 раз к каждому. Такая схема обычно означает распределение нагрузки или запасные каналы: если один поддомен окажется недоступен, запросы уйдут через соседний. Суммарно на них приходится 43% всего заблокированного трафика.

Вторая строка — система мониторинга, которую разработчики встраивают в веб-приложения для сбора ошибок и метрик производительности. Она собирает данные о поведении пользователя в интерфейсе, и почти 900 обращений к ней пришло из браузера на рабочем компьютере.

Что с этим делать

Собрал практическое, по убыванию полезности.

Посмотрите настройки приватности телевизора. Это единственный прибор в квартире, который потенциально видит не свои данные, а содержимое экрана целиком. У Philips пункт называется «Персонализированный контент» и лежит в разделе Privacy Center, у других производителей — по-своему. Учтите, что найти его с первого раза может не получиться: меню производителя и меню операционной системы разнесены.

Разделяйте прибор и приложение к нему. Стиральная машина сама ходит только к производителю, а приложение для неё принесло три сторонних сервиса. Если управлять техникой можно без приложения — это заметно чище.

Отдельная сеть для приборов. Гостевая или отдельный сегмент для всего, что не компьютер и не телефон. Прямого выигрыша по DNS это не даёт, но ограничивает устройства в доступе к остальной домашней сети.

Смотрите ночные часы. Днём картину заслоняет обычный веб-сёрфинг, и разобрать что-либо тяжело. Между часом и семью утра видно ровно то, что устройства делают сами, и там уже нет случайных запросов.

Не делайте выводов, не вычтя себя. Мой прокси-шлюз давал 43% трафика и полностью перекрывал картину. Прежде чем удивляться чужой телеметрии, стоит убедиться, что вы смотрите не на собственные служебные запросы.

Итог

39 часов наблюдения, 106 875 запросов, 2605 доменов, восемь устройств. Что из этого стоило узнать:

Пылесос обошёлся тремя доменами и не позвал никого постороннего. Стиральная машина — четырьмя. Колонка ходит в аналитику ровно столько же раз, сколько по делу, и не останавливается никогда. Телевизор ночью спит крепче всех, а за сутки простоя успевает обратиться к 172 адресатам, включая систему распознавания того, что показано на экране.

Поднимается всё это за вечер и требует USB-флешки. Команды выше воспроизводятся целиком на любом OpenWrt с USB-портом, а первые интересные строчки в журнале появляются минут через двадцать после запуска.

Если запустите у себя — интересно будет сравнить, что нашлось в ваших сетях. Особенно по телевизорам других производителей.

Комментарии (31)


  1. select26
    24.07.2026 16:41

    Записал, с кем разговаривают восемь приборов в моей квартире

    Точно так же посмотрел в своем AdGuard Home и заблокировал все неизвестные с ТВ, smarthome и т.п.
    На все устройства, как default политику повесил все возможные block-list'ы. Стало настолько чище, даже без uBlock Origin, что просто диву даюсь! Просто немеряно мусора и телеметрии сейчас!


    Каждый третий запрос заблокирован! Примерно треть трафика - это явный мусор. А сколько еще вычищает uBlock?


    1. ShyDamn Автор
      24.07.2026 16:41

      Круто сделал, попробую себе тоже прикрутить uBlock. Сравню результаты и отпишу :)


  1. David_Osipov
    24.07.2026 16:41

    Тут есть нюансик. Очень рекомендую на роутере в OpenWRT все запросы к серверам по порту 53 перехватывать и редиректить на локальный сервер с Adguard Home. Есть производители, которые жёстко прописывают DNS серверы в прошивке. Может что ещё обнаружите.


    1. MxMaks
      24.07.2026 16:41

      могут запрос к dns и не на 53 порт отправлять


    1. falcon4fun
      24.07.2026 16:41

      Забыли, что еще требуется заблокировать все DoT и DoH сервера. Иначе часть девайсов будет просто ходить через них.

      И редирект 53 порта вас не спасет никак.


      1. ShyDamn Автор
        24.07.2026 16:41

        Hijack работает только с обычным DNS. DoT и DoH нужно блокировать отдельно.

        DoT блокируется на 853 порту файрвола, так как по нему почти ничего другого не передается.

        DoH сложнее, потому что использует 443 порт и не отличается от обычного HTTPS. Чтобы его обойти, можно блокировать известные DoH-серверы, например, dns.google или cloudflare-dns.com. AdGuard Home делает это с помощью списка «DNS-серверы» в фильтрах. Без знания IP-адреса DoH-сервер не будет работать.

        Для максимальной защиты можно блокировать 443 порт на известных IP-адресах DoH-серверов, но это скорее погоня, так как их IP-адреса постоянно меняются.


        1. falcon4fun
          24.07.2026 16:41

          Я про это и говорю :)

          Заблокировать DoH - проблемы не составляет. Микрот, динамик лист и поехали. Сделал у себя дома, чтобы перенаправить все запросы мобильных устройств и планшетов на ADH.

          За 5 минут можно написать скрипт еще и с автообновлением, если нужно, чтобы тянуло с чьей-нибудь гитхаб репы и парсило.


  1. checkpoint
    24.07.2026 16:41

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


    1. numark
      24.07.2026 16:41

      С телевизором, имхо, самый лучший способ - это подключить к нему устройство, с которого будет картинка идти. А телик от интернета отключить. Иначе прикажлом удобном случае (обновлении) он всю эту ерунду будет обратно врубать.


      1. checkpoint
        24.07.2026 16:41

        У меня дома так и сделано - "Smart TV" превращен в обычный "Dump TV" подключенный к Мини-ПК с FreeBSD. Но обычному пользоватею такое решение не подходит, ему требуется Android и чтобы с Нетфликсами и прочим Кинопоисками и ВКВидео. А замена одного андроидного устройства на другое - это просто "заметание проблемы под ковки".


        1. MxMaks
          24.07.2026 16:41

          С Нетфликсами и прочим Кинопоисками и ВКВидео - для семейного ТВ все это нужно в самом деле.


    1. ShyDamn Автор
      24.07.2026 16:41

      С любого Android/Google TV полностью отключить сбор данных не выйдет, ведь часть информации собирается системными службами даже без дополнительных настроек.

      Чтобы свести сбор данных к минимуму, нужно сделать три вещи:

      1. В настройках конфиденциальности отключить «Персонализированный контент» и «Релевантная реклама».

      2. В общих настройках Android TV выключить рекомендации и «использование данных».

      3. Заблокировать ряд доменов через DNS (как в первом комменте с uBlock пример).

      Если телевизор нужен для всей семьи, особенно для Кинопоиска и ВК Видео, проще использовать отдельное устройство. Это может быть Apple TV или тот же Mini-PC с Kodi (как советовал @numark ниже), так как вы сможете целиком контролировать установки


  1. itoolsy
    24.07.2026 16:41

    Pihole просто существует.
    И столько открытий еще ждет исследователей, когда они узнают про зашитые dns адреса на конечных устройствах да DoT/DoH, которые совсем по другим портам смотрят.


    1. ShyDamn Автор
      24.07.2026 16:41

      Я выбрал AGH потому что он уже был установлен на моём роутере как пакет OpenWrt, и я не хотел поднимать отдельный PI. И лично для меня в AGH чуть удобнее веб-интерфейс, чем у Pi.

      Что касается DoT/DoH, это действительно следующий уровень защиты, я уже отвечал на этот вопрос ранее. Я намеренно не стал углубляться в это в статье, так как она и так довольно объёмная. Полный разбор блокировки DoH - это тема для отдельной статьи, которую я, возможно, напишу позже.


      1. itoolsy
        24.07.2026 16:41

        Подождите, подождите.

        Вы ради пары строчек в фаерволе еще одну статью писать собираетесь?

        Ну, статью то тоже можно было парой строчек описать - поставили pihole, вдали фильтр и вбили адрес устройства - получили список куда оно ходит. Хотя да, для блокировки DoH нужна статья на 100500 символов.


        1. ShyDamn Автор
          24.07.2026 16:41

          Не только ради этого XD, а в целом возможно расскажу разные способы, как обезопасить свой трафик :)


  1. Naves
    24.07.2026 16:41

    root@OpenWrt:~# free -h
                  total        used        free      shared  buff/cache   available
    Mem:         496724      165768       23696      237372      307260       42588
    Swap:        524284           0      524284

    Это что за роутер такой с 500кб ОЗУ? Даже wl500gp прописью двадцать лет назад имел 32 мегабайта ОЗУ.

    А если это килобайты, то неужели 500мб не хватит для работы журнала DNS без файла подкачки.


    1. ShyDamn Автор
      24.07.2026 16:41

      free -h в BusyBox выводит в килобайтах без суффикса, то есть 496724 это 496 МБ, а не 500 КБ :)

      Про подкачку вы правы, для самого журнала полгигабайта хватает с запасом (даже за пять суток набралось 337 тысяч записей, порядка 100 МБ, и AGH держит из этого почти 30 МБ в памяти по size_memory). Свап понадобился не для журнала, а для установки пакетов через apk: earlyoom при нехватке памяти во время apk install убивал сам установщик. Полгигабайта свапа вставил именно чтобы это нормально работало, а не под нужды AdGuard.


  1. Sagittarius67
    24.07.2026 16:41

    А если в роутере нет USB?


    1. ShyDamn Автор
      24.07.2026 16:41

      Самый простой вариант - вынести AdGuard Home с роутера на любое устройство в сети (NAS, мини-ПК, старый ноутбук) и указать его как DNS в DHCP


  1. dmitrevo
    24.07.2026 16:41

    Забавно. Я с таким столкнулся, когда IP-камеру установил - но я сначала в изолированной сети включил ее в комп, на котором включил wireShark, и проверил, куда она пытается без спросу лезть. А потом - просто прописал правило в той-же openWRT в котором дропнул вообще все пакеты, идущие с ее MAC-адреса за пределы моего сегмента сети.
    Проверять, какие DNS запрашивает колонка - имхо, занятие странное. Ежу понятно, что шпионить за владельцем 24/7 это ее основной функционал, какая разница, на какие хосты она при этом лезет? "Ее вшивость в проверках не нуждается". Вообще, девайс для выраженных эксгибиционистов, на мой взгляд..
    Пылесосу и стиралке, на мой вкус, также абсолютно нехрен делать в сети. Вообще, я подозреваю что скоро устройства, физически неспособные никуда подключится будут цениться заметно выше всей этой "умной" дряни..


  1. nronnie
    24.07.2026 16:41

    Я еще могу хоть как-то понять интернет на стиральной машинке или даже чайнике, но на пылесосе-то он зачем??? :-О


    1. ABATAPA
      24.07.2026 16:41

      Потому что они — роботы-пылесосы — все удалённо управляются (впрочем, как почти все коммерческие IoT) через "облака" производителя.


    1. masterthemac
      24.07.2026 16:41

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


      1. Astroscope
        24.07.2026 16:41

        Подключиться можно локально, желательно посредством RS-232, если вы хоть немного инженегр, пусть даже любитель, внешний интернет для этого не нужен, а глобально вреден, потому что любой сбой в неконтролируемом вами интернете в целом или в "облаке" производителя в частности превращает "умное" что-то там в неработоспосоную вещь. Сколько уже было историй, когда "облако" прекращало существование из-за банкротства производителя, и завязанные на это "облако" поделки враз превращались в тыкву?


        1. masterthemac
          24.07.2026 16:41

          Сколько уже было историй, когда "облако" прекращало существование из-за банкротства производителя, и завязанные на это "облако" поделки враз превращались в тыкву?

          Не знаю. Хотя бы один процент от общего числа "умных что-то там" наберется?


    1. dobrobobrrobot
      24.07.2026 16:41

      а я вот как раз не могу понять интернет на чайнике или стиральной машине) типа "я еду с работы и дай ка сэкономлю целых 2,5 минуты на кипячение воды, подав команду заранее через интернет"?


      1. Astroscope
        24.07.2026 16:41

        Подать команду на кипячение воды можно. А как подать саму воду?

        Не невозможно создать электрочайник с автоматической подачей в него воды. Но рациональность такой конструкции выглядит спорной, особенно с поправкой на то, что требуются разные конструкции для подключения к водопроводу (непосредственно или через дополнительные фильтры) и к бутылированной воде. Ну и габариты и цена вопроса, в результате, предполагаются "не для всех".

        Стиральная машина наоборот всегда подключена к водопроводу и канализации, но и с ней вопрос: а зачем, для чего, что практически ценного это дает? Загрузить машину сейчас и начать стирку позже, ночью по льготному тарифу, помогает технология прошлого тысячелетия - таймер. Потому что возможность в принципе запустить стирку дистанционно малоценна без возможности дистанционно загрузить объекты стирки, дозировать моющие средства, и после стирки вывесить постиранное досушиваться.


        1. dobrobobrrobot
          24.07.2026 16:41

          а еще она может протечь, такое бывает редко, но очень метко


  1. edogs
    24.07.2026 16:41

    Интересно было бы посмотреть какая техника самостоятельно лазит смотреть по 445 порту в локалку. Ну смарт-тв это понятно, ему положено, а вот остальная.


  1. Dee3
    24.07.2026 16:41

    tldr: я установил AGH и узнал что даже телеви...

    По факту все как в статье + вот блокировка yandex телеметрии приводит к постоянным ретраям, от колонок, они начинают люто штормить и статистика пару лет назад выглядела примерно вот так. Одна колонка 30% dns трафика