Обход блокировок Роскомнадзора средствами BGP

Блокировки не сильно меня беспокоили, я использовал для этого плагин для браузера под названием friGate. Но способ этот не без изъянов. Первый его минус в том, что этот плагин не поставить в Safari, а у меня сейчас это основной браузер как на десктопе, так и на телефоне. Приходилось для захода на некоторые сайты запускать Chrome. Второй минус в том, что список сайтов не так часто обновляется. Также этот плагин не поможет если сайт случайно заблокирован просто потому, что в Роскомнадзоре работают бездари и порой блокируют целую подсеть в борьбе с Telegram.

Случайно узнал, что добрые люди сделали сервис antifilter.download, который может по BGP отдавать маршруты до заблокированных сайтов. Так как дома я использую роутер MikroTik, то этот способ мне замечательно подходит. Попробую описать свой опыт.

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

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

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

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

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

Так как у меня белый 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

Настройка BGP

Тут делаем все по инструкции, ссылка на которую есть на сайте сервиса. От себя только добавлю, что так как реализация GRE, которую я использовал на VDS, не поддерживает keep-alive, то следовательно маршрутизатор всегда думает, что туннель работает. А так как в случае проблемы я хотел бы получить хотя бы заглушку провайдера, то нужно убрать маршруты.  Поэтому я решил гасить BGP пир средствами netwatch при недоступности сервера:

/tool netwatch
add down-script="/routing bgp peer disable antifilter" \
    host=192.168.30.1 \
    up-script="/routing bgp peer enable antifilter"

Итог

Проверяем, что все работает заходом на какой-нибудь rutracker.org. Для использования вне дома можно использовать VPN.

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *