Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Отмечайте трафик для YouTube, Facebook и других.

    Отмечайте трафик для YouTube, Facebook и других.

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Отмечайте трафик для YouTube, Facebook и других., RouterOS
     
    mladen074
    Guest
    #1
    0
    10.12.2017 11:29:00
    Всем привет, я нашёл простой способ помечать трафик, связанный с 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 или идущие на них.  

    Если у вас есть идеи, как улучшить это решение, оставляйте комментарии.
     
     
     
    pegasus123
    Guest
    #2
    0
    22.01.2019 10:34:00
    лол, это не бесполезно, ты бы так же сделал. Отметь все IP-адреса, которые использует *googlevideo.com, и добавь их в адресный список. Также используй queue tree, чтобы ограничить пропускную способность, пометь эти пакеты и с помощью queue tree ограничь скорость.
     
     
     
    ivicask
    Guest
    #3
    0
    22.01.2019 10:45:00
    Но это ПРОСТО НЕ РАБОТАЕТ. Всё очень просто. add action=add-dst-to-address-list address-list=YOUTUBE_SERVER address-list-timeout=12h chain=prerouting protocol=tcp tls-host=*.googlevideo.com Он выбирает какие-то IP, но это не тот видеопоток, который я получаю с YouTube.
     
     
     
    pegasus123
    Guest
    #4
    0
    22.01.2019 11:59:00
    Это должно быть первым правилом в твоём аппарате для мяса. У меня работает идеально.
     
     
     
    ivicask
    Guest
    #5
    0
    22.01.2019 12:16:00
    Это первое правило, и к этому моменту в списке адресов уже 26 IP, но ни один из них не совпадает с тем, с которого я получаю видео.
     
     
     
    sebastia
    Guest
    #6
    0
    22.01.2019 12:17:00
    Возможно, Google использует дополнительную структуру DNS. С каких IP-адресов идет поток? Какой это домен? Ты можешь внести свой вклад в обсуждение.
     
     
     
    ivicask
    Guest
    #7
    0
    22.01.2019 12:34:00
    Я понял, дело в том, что на самом деле для меня стриминг идёт по UDP, а я пытался использовать TCP, поскольку TLS matcher требует именно его — понятно, что ничего не работало. Я добавил этот скрипт в свой планировщик, который подтягивает DNS-записи googlevideo и добавляет их в адресный список, и теперь всё работает идеально.

    :local myServers { "googlevideo" }
    :local myListName "YoutubeServers"
    :local myTimeout "12:00:00"

    /ip dns cache all {
       :foreach i in=$myServers do={
           :foreach j in=[find where (name~$i)] do={
               :do {
                   :local myName [get $j name]
                   :local myType [get $j type]
                   :local myData [get $j data]

                   :if ($myType = "A") do={
                       :do {
                           /ip firewall address-list add address=$myData list=$myListName comment="DNSCACHE-$i-$myName" timeout=$myTimeout
                       } on-error={
                           :put "DNSCACHE: Ошибка при добавлении $myName $myData $myType"
                       }
                   }

                   :if ($myType = "CNAME") do={
                       :local currentName $j
                       :local nextName [find where (name=$myData && type="CNAME")]

                       :while ($nextName != "") do={
                           :set currentName $nextName
                           :resolve $currentName
                           :set nextName [find where (name=[get $nextName data] && type="CNAME")]
                       }

                       :resolve [get $currentName data]

                       :foreach k in=[find where (name=[get $currentName data] && type="A")] do={
                           :set myData [get $k data]
                           :do {
                               /ip firewall address-list add address=$myData list=$myListName comment="DNSCACHE-$i-$myName" timeout=$myTimeout
                           } on-error={
                               :put "DNSCACHE: Ошибка при добавлении $myName $myData $myType"
                           }
                       }
                   }
               } on-error={
                   :put "DNSCACHE: Запись отсутствует"
               }
           }
       }
    }
     
     
     
    anav
    Guest
    #8
    0
    22.01.2019 12:37:00
    Мне стоит сказать, что я всё ещё работаю над самым оптимальным кодом, и ниже вы найдёте его текущую версию. Возможно, он не совсем ловит весь трафик, но это попытка сделать всё эффективнее и настроить точнее. Попробуйте этот вариант и проверьте, даст ли он лучшие результаты...

    /ip firewall mangle  
    {youtube}  
    add chain=prerouting action=jump jump-target=moveTOstep 2 dst-port=443 in-interface-list=lan connection-mark=no-mark protocol=tcp tls-host=*.googlevideo.com  
    add chain=prerouting action=jump jump-target=moveTOstep 2 dst-port=443 in-interface-list=lan connection-mark=no-mark protocol=tcp tls-host=*.youtube.com  

    {netflix}  
    add chain=prerouting action=jump jump-target=moveTOstep 2 dst-port=443 in-interface-list=lan connection-mark=no-mark protocol=tcp tls-host=*.netflix.com  

    {primevideo}  
    add chain=prerouting action=jump jump-target=moveTOstep 2 dst-port=443 in-interface-list=lan connection-mark=no-mark protocol=tcp tls-host=*.primevideo.com  

    {spotify}  
    add chain=prerouting action=jump jump-target=moveTOstep 2 dst-port=443 in-interface-list=lan connection-mark=no-mark protocol=tcp tls-host=*.spotify.com  

    Второй шаг:  
    /ip firewall mangle  
    add action=add-dst-to-address-list address-list=Streaming_users chain=moveTOstep2 address-list-timeout=12h passthrough=yes  
    add action=mark-connection chain=moveTOstep2 dst-address-list=Streaming_users in-interface-list=lan connection-mark=no-mark new-connection-mark=markStreamers passthrough=yes  
    add action=mark-routing chain=moveTOstep2 connection-mark=markStreamers new-routing-mark=routeStreamers passthrough=no
     
     
     
    pegasus123
    Guest
    #9
    0
    22.01.2019 12:39:00
    Да, хорошая штука, я заметил, что когда ты используешь мобильное приложение, оно использует UDP 443 вместо TCP. Для десктопа, насколько я понимаю, протокол Google QUIC по умолчанию отключён, поэтому там работает TCP (там, где работает только tls-host).
     
     
     
    mkx
    Guest
    #10
    0
    22.01.2019 12:45:00
    Разве один пузырь с dot-com уже не слишком много? Или primevideo.com (один .com) — это совсем другая история?
     
     
     
    ivicask
    Guest
    #11
    0
    22.01.2019 12:52:00
    Поток идет на мой ПК с Windows 10 (Chrome) по протоколу UDP. Скрипт выше работает отлично, только маленькая проблема — его нужно запускать в цикле, и может быть небольшая задержка перед тем, как он начнет ловить новый IP, в зависимости от времени цикла, которое вы зададите в планировщике. Сейчас я поставил на 1 минуту.
     
     
     
    anav
    Guest
    #12
    0
    22.01.2019 13:15:00
    Спасибо, mkx, исправил опечатку. Чем твой скрипт (ivicask) отличается от того кода, что есть у меня? Можно ли как-то встроить его, если я что-то упускаю? И ещё, исходя из этого, нужно ли нам добавлять правило для UDP для каждого случая?

    [Редактирование: после публикации прояснилось, что это не работает для UDP, и затронутые дополнения выделены курсивом, потому что зачёркивание, похоже, тут не поддерживается]

    /ip firewall mangle {youtube}  
    add chain=prerouting action=jump jump-target=moveTOstep 2 dst-port=443 in-interface-list=lan connection-mark=no-mark protocol=tcp tls-host=.googlevideo.com  
    _add chain=prerouting action=jump jump-target=moveTOstep 2 dst-port=443 in-interface-list=lan connection-mark=no-mark protocol=udp tls-host=.googlevideo.com_  
    add chain=prerouting action=jump jump-target=moveTOstep 2 dst-port=443 in-interface-list=lan connection-mark=no-mark protocol=tcp tls-host=.youtube.com  
    _add chain=prerouting action=jump jump-target=moveTOstep 2 dst-port=443 in-interface-list=lan connection-mark=no-mark protocol=udp tls-host=.youtube.com_
     
     
     
    ukitnam
    Guest
    #13
    0
    12.01.2019 14:51:00
    Хорошо. Но нам нужно запускать это по расписанию? Если да, нужно ли очищать предыдущий список адресов? Насколько часто рекомендуется запускать это по расписанию?
     
     
     
    anav
    Guest
    #14
    0
    12.01.2019 15:06:00
    Итак, пример ловит google.video.com, а что насчёт всех тех, что мы не знаем?
     
     
     
    neutronlaser
    Guest
    #15
    0
    12.01.2019 19:31:00
    Смотрите https://www.youtube.com/watch?v=XkKj9rj4quQ&feature=youtu.be&t=1511 для полезной информации.
     
     
     
    sebastia
    Guest
    #16
    0
    12.01.2019 22:18:00
    Интересный подход. Нужно просто определить самые базовые структуры имён, которые используются для стриминга.
     
     
     
    pegasus123
    Guest
    #17
    0
    14.01.2019 13:16:00
    В firewall mangle я просто использую tls-host, чтобы определить, если это *.googlevideo.com, и записываю это в адресный список. После этого могу ограничивать скорость. А вот с Facebook не уверен.  
    add action=add-dst-to-address-list address-list=YOUTUBE address-list-timeout=12h chain=forward comment="add youtube to address list" dst-port=443 packet-mark=no-mark protocol=tcp tls-host=*.googlevideo.com
     
     
     
    anav
    Guest
    #18
    0
    18.01.2019 21:23:00
    Pegasus, это рабочее приложение твоей идеи?

    Контекст: Нужно сделать так, чтобы пользователи, заходящие на YouTube, отправлялись через второе WAN-соединение. Для правильного определения трафика, идущего на YouTube, скорее всего, требуется манглирование/маркировка в каком-то виде. Обычно это двухэтапный процесс. Первый шаг — отметить подключения к YouTube, второй — применить к этому трафику правило маршрутизации (маркирование подключения более эффективно, потому что мы маркируем само подключение, и тогда метка распространяется на все пакеты).

    К счастью, у MT теперь есть опция tls-host, которая помогает с тем, что сейчас основной трафик — HTTPS!

    Первый шаг — найти пользователей, которые пытаются зайти на YouTube, и добавить адреса назначения в список адресов фаервола.

    /ip firewall mangle add action=add-dst-to-address-list address-list=youtube_users address-list-timeout=12h chain=prerouting dst-port=443 in-interface-list=lan connection-mark=no-mark protocol=tcp tls-host=*.googlevideo.com passthrough=yes

    /ip firewall mangle add action=add-dst-to-address-list address-list=youtube_users address-list-timeout=12h chain=prerouting dst-port=443 interface-list=lan connection-mark=no-mark protocol=tcp tls-host=*.youtube.com passthrough=yes

    /ip firewall mangle add action=mark-connection chain=prerouting dst-address-list=youtube_users in-interface-list=lan connection-mark=no-mark new-connection-mark=markUtube passthrough=yes

    /ip firewall mangle add action=mark-routing chain=prerouting connection-mark=markUtube new-routing-mark=routeUtube passthrough=no

    Проще говоря, роутер смотрит на пакеты без меток — то есть, это делается до того, как трафик отправится куда-либо (он ещё не маршрутизирован и не идет напрямую), но уже приходит на любой из интерфейсов, попадающих в «in-interface-list». Если пакет без меток, с портом назначения 443 и с доменным идентификатором youtube.com, то соответствующий адрес назначения подключения добавляется в нужный список адресов.

    Следующий шаг — правило:

    Если пакет без меток, порт назначения 443 и домен googlevideo.com, соответствующий адрес тоже попадает в список адресов.

    После этого роутер ищет подключения с адресом назначения из нашего списка (список пополнен правилами выше). Настроено так, чтобы смотреть только на новые подключения без меток, чтобы не трогать уже помеченный трафик.

    Роутер маркирует подключение меткой markUtube, и все связанные с ним пакеты автоматически получают эту метку и уже не проверяются дальше.

    Далее по правилу:

    Роутер смотрит на любое подключение с меткой markUtube и назначает этому подключению ещё одну метку — маршрутизационную mark routing.

    После этого говорим роутеру, что подходящих правил маркировки больше нет.

    Как использовать эту специальную метку маршрутизации в правилах IP Route? Пользуемся опцией Routing mark (см. в winbox).

    ++++++++++++++++++++++++++++++++++++++++++++

    Простой пример переключения резерва (failover):

    /ip route add check-gateway=ping distance=2 gateway=IP_шлюза_WAN2 (предполагает/соответствует дефолтному маршруту 0.0.0.0/0 при использовании winbox)

    add distance=3 gateway=IP_шлюза_WAN1 (тоже для дефолтного маршрута)

    /ip route add distance=1 gateway=IP_шлюза_WAN1 routing-mark=routeUtube

    Сложный пример рекурсивного failover:

    /ip route add check-gateway=ping distance=2 gateway=8.8.4.4

    /ip route add distance=2 dst-address=8.8.4.4/32 gateway=IP_шлюза_WAN2

    /ip route add distance=3 gateway=IP_шлюза_WAN1

    /ip route add distance=1 gateway=IP_шлюза_WAN1 routing-mark=routeUtube

    Есть три момента, в которых я не уверен:

    Нужно ли явно указывать distance=1, чтобы пользователи, подключающиеся к YouTube, выходили через второе WAN, или достаточно правила маркировки?

    Стоит ли использовать no-mark пакеты в первом мангле или лучше оставить no-mark подключения — что эффективнее/оптимальнее/точнее?

    Нужно ли здесь использовать jump chain правила?

    И я не уверен, правильно ли я использовал passthrough?
     
     
     
    pegasus123
    Guest
    #19
    0
    21.01.2019 05:35:00
    @anav, я не совсем уверен в твоей настройке, так как у меня сеть простая. Но, думаю, ты движешься в правильном направлении. Тебе нужно предварительно поставить метку (Mangle) на любые tls-host=* googlevideo.com, чтобы потом обработать это в QUEUE. Поскольку у тебя есть метка в таблице prerouting, ты можешь создать правило для выхода через WAN1 или WAN2, как ты и говорил, основываясь на этой метке Mangle. Обрабатывай скорость в queue tree.
     
     
     
    ivicask
    Guest
    #20
    0
    22.01.2019 09:58:00
    Я также пытался настроить контроль трафика YouTube через это, но это абсолютно не работает. Хост TSL в этом случае совершенно бесполезен и не определяет реальный IP видеопотока. *.googlevideo.com и *.youtube.com дают мне около 4 IP в списке адресов, но когда я запускаю видео на YouTube, оно приходит с какого-то другого IP, который я не знаю, как определить и обработать.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры