Выборочный роутинг с помощью bird

Используем пакеты, расширяющие возможности оборудования
Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 14 сен 2019, 14:37

Этот способ наследует черты двух подходов by Александр Рыжов:
1. Обход блокировок с использованием BGP
2. Выборочный роутинг до перечисленных доменов

Вообще говоря, способ обхода блокировок сильно зависит от провайдера. Рецепты для одного провайдера могут не работать у другого. Так вот у меня способ 1 работает, а способ 2 - нет.
Способ 1 отличный - не нужно думать - настроил и все разблокируется автоматически (я использовал https://antifilter.network/ вместо https://antifilter.download/ ).
В этом способе один недостаток, через VPN канал идет трафик не только заблокированных ip но и многих "нормальных". Это приводит к определенным проблемам. Некоторые программы, привязанные к определенному региону обнаруживают "прокси" и отказываются работать. Другие программы, которые имеют встроенные средства обхода блокировок (android программы для просмотра видео) перестают работать. Некоторые российские интернет магазины, считают, что к ним идет обращение из другой страны и запрашивают ввод "capture".
Как правило реально нужно разблокировать небольшое число ip - десяток другой. В этом случае удобен способ 2, но он не работает с моим провайдером.
Я объединил оба подхода и модифицировал конфигурацию bird, убрал получение маршрутов по BGP и задал статические.
Вышло вот что

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

log syslog all;
log stderr all;

router id xx.xxx.xxx.xx; # current external ip

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 91.132.60.14/32 via 10.8.0.1; # rutor.is
....
    route 195.82.146.214/32 via 10.8.0.1; # rutracker.org
...}

Тут 10.8.0.1 - ip адрес удалённого конца VPN-соединения.
Недостаток этого способа по сравнениею с (2) - задаются ip, а не доменные адреса для разблокировки. Со временем ip могут и измениться - этот можно обойти, написав скрипт, обновляющий config файл bird. Впрочем это тема другого поста.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 14 сен 2019, 21:56

Черновик скрипта для создания конфига bird. Скрипт еще в работе.
Я не большой умелец написания скриптов - сделал по рабоче-крестьянски.
Для работы нужно установить пакеты grep,bash и bind-dig

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

#!/opt/bin/bash

# Test an IP address for validity:
# Usage:
#      valid_ip IP_ADDRESS
#      if [[ $? -eq 0 ]]; then echo good; else echo bad; fi
#   OR
#      if valid_ip IP_ADDRESS; then echo good; else echo bad; fi
#
function valid_ip()
{
    local  ip=$1
    local  stat=1

    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        OIFS=$IFS
        IFS='.'
        ip=($ip)
        IFS=$OIFS
        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
            && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
        stat=$?
    fi
    return $stat
}


dig -f /opt/etc/unblocker/domains.txt +short > /opt/etc/unblocker/ip.txt
cp /opt/etc/unblocker/bird4_start.txt /opt/etc/unblocker/bird4_static.conf

while IFS= read -r line
do
    valid_ip $line
    if [[ $? -eq 0 ]]
    then
        echo "    route $line/32 via 10.8.0.1;" >> /opt/etc/unblocker/bird4_static.conf
    fi
done < "/opt/etc/unblocker/ip.txt"

echo "}" >> /opt/etc/unblocker/bird4_static.conf

cp -f /opt/etc/unblocker/bird4_static.conf /opt/etc/bird4_static.conf
killall -s SIGHUP bird4

Список сайтов (доменные имена) в файле /opt/etc/unblocker/domains.txt по одному на строку.

pavlik
Сообщения: 2
Зарегистрирован: 31 окт 2020, 16:23

Сообщение pavlik » 01 ноя 2020, 01:23

Доброго времени суток!
Подскажите, bird4_static.conf и ip.txt от списка domains.txt заполняются, в конце команда "killall -s SIGHUP bird4" отрабатывает. Ошибок нету.
А маршруты не появляются :(

Делаю по второму варианту, в скрипте заменил только адрес впна

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 01 ноя 2020, 02:56

pavlik, нужно еще добавить hook скрипт с

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

ip rule add ....

Я использую такой

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

#/bin/sh


if [ -z "$(ip rule | grep 1000)" ]; then
       ip rule add iif br0 table 1000
fi

А хук определяется типом vpn

pavlik
Сообщения: 2
Зарегистрирован: 31 окт 2020, 16:23

Сообщение pavlik » 01 ноя 2020, 11:04

Спасибо за столь быстрый ответ, есть возможность немного разживать? Мой уровень немного ниже плинтуса)

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 02 ноя 2020, 10:30

Для wireguard подойдет этот хук - https://github.com/ndmsystems/packages/ ... ifcreatedd
Для openvpn - есть свои


Вернуться в «Entware/Qnapware/Optware/Zyxware - обсуждаем репозитории пакетов»

Кто сейчас на конференции

Всего 1 посетитель :: 0 зарегистрированных, 0 скрытых и 1 гость (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (162) здесь было 16 ноя 2019, 18:33

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость