Туториал о настройке обхода блокировок на OpenWrt с помощью BGP и сервиса https://antifilter.download/.

Вам потребуется:

  • Уже поднятый какой-либо туннель

  • Настроенные zone и forwarding для этого туннеля

  • SSH-доступ к роутеру. Для BIRD2 нет LuCi пакетов

Поднятие туннеля и настройку zone здесь рассматривать не буду, для этого я сделал отдельные туториалы:

Плюсы подхода:

  • Малое потребление оперативной памяти. При тестах оно составило 3MB (привет nftables)

  • Простая и быстрая настройка. Если иметь рабочий конфиг и не хотеть в нём что-то изменить

Минусы:

  • Полная зависимость от сервиса. Если упадёт, то решение перестанет работать

Недостатки, связанные с набором IP адресов:

  • Невозможность добавить ресурсы нужные лично вам и не нужные большому количеству людей. Это сделано, чтобы список маршрутов не разрастался

  • Суммирование IP адресов в подсети. В туннель может попасть трафик, который не должен туда попадать. Опять же это сделано по причине уменьшения количества маршрутов

  • В списках только ресурсы, которые блокируются в России или блокирующие российские подсети по GeoIP. Т.е. это решение только для людей, которые находятся в России. Это совсем не плохо, просто не универсальное решение

Установка

BGP в OpenWrt можно поднять с помощью BIRD2, который есть в официальном репозитории. Также сразу установим его cli, чтобы получать информацию о его работе

opkg update && opkg install bird2 bird2c

Настройка

Его конфигурация находится в /etc/bird.conf. По дефолту он содержит в себе пример конфигурации. Обнуляем этот файл

> /etc/bird.conf

И вставляем конфиг

log syslog all;
log stderr all;

router id $IP;

protocol device {
    scan time 300;
}

protocol kernel kernel_routes {
    scan time 60;
    ipv4 {
        import none;
        export all;
    };
}

protocol bgp antifilter {
    ipv4 {
        import filter {
            #gw = $IP_GW;
            ifname = "$INTERFACE";
            accept;
        };
        export none;
    };
    local as $ASN;
    neighbor 45.154.73.71 as 65432;
    multihop;
    hold time 240;
}

Здесь нужно проставить свои переменные:

  • $IP - Нужно задать какой-нибудь ваш IP-адрес. Например, если ваш роутер имеет выделенный IP-адрес, то лучше поставить его. Если IP серый, то можно и его. Либо внешний IP-адрес, который показывает ifconfig.co. Этот IP-адрес будет идентификатором вашего роутера, главное, чтоб он не пересёкся с идентификаторами других клиентов antifilter.download.

  • $INTERFACE - Интерфейс вашего туннеля. Обычно wg0 для WireGuard, tun0 для OpenVPN или Shadowsocks.

  • $IP_GW - Если по какой-то причине вам удобнее указать IP gateway VPN сервера, а не имя интерфейса. Не забудьте закоментить ifname в этом случае

  • $ASN - Это номер автономной системы. Здесь нужно проставить любое число в диапазоне 64512-65543, кроме 65432.

Дополнительно процитирую@Furriest, автора antifilter.download:

64512 - 16-битный номер автономной системы. Заменяем на любой по вашему желанию, кроме ASN сервиса (65432). В нашем конкретном случае нам не важно, какой там будет указан номер в диапазоне от 1 до 65534, но если делать все правильно - RFC6996 говорит нам, что для частного использования выделен диапазон 64512-65543.

81.117.103.94 - router ID (32 бита) в формате IPv4-адреса. В общем случае нам, опять же, не важно, какой там будет указан ID, но чтобы уменьшить вероятность пересечения с другим пользователем - лучше использовать ваш текущий внешний IP-адрес (посмотрев его на том же 2ip.ru). При его изменении менять router ID совершенно не обязательно.

После этого перезапускаем bird

service bird restart

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

Проверим, что прилетели маршруты

birdc show protocols all antifilter

В строке Routes должны быть не нули

    Routes:         10703 imported, 0 exported, 10703 preferred

