2012-02-01

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

По мотивам моего поста geektimes.ru/post/270242/
Производители 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](github.com/ErshovSergey/Mikrotik_update_AddressList_ip)  
Дата публикации February 1, 2012