Mikrotik: небольшие полезности. Часть 2
Это очередная порция небольших возможности/реализации в RouterOS.
Изображение для привлечения внимания
Сегодня я расскажу о том:
1) Как закрыть все сайты кроме одного/нескольких
2) Как получать «человеческие» уведомления о VPN-подключениях
3) Важное нововведение в v6.36, после которого можно забыть про L7
Сразу скажу, что использовать нужно L7 Protocol. Казалось бы, чего сложного: просто применить правило «все кроме».
Но нет, это не работает. Если хотите, проверьте сами. Что делать? Одним фильтром разрешить нужные ресурсы и вторым запретить все остальные.
Разрешающий L7 имеет вид ^.+(какой-то_сайт|еще какой-то_сайт).*$.
С запрещающими сложнее. Можно зафильтровать вообще все через ^.+$. Но я бы посоветовал фильтровать протокол HTTP по URI, то есть так — ^.+(HTTP\/[0–2]).+$.
К сожалению, через терминал необходимые L7-фильтры добавляются с пустым полем regexp. Используйте вместо этого Winbox.
Добавление самих фильтры, по 2 на 'разрешить' и 'запретить' согласно вики Микротик
Небольшое уточнение для тех, кому все-таки требуется разрешить строго определенные сайты: проверяйте, какие еще ресурсы задействованы на сайте. К примеру, это могут быть подгружаемые карты. Я использую Opera для серфинга в сети, а так же входящий в нее DevTools, вкладка «Console» для определения ошибок.
Кто сталкивался с уведомлениями Микротика в секции Logging, тот знает, что уведомления убогие и подходят только для совсем простых случаев. Мне же хотелось, чтобы уведомления несли в себе как можно больше полезной информации. Оказалось, это реализовать достаточно просто: необходимы скрипты на подключение/отключение для профиля PPP. Ниже я приведу скрипты на On Up и On Down, но сначала немного подводных камней:
1) Для обоих скриптов есть предопределенные переменные — подробнее о них.
2) Переменные с дефисом необходимо указывать в кавычках. К примеру, $«caller-id». Иначе не работает!
3) Микротик отсылает сообщения по электронной почте в тексте, поэтому никаких тэгов, гиперссылку вставлять только в явном виде.
4) В теле сообщения для переноса каретки в начало новой строки используется \r\n.
5) На данном этапа (версия 6.33.2) есть проблемы с кодировкой сообщений в некоторых почтовых клиентах и web-интерфейсах.
Если у вас используются разные профили для разных подключений (что я крайне рекомендую), то вы можете стилизовать скрипты фактически под каждого клиента. Удобно, к примеру, поставить проверку на время, чтобы не получать уведомления о запланированных разрывах VPN.
И на сладкое: начиная с версии v6.36, в адресные листы можно добавлять доменные имена!
Если вы еще не прыгаете от радости как я, то самое время начать. Эта фича позволяет практически полностью уйти от использования затратного L7 с его ограничениями.
В качестве примера приведу маршрутизацию разных сайтов в разные шлюзы. Это актуально в связи с действительностью в нашей стране. Заворачивать будем web-интерфейсы почтовых серверов mail.google.com и e.mail.ru. В почту Google будем ходить по OVPN, а в Mail — по L2TP.
Таким образом, при добавлении нужного имени в определенный лист, мы фактически определяем по какому каналу будет установлена связь.
Еще один пример, который многим пригодится: перенаправлять все TCP-соединения в шлюз OVPN, а rkn.gov.ru — в шлюз по умолчанию.
Изображение для привлечения внимания
Сегодня я расскажу о том:
1) Как закрыть все сайты кроме одного/нескольких
2) Как получать «человеческие» уведомления о VPN-подключениях
3) Важное нововведение в v6.36, после которого можно забыть про L7
Интересно? Тогда прошу под кат.
Как закрыть все сайты кроме одного/нескольких
Сразу скажу, что использовать нужно L7 Protocol. Казалось бы, чего сложного: просто применить правило «все кроме».
Но нет, это не работает. Если хотите, проверьте сами. Что делать? Одним фильтром разрешить нужные ресурсы и вторым запретить все остальные.
Разрешающий L7 имеет вид ^.+(какой-то_сайт|еще какой-то_сайт).*$.
С запрещающими сложнее. Можно зафильтровать вообще все через ^.+$. Но я бы посоветовал фильтровать протокол HTTP по URI, то есть так — ^.+(HTTP\/[0–2]).+$.
К сожалению, через терминал необходимые L7-фильтры добавляются с пустым полем regexp. Используйте вместо этого Winbox.
/ip firewall layer7-protocol add name=Allow regexp="^.+(какой-то_сайт|еще_какой-то_сайт).*$"
/ip firewall layer7-protocol add name=Deny regexp="^.+(HTTP\/[0-2]).+$"
Добавление самих фильтры, по 2 на 'разрешить' и 'запретить' согласно вики Микротик
/ip firewall filter add chain=forward protocol=tcp out-interface=ваш_интерфейс layer7-protocol=Allow action=accept
/ip firewall filter add chain=forward protocol=tcp in-interface=ваш_интерфейс layer7-protocol=Allow action=accept
/ip firewall filter add chain=forward protocol=tcp out-interface=ваш_интерфейс layer7-protocol=Deny action=reject reject-with=tcp-reset
/ip firewall filter add chain=forward protocol=tcp in-interface=ваш_интерфейс layer7-protocol=Deny action=reject reject-with=tcp-reset
Небольшое уточнение для тех, кому все-таки требуется разрешить строго определенные сайты: проверяйте, какие еще ресурсы задействованы на сайте. К примеру, это могут быть подгружаемые карты. Я использую Opera для серфинга в сети, а так же входящий в нее DevTools, вкладка «Console» для определения ошибок.
Важное уточнение: в версии 6.36 и новее это можно реализовать использую 3 пункт статьи.
Как получать «человеческие» уведомления о VPN-подключениях
Кто сталкивался с уведомлениями Микротика в секции Logging, тот знает, что уведомления убогие и подходят только для совсем простых случаев. Мне же хотелось, чтобы уведомления несли в себе как можно больше полезной информации. Оказалось, это реализовать достаточно просто: необходимы скрипты на подключение/отключение для профиля PPP. Ниже я приведу скрипты на On Up и On Down, но сначала немного подводных камней:
1) Для обоих скриптов есть предопределенные переменные — подробнее о них.
2) Переменные с дефисом необходимо указывать в кавычках. К примеру, $«caller-id». Иначе не работает!
3) Микротик отсылает сообщения по электронной почте в тексте, поэтому никаких тэгов, гиперссылку вставлять только в явном виде.
4) В теле сообщения для переноса каретки в начало новой строки используется \r\n.
5) На данном этапа (версия 6.33.2) есть проблемы с кодировкой сообщений в некоторых почтовых клиентах и web-интерфейсах.
Код скриптов максимально упрощен. У вас должна быть настроена ветка Tools → Email для использования «из коробки».
Скрипт On Up
:local email "ваш_адрес_почты"
##### Тело скрипта
/tool e-mail send to=$email subject="Пользователь $user подключился к VPN" body="Пользователь $user подключился по $[/ppp active get [/ppp active find where name=$user caller-id=$"caller-id" address=$"remote-address"] service] в $[/system clock get time].\r\nIP-адрес клиента - $"caller-id".\r\nИнфо об IP клиента - http://apps.db.ripe.net/search/query.html?searchtext=$"caller-id""
Вид уведомления
Скрипт On Down
:local email "ваш_адрес_почты"
##### Тело скрипта
/tool e-mail send to=$email subject="Пользователь $user отключился от VPN" body="Пользователь $user отключился в $[/system clock get time]."
Вид уведомления
Если у вас используются разные профили для разных подключений (что я крайне рекомендую), то вы можете стилизовать скрипты фактически под каждого клиента. Удобно, к примеру, поставить проверку на время, чтобы не получать уведомления о запланированных разрывах VPN.
Доменные имена в адресных листах
И на сладкое: начиная с версии v6.36, в адресные листы можно добавлять доменные имена!
*) firewall — allow to add domain name to address-lists (dynamic entries for resolved addresses will be added to specified list);
Если вы еще не прыгаете от радости как я, то самое время начать. Эта фича позволяет практически полностью уйти от использования затратного L7 с его ограничениями.
В качестве примера приведу маршрутизацию разных сайтов в разные шлюзы. Это актуально в связи с действительностью в нашей стране. Заворачивать будем web-интерфейсы почтовых серверов mail.google.com и e.mail.ru. В почту Google будем ходить по OVPN, а в Mail — по L2TP.
/ip firewall address-list add list=ovpn address=mail.google.com
/ip firewall address-list add list=l2tp address=e.mail.ru
/ip firewall mangle add chain=prerouting protocol=tcp src-address=192.168.1.0/24 dst-address-list=ovpn action=mark-routing new-routing-mark=ovpn-route
/ip firewall mangle add chain=prerouting protocol=tcp src-address=192.168.1.0/24 dst-address-list=l2tp action=mark-routing new-routing-mark=l2tp-route
/ip route add dst-address=0.0.0.0/0 gateway=ovpn-out1 distance=1 routing-mark=ovpn-route
/ip route add dst-address=0.0.0.0/0 gateway=l2tp-out1 distance=1 routing-mark=l2tp-route
Таким образом, при добавлении нужного имени в определенный лист, мы фактически определяем по какому каналу будет установлена связь.
Еще один пример, который многим пригодится: перенаправлять все TCP-соединения в шлюз OVPN, а rkn.gov.ru — в шлюз по умолчанию.
/ip firewall address-list add list=RKN address=rkn.gov.ru
/ip firewall mangle add chain=prerouting protocol=tcp src-address=192.168.1.0/24 dst-address-list=RKN action=accept
/ip firewall mangle add chain=prerouting protocol=tcp src-address=192.168.1.0/24 dst-address=!192.168.0.0/16 action=mark-routing new-routing-mark=ovpn-route
/ip route add dst-address=0.0.0.0/0 gateway=ovpn-out1 distance=1 routing-mark=ovpn-route
Другие части
Комментарии (5)
30 июля 2016 в 16:45 (комментарий был изменён)
0↑
↓
Использование доменных имен в Address List это очень хорошо. Но вот вопрос: каким образом разрешается это имя в IP?
Допустим, я хочу иметь список удаленных узлов, которым будет разрешен доступ к некоторому сервису во внутренней сети (dst-nat проброс). Причем эти удаленные узлы имеют постоянные DDNS-имена, но меняющиеся динамические IP-адреса. Раньше по некоторой схеме через одно место получал удовлетворительный актуальный список IP-адресов этих узлов. Теперь пытаюсь понять, может ли новая фича заменить прежнюю схему с динамическим списком DDNS узлов.
Вопрос, собственно, в том, как часто делается DNS Resolve по доменным именам в Address List?30 июля 2016 в 16:55
0↑
↓
Once a domain is added to an address-list it is resolved by routeros and the resolved IP (s) is added to the same address-list as a dynamic entry with timeout value the TTL returned by the DNS protocol.
When the timeout (TTL) expires, routeros will re-resolve the domains again and if the IP is changed it will replace it in the address-list.
The firewall rules that use those address-lists only take into account the entries with IP addresses. Not the ones with domains.
Ссылка30 июля 2016 в 16:59 (комментарий был изменён)
0↑
↓
И вкратце:…the address is resolved at boot and when DNS TTL reaches 0 and is renew in cache.
Перезагрузка, TTL = 0, обновление кэша DNS.
30 июля 2016 в 18:54
0↑
↓
человеческие уведомления… нет они имеют право на жизнь, но только не по вопросу подключения-отключения интерфейсов в т.ч. vpn, для большинства случаев все таки будет лучше систему мониторинга, которая понимает состояния и не шлет письма каждые 20 секунд например31 июля 2016 в 01:33
0↑
↓
Если вы видели стандартные уведомления в Logging, то вы понимаете почему нужны человеческие.
Реализация не претендует на корпоративный сегмент среднего-крупного масштаба. Для малого бизнеса она вполне пригодна.
Но, конечно, можно собирать vpn-подключения по SNMP системой мониторинга.