Bird и Mikrotik сам себе antifilter

Всем привет!!!

В этом материале я расскажу как настроить сервер Bird с протоколом BGP и отдать нужные маршруты с выбранными community в Mikrotik.


Автор данной статьи не призывает и не одобряет обход законных блокировок террористических и вредных ресурсов, установленных на территории Российской Федерации. Целью материала является информирование о возможностях настройки BGP с использованием Bird и Mikrotik для получения доступа к ресурсам, которые неправомерно ограничивают доступ для пользователей из нашей страны. Все действия, предпринятые на основе данной статьи, должны осуществляться в рамках действующего законодательства Российской Федерации.


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

Введение

Ранее я уже делал статью и видео ролик Настройка роутера MikroTik с BGP для просмотра потокового видео дома, в которой рассказывал как поднять на Mikrotik BGP протокол с такими сервисами как antifilter.network или antifilter.download. Теперь же мне стало интересно сделать такой сервис самому для личного использования, что бы контролировать маршруты, которые я буду там использовать.

В чем заключается суть: берем сервер Ubuntu Linux дома на виртуалке или на VPS где угодно и запускаем там Bird. Настраиваем скрипт скачивания нужных сетей, который будет сохранять их в файлы. Bird будет брать эти файлы и анонсировать их в наш Mikrotik по протоколу BGP. На Mikrotik при получении этих маршрутов можно заворачивать их в нужный интерфейс.

Идея была взята с habr за чт оавтору огромное спасибо, но модифицирована мною.

Я буду считать, что у вас, как и у меня установлена Ubuntu 24.04 сервер, а Mikrotik уже работает и на нем поднят туннель WireGuard

Bird (или BIRD Internet Routing Daemon) — это программное обеспечение для маршрутизации, которое поддерживает протоколы BGP (Border Gateway Protocol) и OSPF (Open Shortest Path First). Оно разработано для работы в Unix-подобных системах и используется в основном для управления маршрутизацией в крупных сетях и интернет-провайдерах.

Вот некоторые ключевые особенности Bird:

  • Поддержка нескольких протоколов: Bird поддерживает как BGP, так и OSPF, а также другие протоколы маршрутизации.
  • Модульная архитектура: Bird имеет модульную архитектуру, что позволяет легко добавлять новые функции и расширять возможности.
  • Конфигурация на основе текстовых файлов: Настройка Bird осуществляется через текстовые конфигурационные файлы, что упрощает управление и автоматизацию.
  • Высокая производительность: Bird оптимизирован для работы в высоконагруженных средах и может обрабатывать большое количество маршрутов.
  • Поддержка IPv4 и IPv6: Bird работает как с IPv4, так и с IPv6, что делает его универсальным решением для современных сетей.
  • Гибкость и расширяемость: Bird позволяет создавать сложные политики маршрутизации и фильтрации, что дает возможность точно настраивать поведение маршрутизатора.

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

BGP (Border Gateway Protocol) — это протокол маршрутизации, используемый для обмена информацией о маршрутах между автономными системами (AS) в интернете. Он является основным протоколом, который поддерживает работу глобальной сети.

Вот основные характеристики BGP:

  • Междоменная маршрутизация: BGP предназначен для маршрутизации между различными автономными системами, что делает его ключевым элементом интернета.
  • Тип протокола: BGP является протоколом с вектором пути (path vector protocol). Он использует информацию о пути для принятия решений о маршрутах.
  • Политики маршрутизации: BGP позволяет администраторам настраивать политики маршрутизации, что дает возможность контролировать, какие маршруты предпочтительнее и как они выбираются.
  • Поддержка IPv4 и IPv6: BGP работает как с IPv4, так и с IPv6 адресами, что делает его универсальным для современных сетей.
  • Состояние соединения: BGP устанавливает устойчивые TCP-соединения между маршрутизаторами, что позволяет обмениваться обновлениями о маршрутах.
  • Безопасность: BGP имеет механизмы для аутентификации соседей и защиты от некоторых видов атак, хотя в целом безопасность остаётся важной темой для обсуждения.

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

Установка Bird

Все команды будут выполняться после получения прав кoot так:

sudo -i

Для начала обновим Ubuntu и перезагрузим

apt update 
apt upgrade 
reboot

Установим сам Bird, но остановим и отключим bird6 для протокола IPv6

apt install bird
systemctl stop bird6
systemctl disable bird6
systemctl stop bird

Теперь зададим первоначальную конфигурацию bird и отредактируем файл

nano /etc/bird/bird.conf

Добавим следующее

log syslog all;
router id 192.168.68.17;

protocol kernel {
        scan time 60;
        import none;
        export none;
}

protocol device {
        scan time 60;
}

Где router id укажите IP адрес интерфейса Ubuntu сервер

Можно запустить пустой bird

systemctl start bird

Список IP адресов

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

