Static DNS и VPN. Проблемы с кэшем и туннелированием

Обсуждение ПО и его настройки
taravasya
Сообщения: 8
Зарегистрирован: 11 янв 2024, 22:03

Здравствуйте!
Имею VPS в Нидерландах. Там поднят сервер pptp. Направляю трафик через VPN выборочно, только нужные домены со всеми поддоменами.
Инструкций с подобным моему конфигом, для выборочного обхода блокировок, в интернете достаточно много.
Настройки примерно такие:

Таблица пакетов:

Код: Выделить всё

/routing table add name=vpn1_mark fib
Разрешаем клиентам ходить через vpn интерфейс:

Код: Выделить всё

/ip firewall nat add action=masquerade chain=srcnat out-interface=vpn1-out src-address=192.168.0.0/24
Добавление нужных доменов в address-list:

Код: Выделить всё

/ip dns static add name=somedomain1.com type=FWD forward-to=8.8.8.8 address-list=vpn1_list match-subdomain=yes
/ip dns static add name=somedomain2.com type=FWD forward-to=8.8.8.8 address-list=vpn1_list match-subdomain=yes
Маркировка пакетов из списка адресов:

Код: Выделить всё

/ip firewall mangle add action=mark-routing chain=prerouting dst-address-list=vpn1_list new-routing-mark=vpn1_mark passthrough=no
Маршрутизация в VPN:

Код: Выделить всё

/ip route add distance=1 gateway=vpn1-out routing-table=vpn1_mark
На первый взгляд всё работает нормально. Основная задача - использовать те ресурсы, которые блокируют моё подключение по географическому признаку, и при запуске приложения или открытии страницы в браузере - задача полностью выполняется. Я получаю доступ к нужным ресурсам и пакеты идут через интерфейс VPN. Но есть одна неочевидная проблема. Например, если открыть страницу в браузере и потом какое-то время не использовать её, то при следующем её обновлении, пакеты НЕ идут через интерфейс моего VPN-подключения и соединение блокируется ресурсом (ошибка 403). Или в том случае когда ресурс блокируется провайдером, то просто теряется соединение с этим ресурсом ("сайт слишком долго не отвечает").

Пробовал несколько браузеров и нескольких разных компьютеров в этой же сети. Везде поведение одинаковое.
Помогает перезапуск браузера.

Было предположение, что проблема в том, что по неизвестной причине, после какого-то времени пакеты перестают маркироваться в

Код: Выделить всё

/ip firewall mangle
. Однако, множество экспериментов, свидетельствуют о том, что проблема как минимум так же связана с кешем dns, или вовсе полностью зависит от него. В первую очередь об этом свидетельствует то, что если при открытой странице в браузере, очистить кеш dns в микротике, то при обновлении страницы, я получаю 403ю ошибку.

То, что пакеты "сбиваются с пути" и начинают идти не через интерфейс vpn, а напрямую через моего провайдера, чётко фиксируется при трассировке.
Список доменов необходимых для нормальной работы ресурсов изучен и обкатан в другой сети, где рулит keenetic c dnsmasq. Там такой проблемы нет.

Подскажите куда копать? Что я мог упустить?
Спасибо.


taravasya
Сообщения: 8
Зарегистрирован: 11 янв 2024, 22:03

Более-менее разобрался с причинами моей проблемы. Странно, что никто ранее не отмечал её. Расклад такой.

После того, как я в первый раз открываю в браузере заблокированную страницу, домен которой есть в /ip dns static. этот домен попадает в DNS Cache и ip этого домена, помещается в address-list. Далее, согласно правилу в /ip firewall mangle, пакеты этого домена маркируются(потому что домен есть в address-list) и маркированные маршрутизируются в VPN.
Как и указано в мануале, ip остаётся в address-list до тех пор, пока запись о домене хранится в кэше dns роутера. По прошествии времени TTL, запись о домене удаляется из кэша DNS и соответственно ip адрес удаляется из address-list.
И вот в данный момент, браузер имея уже резольвенный ip-адрес для искомого домена, не запрашивает его у роутера. А значит, не выполняется вся описанная выше цепочка, что в конечном счёте означает, что пакеты не маркируются и не маршрутизируются в VPN.
Получается, что любое приложение, которое кеширует результат резольва dns и не запрашивает его при каждом обращении к домену, "обречено" через время потерять настроенный маршрут. И судя по всему, решения нет никакого, кроме как использовать в address-list записи доменов "по старинке".

Или может всё таки есть какие -то идеи? Получается надо или увеличивать TTL до суток, или может быть в address-list использовать Timeout, на те же сутки. Если я правильно понял, пока в Timeout "тикает" время, запись остаётся активной?


gmx
Модератор
Сообщения: 3323
Зарегистрирован: 01 окт 2012, 14:48

А чем не устраивает адрес лист "по старинке"???

BGP может поможет?? Не рассматривали?


taravasya
Сообщения: 8
Зарегистрирован: 11 янв 2024, 22:03

> адрес лист "по старинке"???
Не устраивает сразу по нескольким причинам. Но в первую очередь тем, что там надо указывать все поддомены, а в случае с cdn, конкретно cloudflare, с которым я имею дело, отследить их все - нереально. Они как калейдоскоп.

> BGP может поможет??
BGP это значит чужой список, охватывающий большой массив адресов, в который часто попадает, то, что не должно туда попадать. На хабре есть конкретный пример, в результате применения BGP "под.раздачу" попал и сам хабр (точнее его подсеть) ))
А мне для всех моих хотелок, достаточно 25-30 доменов с их поддоменами. Дома настроил и забыл это ещё год назад(в кинетик). А на работе всё прыгаю с бубном. Раньше нельзя было с поддоменами, а теперь вроде как можно, но по факту не очень.


svetogor82
Сообщения: 167
Зарегистрирован: 17 апр 2014, 10:44

а не проще все адреса cloudflare в address-list прописать ?


taravasya
Сообщения: 8
Зарегистрирован: 11 янв 2024, 22:03

>> все адреса cloudflare в address-list прописать ?
А где-то есть такой список где есть "все адреса"? А когда новые появляются(а они появляются), что делать? Про BGP уже выше написал, почему он мне не подходит.
Проще всего, было бы сменить роутер на кинетик, потому что там нет этой проблемы и есть весь остальной необходимый мне функционал... Но зачем то же в функционал ROS добавили возможность динамически резольвить домены и добавлять результаты в список? Я определённо вижу, что либо я где-то недочитал как правильно этим воспользоваться, либо этот функционал просто недопилили.


svetogor82
Сообщения: 167
Зарегистрирован: 17 апр 2014, 10:44

я формирую список cloudflare на linux потом раздаю mikrotik


taravasya
Сообщения: 8
Зарегистрирован: 11 янв 2024, 22:03

В конечном итоге остановился на компромиссном для меня решении. Отказался от использования форвардинга статических DNS записей, в пользу простого правила:

Код: Выделить всё

/ip firewall raw add chain=prerouting action=add-dst-to-address-list in-interface=bridge1 content=somedomain1.com address-list=vpn1_list address-list-timeout=none-dynamic
Благодаря такому правилу, так же становится возможно добавить результаты всех DNS запросов касаемых указанного в этом правиле домена(и что важно всех его поддоменов) в мой address-list.
Однако, такой метод, по моим наблюдениям прилично грузит процессор роутера, а значит он не годится для крупных сетей и интенсивной работы. В моём случае (внутри сети 3-4 клиента и необходима выборочная маршрутизация для пары десятков доменов), он вполне приемлем.

Для нормального решения подобной задачи, считаю необходимым, чтобы разработчики из микротик, доделали то, что начали, и добавили в правилах форвардинга статических DNS-записей, опцию timeout, в которой можно было бы указать какой-то конкретный срок или сделать его динамическим(хранимым до перезагрузки роутера).
Может здесь есть кто-то кто имеет возможность обратиться к разработчикам микротик по этому поводу... :ti_pa: а то:
https://www.youtube.com/watch?v=WCCz7kOc-zk

В итоге настройки выборочного роутинга у меня выглядят так:

Код: Выделить всё

/routing table add name=vpn1_mark fib
/ip firewall nat add action=masquerade chain=srcnat out-interface=vpn1-out src-address=192.168.0.0/24
/ip firewall raw add chain=prerouting action=add-dst-to-address-list in-interface=bridge1 content=somedomain1.com address-list=vpn1_list address-list-timeout=none-dynamic
/ip firewall raw add chain=prerouting action=add-dst-to-address-list in-interface=bridge1 content=somedomain2.com address-list=vpn1_list address-list-timeout=none-dynamic
/ip firewall mangle add action=mark-routing chain=prerouting dst-address-list=vpn1_list new-routing-mark=vpn1_mark passthrough=no
/ip route add distance=1 gateway=vpn1-out routing-table=vpn1_mark
Понятное дело, для каждого домена, потребуется отдельное правило RAW


-13-
Сообщения: 125
Зарегистрирован: 18 мар 2021, 12:45

3 и 4 правила у Вас, я использую в таком формате
 добавление в addr-list

Код: Выделить всё

add action=add-dst-to-address-list address-list=SanctionsSites \
    address-list-timeout=1h chain=prerouting dst-port=443 log-prefix=\
    "Raw 7.1.1" protocol=tcp tls-host=*.spotify.com
особой нагрузки на проц не замечено, оборудование hEX S


taravasya
Сообщения: 8
Зарегистрирован: 11 янв 2024, 22:03

-13- писал(а): 05 мар 2024, 15:05 3 и 4 правила у Вас, я использую в таком формате
:-ok-: Спасибо большое! Действительно, судя по индикации загрузки процессора в winbpox-е, нагрузка значительно ниже.
Есть правда проблема с некоторыми доменами.
 Например:
spotifycdn.com, filmix.biz, ipinfo.io,rutracker.org и другие
Они в какую не хотят ходить через нужный мне интерфейс. И счётчик пакетов в raw правилах для этих доменов стоит на нуле. Причём это касается обоих способов и моего и Вашего.
При использовании статичной записи домена в адрес-листе заворачиваемом в vpn, пакеты послушно идут в vpn.
Правил с action fasttrak - нет.
Use peer dns в интерфейсе провайдера отключён.
DNS сервера в роутере прописаны сначала гугловские, потом яндексовские. При этом сам гугловский адрес (dns.google) статично прописан в адрес-листе заворачиваемом в vpn.
Что ещё может являться причиной такого поведения для некоторых из доменов?
По списку доменов, кажется не работают те - чьи ресурсы блокирует наш провайдер.


Ответить