Mikrotik BGP: обход блокировки Роскомнадзора, настройка без VPN

Настройка BGP на маршрутизаторах Микротик

Всем известно что каждый день Роскомнадзор блокирует десятки или даже сотни сайтов. Как же быть если в бан попал ваш любимый сайт? Вариантов решения данного вопроса может быть несколько. Например купить VPS за границей, куда цепкие лапы Роскомнадзора не дотянутся, и сделать VPN или SSH туннель до вашего сервера. Либо можно использовать Тор сеть для доступа к заблокированным ресурсам, например можно поставить Tor Browser и радоваться жизни. Все эти методы хороши, но требуют от пользователя дополнительных действий, или дополнительных затрат на VPS. Ниже рассмотрим как на маршрутизаторе Mikrotik через протокол BGP произвести обход блокировки.

Чем хорош этот способ

Я загорелся идеей этого способа потому, что один раз настроив все это, я не должен делать никаких настроек на всех устройствах дома, и не только моих. Еще один плюс в скорости, сервис проверяет обновления списков Роскомнадзора раз в полчаса. И наконец использование маршрутов дает минимальную нагрузку на процессор маршрутизатора, так как это основной его функционал, то для чего он создан.

Как оно работает

BGP — протокол динамической маршрутизации. Без этого протокола интернет в глобальном смысле работать не сможет. Он позволяет одному маршрутизатору сообщить другому о том, что до какого-то адреса можно попасть через него. Но в данном случае мы заворачиваем полученный маршрут в свой туннель за пределы страны. Как только в списке блокировок появляется новый адрес, он прилетает по BGP в таблицу маршрутизации моего маршрутизатора. То есть нет никакой проверки по расписанию, скриптов или чего-то такого.

Что вам для этого потребуется

К сожалению, этот пост не для каждого. Для того, чтобы воспользоваться этой методикой, вам нужно будет собрать вместе несколько элементов:

  1. У вас должен быть linux-сервер где-то за пределами поля блокировок. Или хотя бы желание такой сервер завести — благо это сейчас стоит от $9/год, а возможно и меньше. Метод также подходит, если у вас есть отдельный VPN-туннель, тогда сервер может располагаться и внутри поля блокировок.
  2. Ваш роутер должен быть достаточно умным, чтобы уметь
    • любой нравящийся вам VPN-клиент (я предпочитаю OpenVPN, но это может быть PPTP, L2TP, GRE+IPSec и любой другой вариант, создающий туннельный интерфейс);
    • протокол BGPv4. Что означает, что для SOHO это может быть Mikrotik или любой роутер с OpenWRT/LEDE/аналогичными кастомными прошивками, позволяющими установить Quagga или Bird. Использование PC-роутера также не возбраняется. В случае энтерпрайза смотрите поддержку BGP в документации к вашему бордер-роутеру.
  3. Вы должны иметь представление о использовании Linux и сетевых технологиях, в том числе о протоколе BGP. Или хотя бы хотеть получить такое представление. Поскольку объять необъятное в этот раз я не готов, некоторые непонятные для вас моменты вам придется изучить самостоятельно. Впрочем, на конкретные вопросы, конечно же, отвечу в комментариях и вряд ли окажусь единственным отвечающим, так что не стесняйтесь спрашивать.

Что используется в примере

  • Копия реестра — из https://github.com/zapret-info/z-i
  • VPS — Ubuntu 16.04
  • Сервис маршрутизации — bird 1.6.3
  • Маршрутизатор — Mikrotik hAP ac
  • Рабочие папки — поскольку работаем от рута, бОльшая часть всего будет размещаться в домашней папке рута. Соответственно:
    • /root/blacklist — рабочая папка со скриптом компиляции
    • /root/z-i — копия реестра с github
    • /etc/bird — стандартная папка настроек сервиса bird
  • Внешним IP-адресом VPS с сервером маршрутизации и точкой терминации туннеля принимаем 194.165.22.146, ASN 64998; внешним IP-адресом роутера — 81.177.103.94, ASN 64999
  • IP адреса внутри туннеля — 172.30.1.1 и 172.30.1.2 соответственно.

Безусловно, вы можете использовать любые другие роутеры, операционные системы и программные продукты, корректируя решение под их логику.

Кратко — логика решения

  1. Подготовительные действия
    1. Получаем VPS
    2. Поднимаем туннель от маршрутизатора к VPS
  2. Получаем и регулярно обновляем копию реестра
  3. Устанавливаем и настраиваем сервис маршрутизации
  4. Создаем на основании реестра список статических маршрутов для сервиса маршрутизации
  5. Подключаем роутер к сервису и настраиваем отправку всего трафика через туннель.

Туннель за пределы страны

Так как у меня белый IP и тем более статический, то самый разумный способ сделать туннель используя протокол GRE. У данного протокола нет лишнего функционала, типа авторизации и шифрования, так как нам это не нужно, а следовательно и нет лишней нагрузки на процессор. Если бы у меня был динамический IP, то использование GRE несколько усложнилось, так как со второй стороны пришлось бы отслеживать смену IP.

Так как арендовать VDS у меня необходимости нет, то пришлось искать того, кто пустил бы меня на свой. Нашел, но это оказался OpenVZ хостинг, что внесло некоторые ограничения. На этом сервере ядро было без поддержки GRE, а на OpenVZ мы не можем выбирать модули ядра изнутри. Пришлось запускать GRE в юзерспейсе. По запросу в поиске первым выдался маленький проект на GitHub. Автор любезно сразу собрал бинарники под разные платформы.

# wget -O /usr/local/sbin/gre https://s3.pxx.io/snapshot/gre/gre-x86_64 # chmod +x /usr/local/sbin/gre

Пишем небольшой скрипт для настройки соединения:

#!/bin/sh # IP сервера LOCAL=»11.11.11.11″ # домашний IP REMOTE=»12.12.12.12″ # IP сервера внутри туннеля TUNIP=»192.168.30.1″ # IP дома внутри туннеля TUNPEER=»192.168.30.2″ # имя создаваемого интерфейса на сервере TUNNAME=»tun0″ # имя выходного EXTNAME=»venet0″ iptables -t nat -A POSTROUTING -o $EXTNAME \ -s $TUNPEER/32 -j SNAT —to-source $LOCAL gre $TUNNAME $REMOTE $LOCAL ip addr add $TUNIP peer $TUNPEER dev $TUNNAME ip link set $TUNNAME up

Делаем файл скрипта исполняемым (chmod +x имя_файла) и добавляем скрипт в автозапуск (например через добавление в /etc/rc.local).

На стороне домашнего маршрутизатора делаем следующие настройки:

/interface gre add !keepalive name=gre-antifilter \ remote-address=11.11.11.11 /ip address add address=192.168.30.2 interface=gre-antifilter \ network=192.168.30.1 /ip firewall nat add action=src-nat chain=srcnat \ out-interface=gre-antifilter to-addresses=192.168.30.2

То есть с обоих сторон мы создали GRE-интерфейс, навесили на него адресацию и создали правила трансляции адресов. Проверяем, что все успешно пингом яндекса:

/ping ya.ru interface=gre-antifilter

Настройка bird

Установите bird:

opkg install bird1-ipv4

Замените файл конфигурации /opt/etc/bird4.conf содержимым:

log syslog all; log stderr all; router id 44.44.44.44; # current external ip function martians() { return net ~ [ 100.64.0.0/10+, 169.254.0.0/16+, 172.16.0.0/12+, 192.168.0.0/16+, 10.0.0.0/8+, 127.0.0.0/8+, 224.0.0.0/4+, 240.0.0.0/4+, 0.0.0.0/32-, 0.0.0.0/0{0,7} ]; } protocol device { scan time 15; } protocol kernel kernel_routes { scan time 60; import none; export all; kernel table 1000; # kernel routing table number } protocol static static_routes { import all; #route 192.168.X.Y/24 via 192.168.A.B; } protocol bgp antifilter { import filter { if martians() then reject; gw = 10.8.0.1; # override route nexthop accept; }; export none; local as 64999; # local default as-number neighbor 163.172.210.8 as 65432; multihop; hold time 240; }