Все сделано таким образом, что бы вы могли изменить скрипт под себя. Добавив нужные списки или удалив не нужные. Самое главное, что бы в списках из интернета были сети с масками например 8.8.8.0/24. В противном случае Bird не будет работать.

Сам скрипт ложим в /opt/blacklist с именем chklist. В этой же папке создаем каталог list

cd /opt
mkdir blacklist
cd blacklist
mkdir list
touch chklist
chmod +x chklist
nano chklist

Вставляем следующее содержимое и сохраняем CNTR+x затем Y и интер (кажется так, если я не перепутал)

#!/bin/bash
# Скрипт для скачивания IPv4 адресов и добавления их в bird
# Основан на https://habr.com/ru/articles/359268/
# Доработал AlexandrLinux (собака) bafista.ru
# Основной список адресов взят тут: https://github.com/lord-alfred/ipranges/tree/main?tab=readme-ov-file
cd /opt/blacklist/list
wget -N -O RU.lst https://github.com/ipverse/rir-ip/raw/refs/heads/master/country/ru/ipv4-aggregated.txt
#wget -N https://antifilter.download/list/ipsum.lst 
#wget -N https://antifilter.download/list/subnet.lst 
wget -N -O ip.lst https://antifilter.network/download/ip.lst
wget -N -O Meta.lst https://raw.githubusercontent.com/SecOps-Institute/FacebookIPLists/master/facebook_ip_list.lst
wget -N -O Google.lst https://raw.githubusercontent.com/lord-alfred/ipranges/main/google/ipv4.txt
wget -N -O Microsoft.lst https://raw.githubusercontent.com/lord-alfred/ipranges/main/microsoft/ipv4.txt
old=$(cat /opt/blacklist/md5.txt);
new=$(cat /opt/blacklist/list/*.lst | md5sum | head -c 32);
if [ "$old" != "$new" ]
then
echo "md5 chandge"
#cat /opt/blacklist/list/ipsum.lst | sed 's_.*_route & reject;_' > /etc/bird/ipsum.txt
#cat /opt/blacklist/list/subnet.lst | sed 's_.*_route & reject;_' > /etc/bird/subnet.txt
echo "Configure bird start"
sed -i '/^#/d' /opt/blacklist/list/RU.lst && cat /opt/blacklist/list/RU.lst | sed 's_.*_route & reject;_' > /etc/bird/RU.txt
cat /opt/blacklist/list/ip.lst | sed 's_.*_route & reject;_' > /etc/bird/ip.txt
cat /opt/blacklist/list/Meta.lst | sed 's_.*_route & reject;_' > /etc/bird/Meta.txt
cat /opt/blacklist/list/Google.lst | sed 's_.*_route & reject;_' > /etc/bird/Google.txt
cat /opt/blacklist/list/Microsoft.lst | sed 's_.*_route & reject;_' > /etc/bird/Microsoft.txt
/usr/sbin/birdc configure;
logger "BGP list reconfigured";
echo "Configure bird done"
echo $new > /opt/blacklist/md5.txt;
echo "New md5 write"
exit 0
fi
echo "MD5 not change"
echo "Bird not reconfigure"
exit 0

В данном случаи скрипт скачает и сохранит следующие списки:

  • ip.lst – Отдельные IP-адреса, как описаны в списке РКН без суммаризации. На момент написания статьи сетей в этом списке 138595
  • Google.lst – IP-адреса компании Google вместе с ютубом, одно без другого не работает. На момент написания статьи сетей в этом списке 895
  • Meta.lst – IP-адреса запрещенной террористической американской компании. На момент написания статьи сетей в этом списке 818
  • Microsoft.lst – IP-адреса компании Mikrosoft. На момент написания статьи сетей в этом списке 38971
  • RU.lst – IP-адреса Российской Федерации. На момент написания статьи сетей в этом списке 8346

Так же в скрипте есть ipsum.lst (Суммаризация отдельных адресов по маске /24 из списка ip.lst) и subnet.lst (Список формируется и используется совместно с ipsum.lst. Все префиксы меньше /24, которые получаются при формировании ipsum.lst, попадают в него), но они закомментированы в моем случаи и с деланы больше для примера. Если ваш Mikrotik не способен переварить более 100К маршрутов, то используйте эти списки, они существенно меньше и на момент написания статьи там было около 30 тысяч маршрутов.

Можно запустить скрипт такой командой, если вы находитесь в каталоге /opt/blacklist:

./chklist

После запуска скрипта в папке /opt/blacklist/list/ будут лежать файлы с расширением lst

В папке /etc/bird/ будут лежать уже подготовленные файлы для Bird с расширением txt

Автоматизация скрипта

Чтобы автоматизировать запуск скрипта настроив выполнение раз в сутки нужно:

1. Откройте редактор crontab для редактирования. Выполните команду:

crontab -e

2. Добавте новую строку с вашей задачей:

0 0 * * * bash /opt/blacklist/chklist >> /var/log/blacklist.log 2>&1

3. Сохраните изменения и выйдите из редактора.

Теперь ваша задача будет выполняться раз в сутки в полночь.

Чтобы настроить logrotate для управления размером вашего лог-файла и предотвращения его переполнения, вам нужно создать конфигурационный файл для logrotate. Вот шаги, которые вам нужно выполнить:

1. Создайте файл конфигурации для вашего лог-файла. Обычно конфигурационные файлы для logrotate находятся в /etc/logrotate.d/. Вы можете создать новый файл, например, blacklist:

nano /etc/logrotate.d/blacklist

2. Добавьте следующую конфигурацию в файл:

/var/log/blacklist.log {
       weekly              # Период ротации (daily, weekly, monthly)
       rotate 7          # Хранить 7 архивов
       compress          # Сжимать старые логи
       missingok         # Игнорировать отсутствие файла
       notifempty        # Не ротировать, если файл пустой
       create 0640 root adm  # Создать новый файл с указанными правами
   }

   Замените /var/log/blacklist.log на фактический путь к вашему лог-файлу.

3. Сохраните и закройте файл.

4. Проверьте конфигурацию с помощью команды:

logrotate -d /etc/logrotate.conf

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

5. Запустите logrotate вручную (при необходимости):

logrotate -f /etc/logrotate.conf

Теперь logrotate будет автоматически управлять вашим лог-файлом, ротация будет происходить ежедневно, и будут храниться последние 7 архивов. Вы можете настроить параметры в зависимости от ваших потребностей.

Настройка Bird

Теперь пришло время скормить Bird эти файлы и настроить BGP peer с нужными устройствами. Для этого в файл /etc/bird/bird.conf добавим следующее содержимое заранее отредактированное под вас:

protocol static static_bgp {
    include "ip.txt";
    include "Meta.txt";
    include "Microsoft.txt";
    include "Google.txt";
}

protocol bgp Mikrot5009 {
        description "Mikrotik RB5009";
        neighbor 192.168.68.1 as 64999;
        hold time 240;
        import none;
        export where proto = "static_bgp";
        next hop self;
        local as 64888;
        source address 192.168.68.17;
        passive on;
}

protocol bgp MikrotOS {
        description "Mikrotik Virt";
        neighbor 192.168.68.100 as 64999;
        hold time 240;
        import none;
        export where proto = "static_bgp";
        next hop self;
        local as 64888;
        source address 192.168.68.17;
        passive on;
}

Где нужно подправить следующее:

  • protocol static static_bgp – тут перечисляем все файлы, список которых вы собираетесь анонсировать по BGP
  • protocol bgp Mikrot5009 – Mikrot5009 это название понятное вам для данного BGP пира
  • neighbor – IP адрес вашего устройства (микротик), с которым будет устанавливаться соединение и его номер AS.
  • local as 64888 – номер автономной системы Bird
  • source address – адрес источника для сервера Bird. Нужно указать тот, который будет прописан на устройстве Mikrotik
  • passive on – Сервер Bird будет ожидать подключения и не пытаться самостоятельно его установить

Как вы понимаете таких устройств или Mikrotik в Bird может быть много.

Для применения изменений запустите команду

/usr/sbin/birdc configure

Если не выйдет ошибка, то на некоторое время все подвиснет, пока Bird не проанализирует списки, которые вы ему загрузили

Можно посмотреть статус такой командой birdc show protocol all и тут будет отображена информация о различных настройках. Например, видно, что в static_bgp импортировано 139765 маршрутов в моем случаи. Там будет еще и про Mikrotik, но про него дальше.

Настройка Mikrotik

На Mikrotik первым делом нужно создать правила фильтрации. То что получаем по BGP заворачиваем в туннель wg0, а на передачу по BGP запрещаем все.

/routing filter rule
add chain=bgp_in comment="set gw wg0; accept;" disabled=no rule="set gw wg0; accept;"
add chain=discard-all comment="ALL discard" disabled=no rule="reject;"

Теперь настроим BGP пир. В Winbox откройте Routing > BGP. Вам только нужно подставить правильные значения адресов и AS

/routing bgp connection
add as=64999 comment=Bird disabled=no hold-time=4m input.filter=bgp_in .ignore-as-path-len=yes keepalive-time=1m local.address=192.168.68.1 \
    .role=ebgp multihop=yes name=bird output.filter-chain=discard-all remote.address=192.168.68.17/32 .as=64888 router-id=192.168.68.1 \
    routing-table=main

На скрине опечатка, там где Input Filtr нужно указать bgp_in

Если все сделали правильно, то на вкладке сессий появится запись сессии и количество префиксов сетей, которые получаете по BGP от сервера Bird

Если открыть таблицу маршрутизации, то увидите маршруты завернутые в интерфейс wg0, что и нужно было

А на сервере Bird по команду birdc show protocol all можно увидеть состояние пира BGP, время непрерывного соединения и количество маршрутов, которое экспортируется пиру

На этом все, настройки закончены, маршруты есть, заворот их в туннель WG так же работает. Вам остается только подкорректировать листы в скрипте и в настройках Bird не забыть сделать аналогичное.

Добавление BGP community

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

BGP Community — это механизм, который позволяет группировать маршруты в Border Gateway Protocol (BGP) для более гибкого управления маршрутизацией. На MikroTik BGP Community можно использовать для следующих целей:

  • Маркировка маршрутов: Позволяет добавлять метки к маршрутам, что упрощает их идентификацию и управление.
  • Фильтрация маршрутов: Можно использовать для фильтрации входящих и исходящих маршрутов на основе значений сообществ.
  • Политики маршрутизации: Позволяет применять различные политики маршрутизации в зависимости от значений сообществ, например, изменять предпочтения маршрутов.
  • Управление трафиком: С помощью сообществ можно управлять трафиком, направляя его по определенным путям или ограничивая его на определенных узлах.
  • Интеграция с провайдерами: Некоторые провайдеры используют сообщества для управления трафиком и предоставления дополнительных услуг, таких как приоритетный трафик или ограничения по пропускной способности.
  • Упрощение администрирования: Сообщества позволяют упростить конфигурацию и администрирование сети, особенно в больших и сложных сетевых топологиях.

Использование BGP Community на MikroTik может значительно повысить гибкость и управляемость сети.

Первым делом разбиваем наши списки по группам

protocol static static_RKN {
    include "ip.txt";
}

protocol static static_Meta {
    include "Meta.txt";
}

protocol static static_Google {
    include "Google.txt";
}

protocol static static_Microsoft {
    include "Microsoft.txt";
}

Затем настраиваем фильтр или фильтры с добавлением в каждую группу определенных community

filter bgp_out {
    if proto = "static_RKN" then {
        bgp_community.add((64888, 101));
        accept;
    }
    if proto = "static_Meta" then {
        bgp_community.add((64888, 201));
        accept;
    }
    if proto = "static_Google" then {
        bgp_community.add((64888, 301));
        accept;
    }
    if proto = "static_Microsoft" then {
        bgp_community.add((64888, 401));
        accept;
    }
    reject;
}

filter bgp_out_min {
    if proto = "static_Meta" then {
        bgp_community.add((64888, 201));
        accept;
    }
    if proto = "static_Google" then {
        bgp_community.add((64888, 301));
        accept;
    }
    reject;
}

Затем применяем настроенные фильтры к нужным BGP пирам. Например для Mikrot5009 я анонсировал только минимальный набор, а для MikrotOS выдал все что есть.

protocol bgp Mikrot5009 {
        description "Mikrotik RB5009";
        neighbor 192.168.68.1 as 64999;
        hold time 240;
        import none;
        export filter bgp_out_min;
        next hop self;
        local as 64888;
        source address 192.168.68.17;
        passive on;
}

protocol bgp MikrotOS {
        description "Mikrotik Virt";
        neighbor 192.168.68.100 as 64999;
        hold time 240;
        import none;
        export filter bgp_out;
        next hop self;
        local as 64888;
        source address 192.168.68.17;
        passive on;
}

Теперь на Mikrotik в WinBox идем в Routing > Filteres и создаем новый фильр, навешиваем его на наш BGP пир на прием, а фильтр следующего содержания:

Это только пример, вам решать что куда

if (bgp-communities includes 64888:101)
{
    set gw 192.168.68.1;
    accept;
}
else
{
    if (bgp-communities includes 64888:201)
    { 
        set gw wg0;
        accept;
    }
    else
    {
        if (bgp-communities includes 64888:301)
        { 
            set gw wg0;
            accept;
        }
        else
        {
            if (bgp-communities includes 64888:401)
            { 
                set gw wg0;
                accept;
            }
            else
            {
                reject;
            }
         }
    }
}

В итоге у каждого маршрута поулченного по BGP есть соответствующая метка community и соответствующий заданный шлюз.

Таким образом на разных Mikrotik можно получать разные машруты с одного Bird и по разному их обрабатывать, что может быть полезно.

Что в итоге

В результате у вас есть собственный сервер Bird, который выдаёт только нужную вам информацию по протоколу BGP. На MikroTik вы также можете управлять маршрутами, используя фильтрацию по BGP Community. Таким образом, вы полностью независимы от внешних сервисов, так как сами контролируете настройки и конфигурацию.

Видео ролик

Подписаться
Уведомить о
guest
22 Комментарий
Старые
Новые
Межтекстовые Отзывы
Посмотреть все комментарии