Comments 98
Выбрал полный список, прилетело 100к+ маршрутов. Mikrotik CCR1009 впал в ступор(с отвалом WinBox) на 2 минуты потом полет нормальный.
Там, кстати, неочевидно — список subnet в любом случае имеет смысл забирать тоже, пусть вместе со списком хостов. Потому что они не полностью взаимно перекрыты. Т.е. в вашем случае лучше ставить первую и третью галки.
Там все равно баны и разбаны по одним и тем же подсетям идут, к тому же не известен «лаг провайдера», как быстро он получает и применяет правила.
Т.е.
Клиент: rutracker.org?
Сервер: rutracker.org? 195.82.146.214! 10.224.0.1→195.82.146.214
Клиент: rutracker.org→10.224.0.1
Такой способ работает с «неправильными» DPI, которые блокируют всю доменную зону целиком, а не только заблокированный домен (блокируется *.domain.com, если в реестре есть только domain.com, такое, например, у Yota), работает с доменами, которые ротируют IP-адреса с целью обхода блокировок, а также не создает проблем при частом обновлении адресов.
Можно, если vpn со статикой, делать пиринг прямо через туннель, с того адреса (для этого надо сначала статикой прописать маршрут на сервис через туннель). А вот если ни там, ни там — тогда печаль.
Что может быть?
А вот зачем загружать себе список отдельных IP — «шоб было», because I can?
Технически даже если, скажем, в черном списке один адрес из /24 подсети, а трафик полетит через ВПН для всей этой подсети, сильно большой проблемы, наверняка, не будет. Зато маршрутизатору будет полегче, факт.
Хотя я понимаю владельцев CCR1009 железок: имея (при такой-то цене!) 2 Гб ОЗУ, прямо уже не знаешь, на что их потратить еще (там FV помещается много десятков раз, не то что список блокировок. Но — чем больше список, тем больше вынужден «думать» над ним ЦП роутера, а это не всегда то, за чем следует гнаться).
Пользуясь случаем: никто не знает, что за туннельный брокер ipv6.ip4market.ru? Очень они вовремя появились!
Про брокера — есть такая компания, торгует адресами по ценам повыше рынка. На хайпе решили использовать часть своего пула IPv6 для такого вот сервиса. У всех брокеров 6in4 не рядом с тобой одна проблема — резкий рост латентности, потому что оно сначала должно по v4 до него долететь, а уже потом начинается выбор оптимальных маршрутов и прочие вкусности. Если вы недалеко от их точки терминации — удобно. Мне 75 мс до них, долго.
Посмотрим, конечно. Тут иначе как опытом не проверить.
Кстати, недавно вышедший hap ac2 тоже прекрасно справляется с более 100 тыс. префиксов. Загрузка процессора кроме момента обновления префиксов (около 6 секунд) стабильно в районе нуля. А еще списки 1+3 при честной суммаризации дают уже ~84 тыс. префиксов = почти 20% сжатие «без потерь», что тоже несколько ресурсы разгружает
У Микротиков BGP обрабатывается одним ядром, так что, грубо говоря, важна не многоядерность, а именно «тупая» вычислительная сила одного ядра. В hAP AC2 в проце 4 ядра, на частоте 716 Мгц, и 128 Мб ОЗУ, а у более старых моделек было одно ядро и 600 Мгц частоты, и 128 же Мб ОЗУ — в этом смысле hAP не сильно быстрее старых машинок (если не учитывать, возможно, разную архитектуру процов и скорость ОЗУ). По практике так и есть, 951 девайс жует таблицу те же несколько секунд.
Попробовал, действительно всё поднялось почти мгновенно.
Единственное, что расстраивает — на микротике все эти адреса идут вперемешку с собственными маршрутами и банально мешаются. Да, можно отфильтровать BGP маршруты, но это тоже не то.
Сейчас на микротике использую AddressList, mark routing/connection + routing mark в таблице маршрутизации. Но у меня в bypass'е в VPN настроено буквально десяток адресов тех ресурсов, которые мне нужны.
Никто не в курсе, насколько вариант с маркировкой mark connection кушает больше ресурсов по сравнению с прогрузкой таблицы маршрутизации для VPN bypass'а? У меня относительно старый RB951G, но его до сих пор хватает на все задачи (кроме WiFi 5G, которого у него нет).
Поднять VPN сервер, на нём выдавать статические серые IP адреса и поднимать пиринг с этими адресами. Через VPN пропускать только BGP трафик до роутера.
В этом случае клиент с динамическим белым или даже с динамическим серым IP сможет воспользоваться этим сервисом:
— одна VPN сессия для поднятия BGP сессии
— вторая VPN сессия для терминации трафика через альтернативный маршрут
Красивым решением было бы переписать часть кода bird, чтобы он просто устанавливал BGP сессию с любым ее запросившим динамически, так, как будто она уже сконфигурирована. Однако тут моих способностей точно не хватит.
Если попадется грамотный сишник, желающий поучаствовать — допилим.
Проблему владельцев динамики этот вариант решит, да. Но не уверен, что она настолько массовая, чтобы строить такие конструкции. Неизящно и много шевелений с клиентской стороны требует, а значит и квалификации.
Очень даже массовая. Физикам крайне редко бесплатно дают статические белые IP адреса. Либо плати денежку, либо опция вообще не предусмотрена.
Дома я плачу 150 руб/мес за статический IP, у родителей провайдер вообще не предоставляет такой опции.
Красивым решением было бы переписать часть кода bird, чтобы он просто устанавливал BGP сессию с любым ее запросившим динамически, так, как будто она уже сконфигурирована.
Можно сделать финт — ловить все попытки установления сессии (да хоть wireshark'ом декодировать пакет) и на их основе прописывать пира в конфиге bird'а.
Клиент же постоянно делает повторные попытки переподключения.
В пассивном режиме прослушивать трафик tshark'ом и им же декодировать в любом удобном формате (можно нужные поля в тексте, можно даже в JSON'е).
Отдельным скриптом-демоном принимать входящий поток, вытаскивать оттуда IP адрес пира и проверять наличие пира в конфиге bird'а. Если пира нет, то добавлять в конфиг и делать bird'у reload.
Сейчас у вас уже есть скрипт, который добавляет пира в конфиг bird'а на основе HTTP запроса на страницу, нужно будет его буквально совсем чуть-чуть модифицировать и всё готово :)
Для таких клиентов, очевидно, выбирать, что именно анонсировать, не получится, поэтому для них будет дефолтный номер AS и дефолтный набор из суммаризованных хостов+подсетей.
/ip route
# роутить трафик до своего VPS напрямую (мой случай когда VPS не заблокирован, но прилетает подсеть /19 от BGP)
add distance=1 dst-address=YOU_VPS_IP/32 gateway=rostelecom
# путь до antifilter.download чтобы зарегить пир BGP
add comment=antifilter distance=1 dst-address=192.3.134.152/32 gateway=ovpn-linode
# добавить hold-time=4m для соответствию удаленному пиру и чтобы в лог ошибки не валились
/routing bgp peer
add hold-time=4m in-filter=bgp_in multihop=yes name=antifilter remote-address=192.3.134.152 remote-as=65432 ttl=default
чтобы при поднятии туннеля дергать его с микротика например так:
/tool fetch antifilter.download/add_me_to_peers/?list=2&list=1&key=blabla
и добавлять IP в пиры bird
а в самом микротике при поднятии vpn
/routing bgp instance set default router-id=VPN-IP
конечно тут нужно отслеживать поднятие туннеля и поиск VPN-IP — но это решаемо
Если же вы про то, что при падении одного провайдера вам нужно пириться с другого — так и тут все элементарно просто. Наличие одной AS с противоположной стороны никоим образом не мешает, просто вам нужно последовательно настроить отдельные сессии с каждого из ваших IP (например, перекладывая статику на antifilter в разные интерфейсы). Тогда одна из сессий всегда будет поднята. Только включайте периодически другие адреса (опять же, можно статикой), потому что настройки пиров, с которыми сессий не было более 3 месяцев, будут удаляться.
Я не говорю что данная конфигурация не жизнеспособна. Она не жизнеспособна в моём конкретном случае.
Опишите подробнее пример, какая именно ситуация у вас не реализуется?
3 uplink
1 ovpn tunnel
Это основной маршрутизатор.
За ним клиенты будут ходить по Вашей схеме — почти без проблем, ну некоторые адреса всё равно не открываются. Мелочи, подмену DNS в этом случае ни кто не отменял (при условии глубокого dpi)
Но, при вашей схеме сам рутер не может отрезолвить нужные параметры и уйти через нужные маршруты, ибо в прерутинге нет понятия префикса. Через адреслист — проблем нет, прерутинг работает. И ни одного сбоя по проблемным сайтам. Заворачивает как надо. Причём, я смотрю лог маршрутизации, да, он уходит куда надо, в нужный интерфейс, но тут-же прилетает ответ от провайдера, что ресурс закрыт. При использовании адреслиста такой проблемы нет.
Ради хохмы (чтоб убедиться что я не накосячил) поднял разные BGP сессии на свои сервера. И, как я и говороил, при наличии 2-х и более провайдеров просто необходимо использовать несколько пиров. Просто так префиксы не передать. И сам маршрутизатор не будет ходить на заблокированные адреса.
Проблемы с операторской подменой DNS решаются использованием внешних DNS-серверов (гугл, cf и т.п.) и обязательным заворачиванием их в туннель, прямо статикой.
Вопрос про «несколько пиров» мне пока тоже непонятен, я не могу разобраться, что у вас не получается с одним пиром. Конечно, не разделяя контексты маршрутизации, вы не можете поднять к одному и тому же IP две одновременных сессии с двух разных адресов — но тут ключевое слово «одновременных», а в этом применении одновременность не особо важна, время схождения BGP можно и потерпеть. Мало того, если у вас один ovpn-туннель — вы можете просто поднимать сессию с внешнего адреса туннеля (у вас же там NAT), так что при перекладывании туннеля на другого оператора у вас даже BGP развалиться не успеет.
/ip firewall mangle
add action=mark-routing chain=prerouting dst-address-list=ddosed new-routing-mark=ddoser-route-mark passthrough=no src-address-list=ddoser
add action=mark-routing chain=output comment="Telegram (router) throuth Tor" dst-address-list=tor-traff log-prefix=telega new-routing-mark=to_tor passthrough=no
add action=mark-routing chain=prerouting comment="Email throuth ISP1" dst-port=25 in-interface=WiFi+LAN log-prefix=email new-routing-mark=route_isp_01 passthrough=no protocol=tcp
add action=mark-routing chain=prerouting comment="throuth Tor" dst-address-list=tor-traff log-prefix=tor new-routing-mark=to_tor passthrough=no
add action=mark-routing chain=prerouting comment="throuth Tor" dst-address-list=blocked-addr log-prefix=tor new-routing-mark=to_tor passthrough=no
add action=accept chain=prerouting dst-address=192.168.7.0/24
add action=accept chain=prerouting dst-address=192.168.0.0/24
add action=accept chain=prerouting dst-address=198.51.100.1
add action=mark-connection chain=input comment=PCC connection-state=new in-interface=00.pppoe-ISP01 new-connection-mark=conn_isp_01 passthrough=yes
add action=mark-connection chain=input connection-state=new in-interface=00.pppoe-ISP02 new-connection-mark=conn_isp_02 passthrough=yes
add action=mark-connection chain=input connection-state=new in-interface=09.SXT new-connection-mark=conn_backup passthrough=yes
add action=mark-connection chain=prerouting connection-state=related in-interface=00.pppoe-ISP01 new-connection-mark=conn_isp_01 passthrough=yes
add action=mark-connection chain=prerouting connection-state=related in-interface=00.pppoe-ISP02 new-connection-mark=conn_isp_02 passthrough=yes
add action=mark-connection chain=prerouting connection-state=related in-interface=09.SXT new-connection-mark=conn_backup passthrough=yes
add action=mark-routing chain=output connection-mark=conn_isp_01 new-routing-mark=route_isp_01 passthrough=yes
add action=mark-routing chain=output connection-mark=conn_isp_02 new-routing-mark=route_isp_02 passthrough=yes
add action=mark-routing chain=output connection-mark=conn_backup new-routing-mark=route_backup passthrough=yes
add action=mark-connection chain=prerouting dst-address-type=!local new-connection-mark=IT39_PCC_1 passthrough=yes per-connection-classifier=both-addresses:2/0 src-address-list=BOGONS
add action=mark-connection chain=prerouting dst-address-type=!local new-connection-mark=IT39_PCC_2 passthrough=yes per-connection-classifier=both-addresses:2/1 src-address-list=BOGONS
add action=mark-routing chain=prerouting connection-mark=IT39_PCC_1 new-routing-mark=IT39_1 passthrough=yes src-address-list=BOGONS
add action=mark-routing chain=prerouting connection-mark=IT39_PCC_2 new-routing-mark=IT39_2 passthrough=yes src-address-list=BOGONS
add action=mark-connection chain=prerouting connection-mark=no-mark new-connection-mark=oTher passthrough=yes
/ip route
add comment="Local IP throught Tor" distance=1 gateway=00.to-Pi routing-mark=to_tor
add distance=1 routing-mark=ddoser-route-mark type=blackhole
add check-gateway=ping comment=PCC distance=1 gateway=00.pppoe-ISP01 routing-mark=route_isp_01
add check-gateway=ping distance=1 gateway=00.pppoe-ISP02 routing-mark=route_isp_02
add check-gateway=ping comment=BACKUP distance=1 gateway=198.51.100.1 routing-mark=route_backup
add check-gateway=arp distance=1 gateway=00.pppoe-ISP01 routing-mark=IT39_1
add check-gateway=arp distance=2 gateway=00.pppoe-ISP02 routing-mark=IT39_1
add check-gateway=arp comment=BACKUP distance=3 gateway=198.51.100.1 routing-mark=IT39_1
add check-gateway=arp distance=1 gateway=00.pppoe-ISP02 routing-mark=IT39_2
add check-gateway=arp distance=2 gateway=00.pppoe-ISP01 routing-mark=IT39_2
add check-gateway=arp comment=BACKUP distance=3 gateway=198.51.100.1 routing-mark=IT39_2
add comment="Local IP to backuplink" distance=1 gateway=198.51.100.1 routing-mark=to_backuplink
add check-gateway=arp distance=1 gateway=00.pppoe-ISP01
add check-gateway=arp distance=2 gateway=00.pppoe-ISP02
add check-gateway=arp distance=3 gateway=198.51.100.1
add distance=1 dst-address=198.51.100.0/24 gateway=198.51.100.1 pref-src=198.51.100.254 scope=10
/ip route rule
add action=lookup-only-in-table dst-address=149.154.167.220/32 interface=00.to-Pi routing-mark=to_tor table=main
add action=lookup-only-in-table routing-mark=ISP1 table=ISP1
add action=lookup-only-in-table routing-mark=ISP2 table=ISP2
При такой конфигурации работает всё.
Когда переделываю на получение префиксов от BGP то работает всё только через того провайдера, на котором поднята BGP сессия, не смотря на то, что я маркирую пакеты от на конкретный маршрут. При поднятии 2-х пируов — всё работает с маркировками.
Поскольку это разные уровни модели — там надо внимательно просчитывать, в какой последовательности маршрутизатором будут приниматься решения о дестинейшне для пакета.
Так что вам лучше либо оставить эту схему и прогружать в нее адрес-листы с сайта через API микротика (тоже вполне себе решение), либо полностью переходить на маршрутизацию на L3 и делать балансировку вариацией nexthop в таблице маршрутизации.
ИМХО:
Идеально было-бы допилить сайт на выдачу скрипта для микротика :) Но это для совсем уж нубов :)
Хостовые адреса — это те, которые РКН пишет в соответствующем поле рядом с доменными именами. Тут есть нюанс, что если у вас этот же хост разрезолвится в другой адрес — трафик к нему пойдет не через туннель и, соответственно, попадет в фильтры вашего провайдера. Но пытаться решить эту проблему на L3 — неэффективно, она уже решается через доступ к хостам через прокси в браузере (всякие там SwitchyOmega и подобные плагины).
Большое спасибо автору, отличный способ!
Единственное: я, конечно, сделал бэкап, но не отказался бы от инструкции по возврату в изначальное состояние.
Чтобы «вообще всё удалить» — соответственно, удалить пир, удалить процесс (там же на закладке instances) и удалить фильтр (Routing — Filters).
Для чистоплотности еще не помешает зайти на сайт и удалить свои настройки, но они и так автоматически удалятся после месяца (в случае ручного создания) или 3 дней (в случае автоматического) простоя.
На закладке IP — Routes должно быть больше этого числа маршрутов, у большинства из которых в столбце Gateway написано «имя вашего интерфейса reachable».
Спасибо. Первая проблема была в State справа должно быть написано Established
, сижу на интернете от МГТС, имею прослойку в виде их роутера, где нужно было прокинуть порт 65432. После этого соединение established и роуты reachable.
Но горшочек не варит :) Например, полностью отваливается https://usher2.club/ и http://isitblockedinrussia.com, discordapp.com, ну и веб-версия Телеграма само собой тоже не работает.
В качестве впн-сервера использую https://github.com/hwdsl2/docker-ipsec-vpn-server, traceroute до чего-либо с микротика через интерфейс впн, показывает, что он в принципе работает.
Буду смотреть дальше.
А что отваливается — тем более странно, isitblockedinrussia.com, например, вообще не попадает под список.
Возможно адрес вашего впн-сервер попадает сам под списки адресов — тогда нужно вручную на него прописать маршрут не в туннель на Микротике.
Совершенно внезапно обнаружил, что в некоторых условиях Mikrotik не пытается восстановить разорванное BGP-соединение. Зависает в статусе open sent и требует перезапуска вручную.
Как оказалось, это известный баг. Ниже ответ саппорта Mikrotik:
Yes, it is a known problem, it tries multiple times except that with each try and failure interval between tries increase. Currently solution for this problem when interval becomes too high is only disable/enable. This will change in ROS v7.
Кое-какие изменения со стороны сервиса для уменьшения влияния проблемы будут внесены. Но если у вас та же история — к сожалению, похоже, что только перезагрузка маршрутизатора сбрасывает этот таймер.
Обещания изменения в ROS v7 — это как про наступление коммунизма. «Жаль только, жить в эту пору прекрасную...»
Сделал скрипт-watchdog, который перезапускает BGP сессию, если там 0 префиксов.
https://gist.github.com/TerAnYu/88c822ea82c621962a9f10c969bd8151
*) bgp — properly update keepalive time after peer restart;
Есть шанс, что проблема решена.
По дефолту в BGP не раздается, чтобы начать получать его — нужно удалить на сайте свои настройки и создать их заново через веб-интерфейс, выбрав при создании соответствующий чекбокс.
Подскажите, чем этот список глобально отличается от вашего. И еще вопрос, вы не планируете добавить возможность сервису antifilter, а именно возможность пользователям подгружать свои кастомные списки IP, что бы они прилетали вместе с вашими списками?
С кастомными списками, насколько я понимаю, очень узкая зона востребованности. Если делать подгружаемые списки «общими» — очень возрастает вероятность саботажа (например, подгрузить свой список с 0.0.0.0/0 и отправить всех пользователей сервиса в туннели полностью). Если делать их доступными только конкретному IP, с которого подгружается — тогда непонятно, зачем они вообще; этому человеку гораздо проще будет вести список на своем роутере, дописывая соответствующие записи статикой в таблицу маршрутизации.
Но если вы видите какой-то другой потенциально более полезный вариант — опишите, можно будет подумать, как его реализовать. В целом основная сложность внедрения лежит в необходимости некоего «личного кабинета пользователя», где будет заложена логика управления этими кастомными списками. Добавить анонсирование готовых списков к конкретным пирам нетрудно.
log stderr all;
router id 127.0.0.127;
protocol bgp antifilter {
neighbor 192.3.134.152 as 65432;
import all;
export none;
local as 64999;
hold time 240;
multihop;
next hop self;
}
protocol kernel {
import none;
export all;
}
При этом я получаю во-первых:
# bird -d
2018-12-30 20:54:07 <INFO> Started
2018-12-30 20:54:07 <ERR> KRT: Received route 0.0.0.0/0 with unknown ifindex 4
2018-12-30 20:54:07 <ERR> KRT: Received route 192.168.32.0/20 with unknown ifindex 8
хотя я просил ничего из ядра не импортировать, а во-вторых ко мне в ядро экспортируются префиксы в таком виде:
# ip r
...
unreachable 13.56.0.0/14 proto bird
unreachable 13.125.0.0/16 proto bird
...
Подозреваю, что мне вместо next hop self нужно указать адрес, за которым стоит искать эти сети — но я не сумел в мануале bird найти подходящую опцию.
import filter {bgp_next_hop=IP; accept};
подставив туда ваш некстхоп.
Первая ошибка, вероятно, решается через protocol direct, но ее наличие никак не должно влиять на работоспособность сервиса, ругнулся и работает.
log stderr all;
router id 127.0.0.127;
protocol bgp antifilter {
neighbor 192.3.134.152 as 65432;
import all;
export none;
local as 64999;
hold time 240;
multihop;
}
protocol kernel {
import none;
export filter {
gw = 10.0.0.17;
accept;
};
}
protocol device {
scan time 0;
}
Примерно сутки работает, а потом ломается.
Попробовал списки с отдельными IP и с /24.
Помогает вручную выключить пира, а потом обратно включить.
У меня с оригинальным antifilter'ом как-то странно ведет 951й микрот — висит в established с нулем префиксов.
После ребута набирает 302 префикса, потом через 1 минуту их становится ~17к, а потом префиксы начинают убавляться примерно по 500-1000 штук раз в 5 секунд, доходит до нуля и всё, 10-20 минут можно ждать, все равно будет 0 префиксов (точнее пустое значение).
Саппорт хостера alpharacks.com сначала отвечал в стиле «мы делаем всё, что можем», сегодня ответили уже несколько более развернуто:
«We are still waiting for a reply from our DC Quadranet about this. We have seem to lost contact with them due an internal dispute in QN.
There is some info in the web about a criminal investigation or something like, about this we are not so sure about it. But what it's true is that our DC has locked our servers. So we dont have access thru VNC, SSH… nothing. We have tried to recreate nodes or instances and for now its not possible.»
Ну и на lowendtalk гуглится любопытный тред, с этим связанный.
Выглядит всё, мягко говоря, не очень оптимистично.
В связи с этим вопрос — как думаете, уже пора плюнуть на замороженные в сервисе $100+ донатов и поднимать его в другом хостере? Естественно, все бакапы есть, поэтому процедура миграции займет с час, включая поиск и регистрацию нового сервера. Минусом решения, кроме очевидных потерь финансов, является то, что каждому пользователю сервиса придется перенастраивать пиринг, поскольку поменяется IP-адрес сервера.
можем пообщаться об этом, на общее благо готов отсыпать вам часть)
Думаю, в течение завтрашнего дня что-то с ним произойдет в хорошем смысле.
IP-адрес нашего сервиса
Но! Не могу достучаться до сервиса в режиме динамического ip адреса. У меня выделенный, но динамичекий ип адрес. Если я создаю пиринг со своим as, все работает. Если я в сервисе удаляю as и пробую в режиме динамического ип адреса (меняю as на 64999) и пытаюсь переподключиться, постоянно получаю зависания на `open sent`
Поскольку сервис поднимался фактически с нуля (резервные копии делались, но не всё можно было скопировать напрямую), некоторые функциональные элементы могли повредиться в процессе.
Спасибо за информацию о том, что не работает автосоздание, исправим. Думаю, в течение ближайших 24 часов.
Не хватает знаний, чтобы понять, как можно сделать роуты, полученные с помощью BGP, доступными для компьютеров в локальной сети.
Можно увеличить вес роутов для 0.0.0.0/0, сделав его больше 20, тогда эти роуты начинают работать для самого микротика. Можно прописать в Route Filter bgp_in «Set Routing Mark: rout_ISP1», тогда эти роуты начинают работать для одного из провайдеров.
Как сделать, чтобы полученные по BGP роуты были доступны пользователям обоих провайдеров?
Пока ничего другого, кроме как найти способ, чтобы соединения из LAN смотрели сначала в таблицу маршрутизации main, игнорируя другие, не придумывается. Разве что написать скрипт, который будет просто дублировать маршруты, проставляя Routing Mark второго провайдера.
Может есть идеи лучше?
Таблица маршрутизации удвоится, но она тут в любом случае удвоится.
Изящнее вариант — это развести маршруты по разным vrf-lite. Т.е. bgp поднимается из того vrf, в котором клиенты, а дефолт из этого vrf смотрит в другой vrf, в котором уже внешние интерфейсы и маркинг. При этом сами коннекшны маркируются не на входе трафика в первый vrf, а на маршрутизации их из первого vrf во второй.
Чисто теоретически такая схема тоже может сработать, но это только концепция, ее надо внимательно думать. Внедрять не пробовал. Предыдущий же вариант сработает гораздо легче.
Я бы рекомендовал и на этом линке тоже использовать BGP.
Настройка BGP для обхода блокировок, версия 3, без VPS