В этом файле будут лишь две правки, специфичные для вашего подключения, в примере это:

  • 44.44.44.44 — текущий внешний IP-адрес роутера, который будет использоваться в качестве ID вашего роутера. После того как будет установлен пиринг с сервисом Antifilter, ваш IP адрес может меняться, стороны продолжат различать друг друга по ID.
  • 10.8.0.1 — IP адрес удалённого конца VPN-соединения.

Добавьте скрипт, который будет срабатывать при установки VPN-соединения, он добавлять правило маршрутизации обращений к заблокированным ресурсам через VPN-туннель. В частности, для OpenVPN-соединения отлично подходит /opt/etc/ndm/openvpn-route-up.d/010-add_antizapret_route.sh:

#!/bin/sh ip rule add iif br0 table 1000

и не забудьте сделать его исполняемым:

chmod +x /opt/etc/ndm/openvpn-route-up.d/010-add_antizapret_route.sh

Настройка BGP-пиринга

Перейдите на эту страницу и нажмите «Активировать управление BGP». После ввода капчи настройки вступят в силу.

Использование

Запустите bird и примените правило роутинга для заблокированных ресурсов. При перезагрузки роутера это будет происходить автоматически:

/opt/etc/init.d/S04bird1-ipv4 start /opt/etc/ndm/openvpn-route-up.d/010-add_antizapret_route.sh

И через несколько минут проверьте доступ к выбранному ресурсу, входящему в число блокируемых.

BGP на Mikrotik

Включите IPv6 на вашем роутере

Первое, что мы сделаем, это включим IPv6 на нашем маршрутизаторе Mikrotik.

system package enable ipv6 system reboot y

Это перезагрузит компьютер, и когда он вернется, у него будет новое меню с именем IPv6.

Мы также установим более длительный тайм-аут arp-таймаута, чтобы быть хорошим гражданином, 4 часа обычно довольно разумное время, чтобы избежать отправки обновлений каждые 5 минут..

/ip settings set arp-timeout=04:00:00

Определите IPv4- и IPv6-адреса ваших интерфейсов для IP-транзита, Perú IX (PIT Peru sac) (pitperu.net) и вашей внутренней сети.

Предположения для примера:

  • ASN, предоставленный LACNIC нашей организации, — AS 123456.
  • Блок IPv4, назначенный LACNIC, равен 100.100.100.0 / 22.
  • Блок IPv6, назначенный LACNIC, равен 2803: cd10 :: / 32
  • IPv4-адрес для соединения точка-точка провайдера IP-транзита198.51.100.2 / 30 (где оборудование на стороне провайдера IP-транзита, с которым мы будем выполнять BGP, 198.51.100.1)
  • IPv6-адрес для соединения точка-точка провайдера IP-транзита 2803: dd99: 1111 :: 2/126 (где оборудование на стороне провайдера IP-транзита, с которым мы будем выполнять BGP, 2803: dd99: 1111 :: 1)
  • IPv4-адрес, присвоенный Perú IX (PIT Peru sac) (pitperu.net): 45.183.47.254 / 24
  • IPv6-адрес, присвоенный Perú IX (PIT Peru sac) (pitperu.net): 2803: cd60: 6411: 5 :: ff / 64

Настройте адреса IPv4 и IPv6, предоставленные LACNIC на интерфейсе обратной связи.

Первое, что нужно сделать, это создать интерфейс обратной связи и назначить его адресам IPv4 и IPv6, предоставленным LACNIC. Другой вариант — назначить IP другому интерфейсу или статический маршрут другому маршрутизатору.

/interface bridge add name=loopback #change la 100.100.100.1/22 for the first IPv4 of the range assigned by LACNIC # /ip address add address=100.100.100.1/22 interface=loopback #cambiar la 2803:cd10::/32 por la primera IPv6 del rango asignado por LACNIC# /ipv6 address add address=2803:cd10::/32 advertise=no interface=loopback

Затем мы собираемся определить адреса IPv4 и IPv6 провайдера IP-транзита, если они еще не определены на устройстве.:

#cambiar la 198.51.100.2/30 por la IPv4 otorgada por tu Proveedor de IP transit# /ip address add address=198.51.100.2/30 interface=IP_TRANSIT #cambiar la 2803:dd99:1111::2/126 por la IPv6 otorgada por tu Proveedor de IP transit# /ipv6 address add address=2803:dd99:1111::2/126 advertise=no interface=IP_TRANSIT

