Производители SmartTV добавляют много удобств в свои телевизоры. Из которых я пользуюсь телевидением, IP телевидением, просмотром содержимого своего DNLA сервера, youtube и skype.

В замен производители (об этом написано в очередном соглашении после очередного обновления прошивки и ПО, отказаться невозможно) хотят знать что и когда смотрю, что запускаю и т.п. Особенно «нравится» возможность удаленно подключаться к телевизору для помощи — это конечно полезно, но всё-таки…

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

В качестве шлюза Mikrotik, под катом скрипт, который ограничивает доступ по dns имени из списка.
Список блокируемых доменов не полный, был собран с просторов интернет.

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

Параметры скрипта:
  • Список доменов, которые надо заблокировать — задается в теле скрипта.
    Можно заблокировать домен указав его в точном виде
    "msecnd.net";

    или все домены большего уровня указав *
    "*.adform.net";
  • NameAddressList — имя AddressList для последующего использования в правилах firewall


Скрипт запускается по расписанию — у меня 1 раз минуту.

В firewall надо добавить правило, которое блокирует доступ для SmartTV до доменов из списка (задается в скрипте, параметр NameAddressList) вида
chain=forward action=reject reject-with=icmp-network-unreachable src-address=192.168.100.123 dst-address-list=BlockSpySmartTV log=no log-prefix="BlockSpySmartTV: " 

192.168.100.123 — адрес телевизора.

Как работает:
  • после первого обращения к домену — соответствующий ip адрес попадает в кэш Mikrotik
  • скрипт проверяет кеш и при совпадении соответствующий IP адрес блокируется с указанием TTL чтобы не засорять список. Если TTL=0, то TTL=59 секунд.
  • соответствующее правило в firewall блокирует пакеты на этот IP адрес.

Получается, что в течении 1 минуты (в моем случае) после резолва домена — IP адрес будет заблокирован.

Спустя минуту после включения телевизора — порядка двух десятков заблокированных IP адресов. Бывает и больше.

Наблюдение в течении получаса за заблокированными доменами показало:
  • обращение к ним идет даже если не меняется канал и громкость
  • количество обращений достаточное для беспокойства


Создаваемая на роутер нагрузка — на уровне погрешности — увеличения не заметил.

Сам скрипт
:local NameAddressList "BlockSpySmartTV"

# блокируемые домены
:local DNSDomains {
	"*.samsungelectronics.com";
	"*.samsungcloudsolution.com";
	"*.samsungcloudsolution.net";
	"*.samsungcloudsolution.com";
	"*.samsungrm.net";
	"*.samsungotn.net";
	"*.samsungosp.com";
	"*.internetat.tv";
	"*.samsungyosemite.com";
	"*.cloudfront.net";
	"*.google-analytics.com";
	"*.googletagservices.com";
	"*.googlesyndication.com";
	"*.amazonaws.com";
	"*.krxd.net";
	"*.cloudapp.net";
	"*.doubleclick.net";
	"*.xiti.com";
	"*.pavv.co.kr";
	"*.adform.net";
# youtube
#"*.ytimg.com";
#
	"msecnd.net";
}

# количество доменов
:local QuantDNSDomains [:len $DNSDomains]

