Smart TV — может и не следит. Но всё-таки…

    Производители 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 ;
    			}
    		}
    	}
    }



    Update 2017.06.13
    После выхода версии RouterOS 6.36 — появилась возможность блокировать по dns имени, а не по ip адресу. Скрипт был переделан.
    Текущие состояние
    github.com/ErshovSergey/Mikrotik_update_AddressList_ip
    Поделиться публикацией
    Никаких подозрительных скриптов, только релевантные баннеры. Не релевантные? Пиши на: adv@tmtm.ru с темой «Полундра»

    Зачем оно вам?
    Реклама
    Комментарии 41
    • +6
      Не знаю как тут принято делать, в свете возможности комментировать с гостевых аккаунтов, но не возможности голосовать.
      Но скажу от себя — большое спасибо за скрипт.
      • 0
        Спасибо! Давно искал что-то подобное. Подскажите пожалуйста, у меня роутер Dlink-DIR 615 с прошивкой DD-WRT, мне этот скрип вставить в поле Cron?
        Спасибо.
        • 0
          А DD-WRT поддерживает скрипты от Микротика?
          • 0
            А что там прошивка не на основе Linux?
            • 0
              На DD-WRT можно свой hosts положить, заодно и рекламу «порезать».
              • 0
                На OpenWRT (и DD-WRT тоже) можно не насиловать hosts, а поставить Privoxy с примотанными синей изолентой фильтрами от AdBlock Plus. blog.vanutsteen.nl/2014/01/05/installing-privoxy-with-adblock-filters-on-openwrt
                • 0
                  У меня adBlock не берет то что берет специальный список hosts, например начисто вычищает рекламу Яндекс. И в данном случае в борьбе с телевизором adBlock не поможет.
                  • 0
                    А пробовали правила по хостам ввести в adBlock? hosts — это очень грубый инструмент и неэффективный против CDN например. Неужели adBlock не умеет банально блокировать хосты?
                    • 0
                      Каким-то образом реклама появлялись вновь, пока hosts хороший не скачал. И теперь ставлю только Ghostery без Adblock. Только антивирусы hosts не любят — норовят удалить.
                      • 0
                        Посоветуйте хороший hosts, пожалуйста.
                      • 0
                        Т.е. вы принципиально ручками не хотите прописывать правила в Adblock? Блокировать рекламу при помощи hosts — это из пушки по воробьям. Крайне неэффективно и сложно обходить рекламные CDN. Может они вам ещё не попадались…
                        • 0
                          Покрайней мере с hosts мне стало комфортнее, примерно как в статье habrahabr.ru/post/263081
                          Хоть и пользовался много лет Adblock, это только браузер, а hosts — всё.
                  • +1
                    Насколько помню, такое решение (Privoxy с фильтрами AdBlock) весьма требовательно к ресурсам процессора и памяти.

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

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

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

              А в каких ТВ, можно удаленно подключаться «для помощи»? А то хотелось бы знать потенциального врага в лицо…
              • 0
                У Samsung такое есть, возможно еще у Sony, но тут я могу ошибаться.
              • 0
                Статистику по просмотрам собирают у клиентов. С аналоговым TV такое куда труднее провернуть. Приходится платить, выдавать железяки, да подписывать контракты с людьми для этого. Даже результаты не точные получаются, так как охват аудитории мал. Так по большей части рейтинги и додумываются. Не вдавался в договоры на цифровое телевидение, но наверняка там присутствует пунктик насчет сбора статистических данных. Хорошо это или плохо? Время покажет.
                • +1
                  Как только на экранах появятся кнопки like и dislike на телевидении появится много безработных телеведущих.
                • 0
                  А как этот скрипт работает с обновлением прошивки? Насколько я вижу он блокирует домен полностью. По Вашему мнению лучше оставаться на дырявой прошивке доступной для всех, чем отсылать данные производителю?
                  • 0
                    За последний месяц обновления не было. Проверяется отключением правила firewall и принудительной проверкой обновления.
                    Опять же новая версия обычно новые правила навязываемые в одностороннем порядке.

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

                      Всё, на самом деле, для улучшения качества вещания. Но Россия — не целевой сегмент.
                      • 0
                        С LG проще — список необходимых для блокировки доменов гораздо короче и более предсказуем
                        Пока искал для SmartTV натыкался на список для LG, всего 3 или 4 домена.
                        Опять же вроде LG закрыла направление smart для России.
                        • 0
                          Очень жаль. На самом деле, я бы не рассматривал это всё исключительно в негативном свете.

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

                          До целевой рекламы именно для вас, на вашем телевизоре ещё очень далеко.
                          • 0
                            Вы считаете, что производители умных телевизоров будут делится статистикой с широковещательными каналами четкой?
                            • 0
                              Уже делятся, за денежку.
                              • 0
                                Поделитесь ссылкой пожалуйста, желательно с каналами вещающими на территории РФ.
                                • +1
                                  Про Россию не скажу, потому что этот рынок мне совсем не знаком. В США эти данные продаёт, например,  Sorenson Media.
                      • 0
                        А почему не разрешить телевизору ходить только на белый список адресов?
                        Мало ли куда он полезет, особенно когда вирус схватит.
                        • 0
                          «Белый список» — это более правильно.
                          Не нашел такого списка пока был в процессе создания этого скрипта.
                          • 0
                            Полагаю, раньше или позже появится. Смотрите зарубежные форумы. Не у вас одного такая потребность возникла же. И вайфай в телевизоре отключите, а то через соседский незапароленный вылезет и зловредов наловит.
                            • 0
                              WiFi не включался изначально. Внутренняя сеть на проводе.
                              • +3
                                Я бы не доверял ЭТОМУ, возьмет да и включит. Вон андроид, постоянно сканирует вайфай сети, даже при «отключенном» вайфае.
                        • 0
                          На моем самсунге можно кастомно принять пункты соглашения. По крайне те, в которых говорится о сборе данных я расчекбоксил при первичной настройке телика. Это конечно ни чего не гарантирует, но по крайней мере я выразил свое несогласие на сбор данных самсунгом.
                          • 0
                            Всем чего-то хочется собрать. Пора бы уже за пользование интернетом начать пользователям платить. Как в старом анекдоте: «Однако, я хотел — шкурку тебе давал. Ты хотел — шкурку мне давай.»
                            • 0
                              Я на устройствах, таких как спутниковые ресиверы, блокировал непонятные хождения по сети не имея iptables маршрутами.
                              ip route add blackhole 0.0.0.0/0
                              • 0
                                Не сразу понял почему TTL в секундах…
                                • 0
                                  Update 2017.06.13
                                  После выхода версии RouterOS 6.36 — появилась возможность блокировать по dns имени, а не по ip адресу. Скрипт был переделан.
                                  Текущие состояние
                                  https://github.com/ErshovSergey/Mikrotik_update_AddressList_ip

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.