MikroTik блокировка сайтов по имени

. . Просмотров: 23708

Рейтинг:  5 / 5

Звезда активнаЗвезда активнаЗвезда активнаЗвезда активнаЗвезда активна
 

Предлагаю вашему вниманию скрипт для маршрутизатора MikroTik которым пользуюсь сам для блокировки сайтов по имени. Блокирует в том числе и https трафик.

Протестировано на ROS v6.33

Пришло в голову одному нашему чиновнику запретить всем государственным организациям в городе пользоваться всякими там mail.ru и социальными сетями. Организация у меня маленькая, все что есть, так это маленький MikroTik hAP Lite, вот и пришлось поломать голову, чтобы это организовать. Проблема в том что сам Микротик не умеет работать с именами. Поэтому я решил использовать скрипт, который преобразует имена в ip адреса.

Вот так выглядит сам скрипт:

# Name: BlockSites
# Description: Resolve site ip by name and add to address-list BlackList
# Version: 1.3
# Author: http://papa-admin.ru
#
:foreach n in=[/ip firewall filter print as-value where chain=BlackList && disabled=no] do={
:local comment ($n->"comment");
:local prfx [:pick $comment 0 1];
:if ($prfx != "*") do={
:foreach i in=[/ip dns cache all print as-value where name=$comment && type="A"] do={
:local tmpAddress ($i->"data");
:if ( [/ip firewall address-list find where address=$tmpAddress] = "") do={ 
:local tmpName ($i->"name");
:log info ("BlockSites added entry: $tmpName $tmpAddress");
/ip firewall address-list add address=$tmpAddress list=BlackListSites comment=$tmpName;
}
#to prevent maximum CPU usage
delay delay-time=10ms 
}
} else {
:set comment [:pick $comment 1 [:len $comment] ];
:foreach i in=[/ip dns cache all print as-value where name~$comment && type="A"] do={
:local tmpAddress ($i->"data");
:if ( [/ip firewall address-list find where address=$tmpAddress] = "") do={ 
:local tmpName ($i->"name");
:log info ("BlockSites added entry: $tmpName $tmpAddress");
/ip firewall address-list add address=$tmpAddress list=BlackListSites comment=$tmpName;
}
#to prevent maximum CPU usage
delay delay-time=10ms 
}
}
}

 

 Как это работает:

  1. Из локальной сети запрещаем любые запросы к внешним DNS серверам. Все должны использовать DNS на самом Микротике.
  2. В ip firewall filter в цепочку BlackList добавляем правила в комментариях которых указываем имена сайтов которое хотим заблокировать. Возможно использовать * перед именем. К примеру если указать ok.ru то будет блокировать только ok.ru, если же указать *ok.ru то будут блокироваться все сайты оканчивающиеся на ok.ru (book.ru, client.ok.ru и т.д.)
  3. С помощью шедулера каждую минуту запускается скрипт, который берет список запрещенных сайтов, получает из кэша DNS ip адреса, если к этим сайтам обращались,, и добавляет их в AddressList BlackListSites
  4. А в цепочке forward мы запрещаем любой трафик для AddressList BlackListSites

 

Собственно сам код ROS который через терминал вставляем на маршрутизаторе, и который создает необходимые правила, шедулер и сам скрипт:

/ip firewall filter add action=drop chain=forward comment="drop outside dns" dst-port=53 in-interface=bridge-local protocol=udp place-before=0
/ip firewall filter add action=drop chain=forward comment="drop outside dns" dst-port=53 in-interface=bridge-local protocol=tcp place-before=0

/ip firewall filter add chain=BlackList comment=ok.ru

/ip firewall filter add action=reject chain=forward comment="block sites in the BlackListSites" dst-address-list=BlackListSites dst-port=!995,465 in-interface=bridge-local protocol=tcp reject-with=tcp-reset place-before=0

/system script
add name=BlockSites source="# Name:\
\_BlockSites\r\
\n# Description: Resolve site ip by name and add to address-list BlackList\
\r\
\n# Version: 1.3\r\
\n# Author: http://papa-admin.ru\r\
\n#\r\
\n:foreach n in=[/ip firewall filter print as-value where chain=BlackList \
&& disabled=no] do={\r\
\n\t:local comment (\$n->\"comment\");\r\
\n\t:local prfx [:pick \$comment 0 1];\r\
\n\t:if (\$prfx != \"*\") do={\r\
\n\t\t:foreach i in=[/ip dns cache all print as-value where name=\$comment\
\_&& type=\"A\"] do={\r\
\n\t\t\t:local tmpAddress (\$i->\"data\");\r\
\n\t\t\t:if ( [/ip firewall address-list find where address=\$tmpAddress] \
= \"\") do={ \r\
\n\t\t\t\t:local tmpName (\$i->\"name\");\r\
\n\t\t\t\t:log info (\"BlockSites added entry: \$tmpName \$tmpAddress\");\
\r\
\n\t\t\t\t/ip firewall address-list add address=\$tmpAddress list=BlackLis\
tSites comment=\$tmpName;\r\
\n\t\t\t}\r\
\n\t\t\t#to prevent maximum CPU usage\r\
\n\t\t\tdelay delay-time=10ms\t\r\
\n\t\t}\r\
\n\t} else {\r\
\n\t\t:set comment [:pick \$comment 1 [:len \$comment] ];\r\
\n\t\t:foreach i in=[/ip dns cache all print as-value where name~\$comment\
\_&& type=\"A\"] do={\r\
\n\t\t\t:local tmpAddress (\$i->\"data\");\r\
\n\t\t\t:if ( [/ip firewall address-list find where address=\$tmpAddress] \
= \"\") do={ \r\
\n\t\t\t\t:local tmpName (\$i->\"name\");\r\
\n\t\t\t\t:log info (\"BlockSites added entry: \$tmpName \$tmpAddress\");\
\r\
\n\t\t\t\t/ip firewall address-list add address=\$tmpAddress list=BlackLis\
tSites comment=\$tmpName;\r\
\n\t\t\t}\r\
\n\t\t\t#to prevent maximum CPU usage\r\
\n\t\t\tdelay delay-time=10ms\t\r\
\n\t\t}\r\
\n\t}\r\
\n}"