:for iDNSDomain from=0 to=($QuantDNSDomains-1) do={ 

# текущий домен
	:local CurrentDNSDomain (:put ($DNSDomains->($iDNSDomain)))
	:log debug " CurrentDNSDomain:'$CurrentDNSDomain'"

	:local prfx [:pick $CurrentDNSDomain 0 1];
	:log debug " prfx:'$prfx'"
	:if ($prfx != "*") do={

# если dns имя есть в кеше dns
		:foreach i in=[/ip dns cache all find where (name~$CurrentDNSDomain ) ] do={
# ищем соответстсвующее dns имя и ip адрес 
			:local cacheName [/ip dns cache get $i name] ;
			:local tmpAddress [:resolve $cacheName]
			:log debug " cacheName :'$cacheName' tmpAddress:'$tmpAddress'"

#prevent script from using all cpu time
			delay delay-time=10ms

# если этот адрес не блокируется 
			:if ( [/ip firewall address-list find where address=$tmpAddress] = "") do={ 
				:local cacheName [/ip dns cache get $i name] ;
				:local cacheNameTTL [/ip dns cache get $i ttl] ;

# если ttl<1m, то ttl=1m
				:log debug " cacheNameTTL: $cacheNameTTL "
				:if ( $cacheNameTTL < "00:00:59" ) do={
					:set cacheNameTTL "00:00:59"
					:log debug " SET cacheNameTTL: $cacheNameTTL "
				}

				:log warning (" added entry: dns-name: $cacheName ip-addr:$tmpAddress ttl:$cacheNameTTL ");
				/ip firewall address-list add address=$tmpAddress list=$NameAddressList comment=$cacheName timeout=$cacheNameTTL ;
			}
		}
	} else {
# есть префикс - убираем
		:set CurrentDNSDomain [:pick $CurrentDNSDomain 1 [:len $CurrentDNSDomain] ];

# если dns имя есть в кеше dns
		:foreach i in=[/ip dns cache all find where (name~$CurrentDNSDomain ) ] do={
# ищем соответстсвующее dns имя и ip адрес 
			:local cacheName [/ip dns cache get $i name] ;
			:local tmpAddress [:resolve $cacheName]
			:log debug " cacheName :'$cacheName' tmpAddress:'$tmpAddress'"

#prevent script from using all cpu time
			delay delay-time=10ms

# если этот адрес не блокируется 
			:if ( [/ip firewall address-list find where address=$tmpAddress] = "") do={ 
# ttl для записи в кеше dns
				:local cacheNameTTL [/ip dns cache get $i ttl] ;

# если ttl<1m, то ttl=1m
				:log debug " cacheNameTTL: $cacheNameTTL "
				:if ( $cacheNameTTL < "00:00:59" ) do={
					:set cacheNameTTL "00:00:59"
					:log debug " SET cacheNameTTL: $cacheNameTTL "
				}

				:log debug (" CurrentDNSDomain: '$CurrentDNSDomain' added entry: dns-name: $cacheName ip-addr:$tmpAddress ttl:$cacheNameTTL ");
				/ip firewall address-list add address=$tmpAddress list=$NameAddressList comment=$cacheName timeout=$cacheNameTTL ;
			}
		}
	}
}

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


  1. u010602
    01.02.2016 16:07
    +6

    Не знаю как тут принято делать, в свете возможности комментировать с гостевых аккаунтов, но не возможности голосовать.
    Но скажу от себя — большое спасибо за скрипт.


  1. sarhome
    01.02.2016 16:11

    Спасибо! Давно искал что-то подобное. Подскажите пожалуйста, у меня роутер Dlink-DIR 615 с прошивкой DD-WRT, мне этот скрип вставить в поле Cron?
    Спасибо.


    1. u010602
      01.02.2016 16:13

      А DD-WRT поддерживает скрипты от Микротика?


      1. sarhome
        01.02.2016 16:16

        А что там прошивка не на основе Linux?


        1. Rumlin
          01.02.2016 16:34

          На DD-WRT можно свой hosts положить, заодно и рекламу «порезать».


          1. svosin
            01.02.2016 16:48

            На OpenWRT (и DD-WRT тоже) можно не насиловать hosts, а поставить Privoxy с примотанными синей изолентой фильтрами от AdBlock Plus. blog.vanutsteen.nl/2014/01/05/installing-privoxy-with-adblock-filters-on-openwrt


            1. Rumlin
              01.02.2016 17:28

              У меня adBlock не берет то что берет специальный список hosts, например начисто вычищает рекламу Яндекс. И в данном случае в борьбе с телевизором adBlock не поможет.


              1. Alexeyslav
                01.02.2016 18:21

                А пробовали правила по хостам ввести в adBlock? hosts — это очень грубый инструмент и неэффективный против CDN например. Неужели adBlock не умеет банально блокировать хосты?


                1. Rumlin
                  01.02.2016 18:32

                  Каким-то образом реклама появлялись вновь, пока hosts хороший не скачал. И теперь ставлю только Ghostery без Adblock. Только антивирусы hosts не любят — норовят удалить.


                  1. u010602
                    01.02.2016 19:14

                    Посоветуйте хороший hosts, пожалуйста.


                    1. Rumlin
                      02.02.2016 08:23

                      Самый простой способ, которым я пользовался — я взял hosts из андроид приложения adfree.
                      Как вариант свежий сборник — github.com/StevenBlack/hosts

                      Ниже комментарии пример статьи на хабре geektimes.ru/post/270242/#comment_8981766


                      1. u010602
                        02.02.2016 18:21

                        Спасибо.


                  1. Alexeyslav
                    01.02.2016 20:06

                    Т.е. вы принципиально ручками не хотите прописывать правила в Adblock? Блокировать рекламу при помощи hosts — это из пушки по воробьям. Крайне неэффективно и сложно обходить рекламные CDN. Может они вам ещё не попадались…


                    1. Rumlin
                      02.02.2016 08:13

                      Покрайней мере с hosts мне стало комфортнее, примерно как в статье habrahabr.ru/post/263081
                      Хоть и пользовался много лет Adblock, это только браузер, а hosts — всё.


            1. dartraiden
              05.02.2016 15:18
              +1

              Насколько помню, такое решение (Privoxy с фильтрами AdBlock) весьма требовательно к ресурсам процессора и памяти.

              Вариант с hosts намного менее прожорлив. Для OpenWRT есть очень недурственная реализация, посмотрите «teffalump OpenWRT adblock implementation» (ссылки вставлять не могу, увы). Этот скрипт умеет брать из интернета уже готовые списки «плохих» доменов и склеивает их в один файл. Поддерживает «чёрные» (добавляем в специальный файл собственные домены) и «белые» (если нужно какой-то конкретный домен разблокировать) списки. У меня сейчас там используется около 8 разных списков, и на роутере с 32 мегабайтами оперативной памяти никаких тормозов при этом нет.

              Кроме того, в репозиториях OpenWRT и Gargoyle (упрощённый форк, расчитанный на неискушённого пользователя) уже разрабатываются пакеты с аналогичным функционалом. Так что, в следующем выпуске OpenWRT такой «адблок на роутере» можно будеть легко установить из родного репозитория.


        1. Varkus
          01.02.2016 21:40

          На основе, но есть одно большое НО
          Маша и Саша оба из мяса, костей и прочего, тогда почему Саша инженер, а Маша учитель?
          Аналогия может не из лучших, но принцип тот же.
          Если конкретнее: синтаксис данного скрипта я никогда не видел ни в DD-WRT ни в OpenWRT.
          Вот буквально первые строки моих скриптов в OpenWRT, 4я строка переделана из предложенного скрипта
          #!/bin/sh
          # Copyright © 2016 Varkus.pro

          NameAddressList=«BlockSpySmartTV»


  1. saboteur_kiev
    01.02.2016 18:23

    С уверенностью на 99%, могу сказать что LG TV с WebOS, выпуском до начала 2016 года, пока еще не следят.

    А в каких ТВ, можно удаленно подключаться «для помощи»? А то хотелось бы знать потенциального врага в лицо…


    1. Alexsey
      01.02.2016 19:33

      У Samsung такое есть, возможно еще у Sony, но тут я могу ошибаться.


  1. Koshkodevka
    01.02.2016 21:40

    Статистику по просмотрам собирают у клиентов. С аналоговым TV такое куда труднее провернуть. Приходится платить, выдавать железяки, да подписывать контракты с людьми для этого. Даже результаты не точные получаются, так как охват аудитории мал. Так по большей части рейтинги и додумываются. Не вдавался в договоры на цифровое телевидение, но наверняка там присутствует пунктик насчет сбора статистических данных. Хорошо это или плохо? Время покажет.


    1. Rumlin
      02.02.2016 08:26
      +1

      Как только на экранах появятся кнопки like и dislike на телевидении появится много безработных телеведущих.


  1. Demon_i
    01.02.2016 21:41

    А как этот скрипт работает с обновлением прошивки? Насколько я вижу он блокирует домен полностью. По Вашему мнению лучше оставаться на дырявой прошивке доступной для всех, чем отсылать данные производителю?


    1. ErshoFF
      01.02.2016 21:51

      За последний месяц обновления не было. Проверяется отключением правила firewall и принудительной проверкой обновления.
      Опять же новая версия обычно новые правила навязываемые в одностороннем порядке.

      Что в вашем понимании «дырявой прошивке доступной для всех»?
      Телевизор в «серой» сети — доступ снаружи (в вашем определении «всем») запрещен.


    1. JerleShannara
      02.02.2016 17:49

      Бррр, хватит с меня обновлений прошивки телевизора. Лыжу пришлось два раза восстанавливать после очередного «хазяина, я тут прашивка нашёль, давай обновлюсь». Причём если в первый раз оно тупо потеряло звук, то во второй раз оно стало вырубаться раз в 2 минуты, очень весело восстанавливать прошивку, когда оно посреди процесса отключается. А про дыры — мне как-то пофигу, доступа извне к телевизору нет + всякие «подключи сюды свитер и пейсбук» не использую


  1. ppl2scripts
    01.02.2016 21:55

    Могу сказать за LG. Там только статистика просмотров, и то в очень обрезанном виде.

    Всё, на самом деле, для улучшения качества вещания. Но Россия — не целевой сегмент.


    1. ErshoFF
      01.02.2016 21:58

      С LG проще — список необходимых для блокировки доменов гораздо короче и более предсказуем
      Пока искал для SmartTV натыкался на список для LG, всего 3 или 4 домена.
      Опять же вроде LG закрыла направление smart для России.


      1. ppl2scripts
        01.02.2016 22:05

        Очень жаль. На самом деле, я бы не рассматривал это всё исключительно в негативном свете.

        Широковещательные каналы чёткой статистики не имеют, но очень хотели бы её иметь. Может быть они показывают то, что никто смотреть не хочет?

        До целевой рекламы именно для вас, на вашем телевизоре ещё очень далеко.


        1. ErshoFF
          01.02.2016 22:08

          Вы считаете, что производители умных телевизоров будут делится статистикой с широковещательными каналами четкой?


          1. ppl2scripts
            01.02.2016 22:09

            Уже делятся, за денежку.


            1. ErshoFF
              01.02.2016 22:11

              Поделитесь ссылкой пожалуйста, желательно с каналами вещающими на территории РФ.


              1. ppl2scripts
                01.02.2016 22:14
                +1

                Про Россию не скажу, потому что этот рынок мне совсем не знаком. В США эти данные продаёт, например,  Sorenson Media.


  1. Dmitry_Th
    01.02.2016 22:03

    А почему не разрешить телевизору ходить только на белый список адресов?
    Мало ли куда он полезет, особенно когда вирус схватит.


    1. ErshoFF
      01.02.2016 22:09

      «Белый список» — это более правильно.
      Не нашел такого списка пока был в процессе создания этого скрипта.


      1. Dmitry_Th
        01.02.2016 22:13

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


        1. ErshoFF
          01.02.2016 22:15

          WiFi не включался изначально. Внутренняя сеть на проводе.


          1. Dmitry_Th
            01.02.2016 22:16
            +3

            Я бы не доверял ЭТОМУ, возьмет да и включит. Вон андроид, постоянно сканирует вайфай сети, даже при «отключенном» вайфае.


  1. under-c
    05.02.2016 15:06

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


  1. sergarcada
    05.02.2016 15:10

    Всем чего-то хочется собрать. Пора бы уже за пользование интернетом начать пользователям платить. Как в старом анекдоте: «Однако, я хотел — шкурку тебе давал. Ты хотел — шкурку мне давай.»


  1. AndreyUA
    05.02.2016 15:17

    Я на устройствах, таких как спутниковые ресиверы, блокировал непонятные хождения по сети не имея iptables маршрутами.
    ip route add blackhole 0.0.0.0/0


  1. igorsd
    07.02.2016 15:08

    Не сразу понял почему TTL в секундах…