Проверим, что нужный нам IP адрес присутствует

birdc show route for 188.114.98.229
BIRD 2.13 ready.
Table master4:
188.114.96.0/22      unicast [antifilter 11:07:17.245 from 45.154.73.71] * (100) [AS65432i]
	dev wg0

Ну и финальное, делаем трассировку до заблокированного ресурса с клиента роутера

mtr devops.com

Второй адрес сверху должен принадлежать вашему VPN серверу.

Если не завелось, включаем логи и рестартуем bird в соседнем терминале

logread -f -u bird
service bird restart

Выключение

Выключить на время

После перезагрузки роутера bird стартанёт

service bird stop

Выключение на постоянке

В init скрипте bird нет disabled. Поэтому придётся вручную удалять симлинк для автозапуска

rm /etc/rc.d/S70bird

Включить автозагрузку обратно

ln -s /etc/init.d/bird /etc/rc.d/S70bird

Маршрутизация к antifilter.download через VPN

@Furriest писал, что некоторые российские провайдеры блокируют работу BGP. Да и всякое может произойти. Можем попросить OpenWrt ходить к antifilter.download через туннель.

В /etc/config/network добавляем маршрут

config route 'for_antifilter'
        option target '45.154.73.71'
        option netmask '255.255.255.255'
        option interface 'wg0'

Либо через UCI

uci set network.for_antifilter=route
uci set network.for_antifilter.target='45.154.73.71'
uci set network.for_antifilter.netmask='255.255.255.255'
uci set network.for_antifilter.interface='wg0'
uci commit

После добавления нужен рестарт сети

service network restart

Благодарности и используемые материалы

Этот туториал появился благодаря @Kenit. В далёком 2018 у меня не получилось завести BGP, и я сделал всё совсем по-другому. В апреле 2023 мне написал @Kenit, сказал, что он успешно поднял обход блокировок через BGP и скинул рабочий конфиг.

Материалы:


Если вы гуру BGP и знаете, как сделать лучше или что-то оптимизировать, пишите в комментарии или ЛС. Если не гуру, пишите тоже.

Материалы про VPN и точечный обход блокировок, которые не дотягивают до статьи на Хабре, публикую в моём телеграм-канале.

Комментарии (6)


  1. 13werwolf13
    24.06.2023 05:14
    +1

    на некоторых роутерах с процессором mips (я так и не понял от чего это зависит) bird начинает сходить с ума нагружая проц на максимум и вешая систему. для таких я накостылил (действительно костыль, стыдипозор, но работает) скриптец.

    пожалуй вечерком попробую опять bird, вдруг уже пофиксили.


  1. arius1987
    24.06.2023 05:14
    +2

    Добрый день, что-то я совсем не пойму: зачем здесь нужен bgp. Трафик в тоннель также можно завернуть с помощью iproute2


    1. itdog Автор
      24.06.2023 05:14

      Дело в количестве маршрутов. Если их несколько, то конечно можно с помощью ip route add, как в этом туториале для хоста antifilter. Но заблокированые ip адреса исчисляются десятками тысяч, поэтому ipset/nftables sets, либо bgp.


    1. 13werwolf13
      24.06.2023 05:14
      +1

      комментом выше я оставил инструкцию как сделать это БЕЗ bgp

      попробуйте на виртуалке интереса ради, посмотрите как долго будут применяться маршруты. а там только добавление а не синхронизация (ну просто потому что писать было лень а роутер и так переодически ребутается сбрасывая таблицу маршрутизации). здесь bgp просто решает все проблемы одним махом. а то что bgp это "с пушки по воробьям" не правда - bgp наверное самый простой, легковесный и удобный протокол динамической маршрутизации


  1. crash_ntech
    24.06.2023 05:14

    Сейчас актуальнее иметь список заблокированных не РКН, а недружественными странами.


  1. nevzorofff
    24.06.2023 05:14

    Пришлось отказаться от antifilter.download из-за суммаризации, т.к даже Ситилинк заворачивался, а работать с ним через VPN ещё тот треш. Перешёл на antifilter.network без суммаризации. Благо мой роутер это легко переваривает.