/system scheduler add interval=1m name=BlockSites on-event="system script run BlockSites"

 

В этом примере задана блокировка ok.ru

 

Но, данная блокировка не дает 100% гарантии что к указанным сайтам доступ будет ограничен. О причинах я рассказал на форуме: http://papa-admin.ru/forum/mikrotik/55-ogranichenie-dostupa-k-sajtam-na-mikrotik.html

 

Комментарии  

-1 # Kefir4IQ 02.01.2016 04:31
можно ведь сделать и проще? в dns static прописать адреса - работает 100% (при условии что клиент днс свой не пропишет, что тоже можно заблокировать на уровне микротика, днс запросы из в сети в тырнет)
0 # papa-admin 02.01.2016 21:11
Цитирую Kefir4IQ:
можно ведь сделать и проще? в dns static прописать адреса - работает 100% (при условии что клиент днс свой не пропишет, что тоже можно заблокировать на уровне микротика, днс запросы из в сети в тырнет)

Ну, про 100% вы лукавите.
А так, да, можно, и об этом я писал на форуме: www.papa-admin.ru/forum/mikrotik/55-ogranichenie-dostupa-k-sajtam-na-mikrotik.html
Но предложенный мною способ более гибкий, т.к. позволяют, в отличии от static DNS про который вы говорите, при необходимости, ограничивать доступ не всем, а выборочно через ip или address list.
0 # andrew 13.05.2016 05:38
А как отключить фильтрацию для одного IP, или группы адресов?
0 # papa-admin 13.05.2016 10:10
Цитирую andrew:
А как отключить фильтрацию для одного IP, или группы адресов?

Создаете группу адресов, и в правило фильтрации меняете на всех кроме этой группы.
0 # andrew 15.05.2016 19:14
спасибо, все получилось!
0 # podarok66 09.03.2016 21:44
Спасибо, очень интересный вариант. Скажите, а что насчет анонимайзеров? Их тоже придется блокировать отдельно?
0 # papa-admin 10.03.2016 07:58
Цитирую podarok66:
Спасибо, очень интересный вариант. Скажите, а что насчет анонимайзеров? Их тоже придется блокировать отдельно?

Можно попробовать, но их такое кол-во развелось, что все не заблокируете.
0 # Евгений 14.03.2016 09:46
Добрый день. У меня есть 100 сайтов, которые необходимо запретить. Как ваш скрипт будет выглядеть в этом случае? Его надо будет размножить 100 раз и заменить ok.ru на другое имя? Или же только строку с ok.ru размножить 100 раз? надеюсь понятно изложил?)
0 # papa-admin 15.03.2016 07:59
Размножить строку:
/ip firewall filter add chain=BlackList comment=ok.ru
указав, вместо ok.ru, все сайты которые надо заблокировать.
0 # Ал 19.03.2016 23:10
Цитирую papa-admin:
Размножить строку:
/ip firewall filter add chain=BlackList comment=ok.ru
.

Но ведь тогда получится 100 дополнительных правил и таблица firewall filter чудовищно вырастет. Или речь идёт о добавлении неугодных сайтов в поле "comment"? через запятую например?
0 # papa-admin 21.03.2016 08:03
Надо 100 правил.
0 # Ал 21.03.2016 14:26
Спасибо за разъяснение. Покритикую: решение не совсем изящное, но другого приличного на ум не приходит. Да и смысл в текущий момент времени как-то потерялся, поскольку первый же попавшийся под руку анонимайзер с лёгкостью обошёл самую обычную блокировку по IP. Вообще стало непонятно как тогда закрывать выход наружу !?
0 # duronus 17.05.2016 22:27
Зачем изобретать велосипед, загуглите mikrotik блокировка сайтов layer7
только для всяких vk.com ok.ru перед именем сайта пробел поставте
0 # papa-admin 18.05.2016 08:03
Цитирую duronus:
Зачем изобретать велосипед, загуглите mikrotik блокировка сайтов layer7
только для всяких vk.com ok.ru перед именем сайта пробел поставте


Надеюсь вы читали п.2 http://papa-admin.ru/forum/mikrotik/55-ogranichenie-dostupa-k-sajtam-na-mikrotik.html, и если подскажите regexp позволяющий заблокировать ok.ru, но не блокировать book.ru буду вам очень признателен.
Иначе это простой трёп.
0 # Ал 18.05.2016 15:34
Цитирую duronus:
блокировка сайтов layer7

Этот layer7 ресурсов кушает прилично. Поэтому домашний микротик может запросто зависнуть минут через 5 после запуска этой фильтрации.
0 # inkid 14.12.2016 15:08
Скажите, а как-то можо обойти или изменить 1 пукт с DNS на микротике?
Сеть большая, очень много статистических ip, соответственно разные DNS прописаны у всех по разному. У кого-то провайдера, у когото гугла...

Недостаточно прав для комментирования

Tags: ROS6 MikroTik