Sunday, November 3, 2013

Блокировка сайтов на Mikrotik

Приветсвую! Сегодня поделюсь скриптиком, который поможет в таком не легком деле как блокировка социальных сетей или других неуместных сайтов.

Получив задачу блокировать определенные сайты от начальства (или от собственной прихоти) админы лезут сразу в /ip firewall на микротике и создают правило в котором пытаются блочить все пакеты содержащиее ключевые слова. К примеру:
И еще в вкладке Action ставят Drop. А особенно весело когда в поле content вбивают слово sex или porn . :) Вроде как благая цель, а на деле начинаются проблемы с интернетом. Скачиваемые большие файлы неожиданно обрываются или интернет просто начинает жутко тормозить. Проблема в том что короткие комбинации слов очень легко встречаются в самых неожиданных "местах". Другими словами таки комбинации могут быть в изображении или каком нибудь видео. Или просто толстом архиве каких-то документов. Ну короче, жизнь админа после таких правил файрвола только усложняется.

Потому есть более красивое решение: будем блокировать домены по их ip адресам. Но т.к. тот же facebook имеет кучу разных адресов на домен facebook.com, то нам прийдется прибегнуть к помощи наших дорогих пользователей. Суть вот в чем. Пользователь при заходе на данные сайты просит mikrotik отрезолвить ip адрес домена. Ну а dns сервер mikrotik в свою очередь записывает все адреса себе в кэш. Вот именно кэшем мы и воспользуемся.
В общем вот скрипт
:foreach i in=[/ip dns cache all find where (name~"facebook" ||  name~"fbcdn" || name~"odnokl" ) && (type="A") ] do={
     :local tmpAddress [/ip dns cache get $i address];
delay delay-time=10ms
#prevent script from using all cpu time
    :if ( [/ip firewall address-list find where address=$tmpAddress] = "") do={        
     :local cacheName [/ip dns cache get $i name] ;
     :log info ("added entry: $cacheName  $tmpAddress");
     /ip firewall address-list add address=$tmpAddress list=block comment=$cacheName;
}
}
Суть работы скрипта вот в чем: в первой строке мы забиваем в кавычках какие домены искать find where (name~"facebook" ||  name~"fbcdn" || name~"odnokl" ) . Если есть совпадения то мы закидываем ip адрес этого домена в адреслист с именем block.
Остается создать правило в файрволе примерно такое:
 /ip firewall filter add chain
=forward dst-address-list=block src-address-list=!"dostup na sots seti" action=reject reject-
with=icmp-host-prohibited disabled=no

Где src-address-list=!"dostup na sots seti" говорит что правило работает для всех адресов, кроме забитых в адреслист "dostup na sots seti" (т.е. там хранятся адреса тех кому можно ходить на соц сети :) ).
И обращаю в нимание на action - стоит reject,  это для того что бы браузер не "повисал" когда обращается к этим ардесам, а сразу выдавал ошибку о том что сеть не доступна.
Вот в кратце как-то так...

No comments:

Post a Comment