Наконец, мы собираемся настроить IP-адреса, предоставленные Perú IX (PIT Peru sac).

#cambiar la 45.183.47.254/24 por la IPv4 asignada por Perú IX (PIT Peru sac)# /ip address add address=45.183.47.254/24 interface=PIT_PERU_sac #cambiar la 2803:cd60:6411:5::ff/64 por la IPv6 asignada por Perú IX (PIT Peru sac)# /ipv6 address add address=2803:cd60:6411:5::ff/64 advertise=no interface=PIT_PERU_sac

Автоматизированный обход блокировок Роскомнадзора на Mikrotik

Необходимые ингредиенты

  • VPS (желательно)
  • VPN (обязательно, можно использовать поднятый на VPS)
  • Mikrotik
  • Прямые руки
  • Бутылка шотландского эля (опционально)

Подготовка сервера

Для того, чтобы выгружать базу заблокированных IP нам нужно использовать свой VPS, я пользуюсь Digital Ocean, но может подойти также и Hetzner (или другие). Брать можно самый дешевый, но если на нем же будет поднят еще и VPN — стоит обратить внимание на то, чтобы трафик был не лимитирован. В качестве операционной системы я использую Debian/Ubuntu, лично мне так удобнее.

Создаем на сервере несколько файлов по пути /usr/local/bin/update-rkn со следующим содержимым:

update-rkn #!/bin/bash -eset-o pipefail curl -sS’https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv’| iconv -f cp1251 \ |sed-re’s/^([^;]*);.*$/\1/’-e’s/ \| /\n/g’|sort-u \ |{echo’/ip firewall address-list’; echo’remove [/ip firewall address-list find list=rkn]’; sed-rne’s/^([0-9]+\.){3}[0-9]+(\/[0-9]+)?$/add list=rkn address=&/p’; echo’/log info’ $(date-d»+3 hours» +%D/%T); } \ >/tmp/rkn.rsc mv/tmp/rkn.rsc rkn.rsc

И делаем его исполняемым:

sudochmod +x /usr/local/bin/update-rkn

Этот скрипт формирует в понятном для Mikrotik виде выгрузку IP, теперь нам надо сделать так, чтобы он исполнялся через определенное время. Я для себя решил это делать на сервере раз в час, потому что у меня используется не один роутер, и загружают они данные в разное время.

Создаем файл по пути /etc/systemd/system/update-rkn.service.

update-rkn.service [Unit]Description=Update RKN list Wants=network-online.target.wants   [Service]Type=oneshot ExecStart=/usr/local/bin/update-rkn User=root WorkingDirectory=/var/www/mr-allen.com/public_html

Создаем файл таймера (переодичность запуска скрипта и генерации выгрузки IP) /etc/systemd/system/update-rkn.timer.

update-rkn.timer [Unit]Description=Update RKN list hourly   [Timer]OnCalendar=hourly Persistent=true   [Install]WantedBy=timers.target

И выдаем файлам нужные права:

sudochmod755/etc/systemd/system/update-rkn.service sudochmod755/etc/systemd/system/update-rkn.timer

Задача этих файлов — выгружать список в каталог веб-сервера, откуда его уже будет забирать Mikrotik. Теперь можем их запустить, и понять, что файл успешно генерируется в каталоге веб-сервера.

systemctl start update-rkn.service systemctl start update-rkn.timer systemctl enable update-rkn.timer

Проверить, правильно ли генерируется выгрузка можно следующим образом:

tail/var/www/mr-allen.com/public_html/rkn.rsc

В ответ должен быть показан скрипт выгрузки и последней строчкой дата его генерации:

add list=rkn address=99.192.231.70 add list=rkn address=99.192.231.87 add list=rkn address=99.192.247.195 add list=rkn address=99.192.247.35 add list=rkn address=99.192.247.37 add list=rkn address=99.192.247.50 add list=rkn address=99.192.247.61 add list=rkn address=99.192.254.165 add list=rkn address=99.192.254.198 /log info 09/07/18/18:00:37

Если все получилось именно так, значит настройка сервера завершена, и можно переходить к настройке роутера.

