Всем привет, я нашёл простой способ помечать трафик, связанный с YouTube, Facebook и т.д.
Введение:
Раньше я видел на форуме, что люди вручную поддерживают огромные списки IP-адресов для этой цели. Начиная с версии 6.36, RouterOS позволяет добавлять доменные имена в списки адресов. Это значит, что мы можем просто добавить youtube.com в список адресов, и RouterOS автоматически разрешит это имя в IP-адрес(а) и добавит их в список. Это сильно помогло, так как можно было просто добавить, например, youtube.com в список, надеясь, что трафик отфильтруется автоматически.
Но это не сработало, потому что yt, fb и другие используют так называемую CDN (Content Delivery Network) для доставки контента и используют основной домен только для веб-интерфейса. Кроме того, эти CDN обычно географически распределены по всему миру, чтобы предоставлять пользователям самые близкие серверы. Именно эти хостнеймы и IP-адреса CDN нам и нужно выделять, чтобы помечать/фильтровать/ограничивать трафик, идущий к ним или от них.
Проблема:
Нужно найти способ автоматически обновлять все IP-адреса CDN (добавлять их в список адресов), чтобы мы могли помечать/фильтровать/ограничивать трафик, идущий с этих адресов и на них.
Если взглянуть на запрос видео на YouTube, мы увидим, что доставка контента обычно происходит через CDN сети с доменом “googlevideo”. В списке подключений обычно видны такие хосты (в зависимости от страны):
r5.sn-ncc-cxbe.googlevideo.com
r15.sn-c0q7lnek.googlevideo.com
r5.sn-4g5ednsl.googlevideo.com
Очевидно, что поддомены предсказать сложно (наверное, специально, чтобы усложнить блокировку сервиса). Но одно предсказать можно — это домен googlevideo.com. Аналогичная ситуация с Facebook и другими крупными игроками.
Одно из возможных решений:
Нам бы хотелось автоматизировать обнаружение всех таких хостов на CDN, которые посещают наши пользователи. Можно было бы прослушивать HTTP-запросы к youtube.com и смотреть, какие CDN хосты предлагаются для доставки контента, но это требует много ресурсов процессора и к тому же сейчас многие сайты работают по HTTPS, из-за чего такой подход не работает.
Другой способ — прослушивать DNS-запросы к хостам CDN и получать нужные нам хостнеймы/IP-адреса. Проблема в том, что наши пользователи могут использовать публичные DNS-серверы (например, 8.8.8.8 от Google), и тогда нужно слушать весь DNS-трафик, чтобы выявить новые хосты CDN. Обработка такого трафика тоже требует ресурсов процессора.
Если только перенаправить все DNS-запросы через свой DNS-сервер, который запущен на роутере. Тогда роутер будет выступать в роли DNS-сервера для наших пользователей, независимо от того, какой публичный DNS они выберут. Это обеспечит постоянное обновление кэша DNS с актуальными хостами CDN, которые используют наши пользователи.
Минус такого подхода — повышенная нагрузка на процессор из-за обработки увеличенного DNS-трафика, с которым роутеру придется работать.
Короче, решать можно так:
Сначала перенаправляем все DNS-запросы на наш DNS-сервер, который запущен на роутере:
/ip firewall nat
add disabled=no chain=dstnat protocol=udp dst-port=53 action=redirect to-ports=53
add disabled=no chain=dstnat protocol=tcp dst-port=53 action=redirect to-ports=53
Создаём простой скрипт, который будет фильтровать все записи в DNS-кэше, искать нужные нам, например “googlevideo.com”, и обновлять наш список адресов с названием “social”:
:foreach i in=[/ip dns cache find name~"googlevideo.com"] do={
:do {
/ip firewall address-list add list=social address=[/ip dns cache get $i name];
} on-error={}
}
Часть /ip dns cache find name~"googlevideo.com" ищет все записи в кэше, в которых есть “googlevideo.com”.
Далее мы перебираем найденные записи с помощью foreach и добавляем каждое имя в наш список адресов “social”.
Обратите внимание на блок “on-error” в конце строки — начиная с версии 6.2, в RouterOS скриптах появилась возможность обрабатывать ошибки во время выполнения. Это нужно, чтобы роутер не останавливался, если встречается дублирующая запись в списке адресов. Именно поэтому у нас двойное “do”.
Теперь можно помечать/фильтровать/ограничивать все пакеты, приходящие с этих IP или идущие на них.
Если у вас есть идеи, как улучшить это решение, оставляйте комментарии.
Введение:
Раньше я видел на форуме, что люди вручную поддерживают огромные списки IP-адресов для этой цели. Начиная с версии 6.36, RouterOS позволяет добавлять доменные имена в списки адресов. Это значит, что мы можем просто добавить youtube.com в список адресов, и RouterOS автоматически разрешит это имя в IP-адрес(а) и добавит их в список. Это сильно помогло, так как можно было просто добавить, например, youtube.com в список, надеясь, что трафик отфильтруется автоматически.
Но это не сработало, потому что yt, fb и другие используют так называемую CDN (Content Delivery Network) для доставки контента и используют основной домен только для веб-интерфейса. Кроме того, эти CDN обычно географически распределены по всему миру, чтобы предоставлять пользователям самые близкие серверы. Именно эти хостнеймы и IP-адреса CDN нам и нужно выделять, чтобы помечать/фильтровать/ограничивать трафик, идущий к ним или от них.
Проблема:
Нужно найти способ автоматически обновлять все IP-адреса CDN (добавлять их в список адресов), чтобы мы могли помечать/фильтровать/ограничивать трафик, идущий с этих адресов и на них.
Если взглянуть на запрос видео на YouTube, мы увидим, что доставка контента обычно происходит через CDN сети с доменом “googlevideo”. В списке подключений обычно видны такие хосты (в зависимости от страны):
r5.sn-ncc-cxbe.googlevideo.com
r15.sn-c0q7lnek.googlevideo.com
r5.sn-4g5ednsl.googlevideo.com
Очевидно, что поддомены предсказать сложно (наверное, специально, чтобы усложнить блокировку сервиса). Но одно предсказать можно — это домен googlevideo.com. Аналогичная ситуация с Facebook и другими крупными игроками.
Одно из возможных решений:
Нам бы хотелось автоматизировать обнаружение всех таких хостов на CDN, которые посещают наши пользователи. Можно было бы прослушивать HTTP-запросы к youtube.com и смотреть, какие CDN хосты предлагаются для доставки контента, но это требует много ресурсов процессора и к тому же сейчас многие сайты работают по HTTPS, из-за чего такой подход не работает.
Другой способ — прослушивать DNS-запросы к хостам CDN и получать нужные нам хостнеймы/IP-адреса. Проблема в том, что наши пользователи могут использовать публичные DNS-серверы (например, 8.8.8.8 от Google), и тогда нужно слушать весь DNS-трафик, чтобы выявить новые хосты CDN. Обработка такого трафика тоже требует ресурсов процессора.
Если только перенаправить все DNS-запросы через свой DNS-сервер, который запущен на роутере. Тогда роутер будет выступать в роли DNS-сервера для наших пользователей, независимо от того, какой публичный DNS они выберут. Это обеспечит постоянное обновление кэша DNS с актуальными хостами CDN, которые используют наши пользователи.
Минус такого подхода — повышенная нагрузка на процессор из-за обработки увеличенного DNS-трафика, с которым роутеру придется работать.
Короче, решать можно так:
Сначала перенаправляем все DNS-запросы на наш DNS-сервер, который запущен на роутере:
/ip firewall nat
add disabled=no chain=dstnat protocol=udp dst-port=53 action=redirect to-ports=53
add disabled=no chain=dstnat protocol=tcp dst-port=53 action=redirect to-ports=53
Создаём простой скрипт, который будет фильтровать все записи в DNS-кэше, искать нужные нам, например “googlevideo.com”, и обновлять наш список адресов с названием “social”:
:foreach i in=[/ip dns cache find name~"googlevideo.com"] do={
:do {
/ip firewall address-list add list=social address=[/ip dns cache get $i name];
} on-error={}
}
Часть /ip dns cache find name~"googlevideo.com" ищет все записи в кэше, в которых есть “googlevideo.com”.
Далее мы перебираем найденные записи с помощью foreach и добавляем каждое имя в наш список адресов “social”.
Обратите внимание на блок “on-error” в конце строки — начиная с версии 6.2, в RouterOS скриптах появилась возможность обрабатывать ошибки во время выполнения. Это нужно, чтобы роутер не останавливался, если встречается дублирующая запись в списке адресов. Именно поэтому у нас двойное “do”.
Теперь можно помечать/фильтровать/ограничивать все пакеты, приходящие с этих IP или идущие на них.
Если у вас есть идеи, как улучшить это решение, оставляйте комментарии.