Настройка PIA VPN на Mikrotik

Я в своем случае не стал поднимать VPN на сервере, и решил использовать VPN от Private Internet Access.

Заходим в Winbox по пути PPP ⇒ Interface ⇒ L2TP Client ⇒ Add (+) и задаем параметры, как на скриншоте:

Нельзя ставить галочку Add Default Route, иначе весь трафик пойдет через VPN

Соединение с VPN установлено, теперь надо объяснить роутеру, что пускать через него, в этом нам поможет маркировка трафика.

Заходим по пути IP ⇒ Firewall ⇒ Mangle ⇒ Add (+).



Src. Address — это наша локальная сеть, Dst. Address List — название списка адресов, куда будут импортироваться заблокированные IP, а во вкладке Action ⇒ Mark Routing ⇒ New Routing Mark — имя метки. Теперь все пакеты, которые ходят по адресам из списка rkn помечаются меткой rkn. Но что же делать роутеру с этой меткой? Объясним ему это.

Заходим по пути IP ⇒ Firewall ⇒ NAT ⇒ Add (+)

Указываем все также, как и на скриншоте. Где Gateway — это наш VPN, а где rkn — наша метка.

Теперь нам нужно, чтобы роутер мог использовать VPN, для этого настроем маскарадинг — IP ⇒ Firewall ⇒ NAT ⇒ Add (+).


Настройка VPN завершена, теперь нам осталось только настроить обновление списка заблокированных адресов в автоматическом режиме, для этого нам помогут Scripts и Scheduler. Сначала добавляем скрипт в System ⇒ Scripts.

Вы можете загружать мой скрипт, который генерируется раз в час, но я крайне НЕ советую этого делать, так как загружать конфигурацию с чужого сервера — достаточно глупо.

/tool fetch url=»https://mr-allen.com/rkn.rsc» dst-path=rkn.rsc :import rkn.rsc /file remove rkn.rsc

Ссылку необходимо заменить на вашу, которая генерируется на вашем сервере и доступна из браузера. После сохранения скрипта, его можно запустить — должны начать открываться заблокированные сайты, нам осталось только сделать так, чтобы база обновлялась сама.

Для этого переходим в System ⇒ Scheduler и настраиваем автоматический запуск скрипта. У меня настроен запуск 1 раз в 4 часа.

Время старта 00:00:02 — это первый запуск в 12:02 ночи, двухминутный запас нужен для того, чтобы сервер успел сгенерировать файл (обычно на это уходит не более 40 секунд). Интервал можно выставить такой, какой вам нужен (главное, чтобы файл успевал обновиться на сервере). Не рекомендую это делать чаще, так как роутер достаточно долго прожевывает базу (около 10 минут на обновление базы заблокированных IP), и в итоге получается так, что раз в 4 часа могут быть на несколько минут недоступны заблокированные сайты. Рекомендуемый интервал — 1 день, ночью.

Проверка работы

Если вы все правильно настроили, то теперь должны открываться все ранее недоступные сайта, а также проверка с помощью BlockCheck показывать именно то, что у меня на скриншоте. Когда будете тестировать — не забудьте указать аргумент –no-report.

linux, vpn, vps, mikrotik, dpi, роскомнадзор 1) за основу исходный код взят — Alexander Shpilkin’s GIT, немного подкорректирован на мое усмотрение, огромный респект автору!

  • mikrotik/incremental-rkn-bypass.txt
  • Последние изменения: 2018/11/10 19:26
  • — root

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 4.0 International 

Источники

  • https://poofeg.ru/2018/12/%D0%BE%D0%B1%D1%85%D0%BE%D0%B4-%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%BA-%D1%80%D0%BE%D1%81%D0%BA%D0%BE%D0%BC%D0%BD%D0%B0%D0%B4%D0%B7%D0%BE%D1%80%D0%B0-bgp/
  • https://www.pvsm.ru/setevy-e-tehnologii/278855
  • https://keenetic-gi.ga/2019/01/22/bgp_routing.html
  • https://www.cloudhosting.lv/rus/faq/BGP-na-Mikrotik
  • https://mr-allen.com/mikrotik/incremental-rkn-bypass

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: