Диагноз: твой сервис падает — а ты даже не знаешь, в каком датацентре
Значит, так. У тебя два (а может, три) сервера в разных точках планеты. Ты хочешь, чтобы пользователь из Москвы шёл к московскому узлу, из Франкфурта — к франкфуртскому, а если один узел падает — трафик автоматически, без твоего участия, уходил на живой. Без Cloudflare. Без AWS Route53 latency routing. Без «позвони провайдеру и попроси». Своими руками, на своих серверах, за 30 минут.
Звучит как сказка? Это называется Anycast. И строится он на BGP. А BGP мы завернём в WireGuard, потому что голый BGP между серверами в интернете — это как ходить по офису в одних носках: можно, но зачем.
- Рабочий BGP over WireGuard туннель между двумя (и более) узлами
- Anycast IP, который отвечает с ближайшего живого сервера
- Автоматический failover: упал узел — трафик ушёл, поднялся — вернулся
- Готовые конфиги BIRD2 и WireGuard, которые можно скопировать и вставить
- Понимание, почему это работает — на случай, если что-то пойдёт не так (а оно пойдёт)
Состав статьи:
- Диагноз — что строим и зачем
- Причины — почему BGP+WireGuard, а не что-то проще
- Рецепт — пошаговая настройка WireGuard + BIRD2 + Anycast
- Осложнения — типичные факапы и их лечение
- Прогноз — что в итоге, куда расти
node-msk), второй во Франкфурте (node-fra). Оба под рутом или с sudo. Anycast-адрес — 192.0.2.1/32 (в реальности — твой IP, анонсированный провайдером или купленный PI-блок; для лабы используем lo-интерфейс).Причины: почему болит и почему именно BGP over WireGuard
Почему не просто DNS failover?
DNS failover — это «переключить A-запись и подождать TTL». При TTL 60 секунд ты теряешь минуту трафика при каждом падении. При кешировании у провайдеров — больше. BGP Anycast переключает трафик на уровне маршрутизации, за секунды, без кеша и без TTL.
Почему не просто BGP без WireGuard?
Потому что BGP-сессия между серверами в интернете идёт по открытому каналу. Злой человек может инжектировать BGP UPDATE и угнать твой трафик. Это не паранойя — это называется BGP hijacking, и происходит регулярно. WireGuard даёт нам зашифрованный туннель с аутентификацией по ключам. BGP едет внутри туннеля — безопасно, надёжно, красиво.
Почему BIRD2, а не FRR или Quagga?
Quagga — дедушка, давно на пенсии. FRR — отличная штука, но для нашей задачи BIRD2 проще в конфигурации, легче на ресурсах и лучше документирован для простых Anycast-сценариев. Если ты уже используешь FRR — в конце статьи будет блок с эквивалентным конфигом.
Почему WireGuard, а не OpenVPN или IPSec?
Потому что WireGuard — это ~4000 строк кода против ~100000 у OpenVPN. Меньше кода — меньше багов — меньше поверхность атаки. И он быстрее. И конфиг — 15 строк, а не 150. Короче, WireGuard — это как хирургический скальпель, а OpenVPN — мачете из подсобки.
Где применяется BGP Anycast на практике?
- Anycast DNS (именно так работают корневые DNS-серверы — их физически 13, но адресов тысячи точек)
- Anycast для веб-серверов Nginx — пользователь идёт к ближайшему
- Geo-распределение трафика без дорогих CDN
- High availability без балансировщика и без единой точки отказа
- Multi datacenter сеть для стартапа, которому не по карману AWS Global Accelerator
Рецепт: BGP over WireGuard + Anycast своими руками
Топология стенда
| Параметр | node-msk (Москва) | node-fra (Франкфурт) |
|---|---|---|
| Публичный IP | 1.2.3.4 | 5.6.7.8 |
| WireGuard IP | 10.0.0.1/30 | 10.0.0.2/30 |
| BGP ASN | 65001 | 65002 |
| Anycast IP (lo) | 192.0.2.1/32 | 192.0.2.1/32 |
| WireGuard порт | 51820 | 51820 |
Оба сервера анонсируют один и тот же IP (192.0.2.1/32) через BGP. Маршрутизаторы провайдера выбирают ближайший путь. Пользователь из Москвы приходит на node-msk, из Франкфурта — на node-fra. Если node-msk падает — BGP-анонс исчезает, и вся Москва идёт во Франкфурт. Некомфортно, но живо.
Шаг 0: Подготовка системы
На обоих серверах выполни:
# Обновляем систему
apt update && apt upgrade -y
# Ставим WireGuard и BIRD2
apt install -y wireguard wireguard-tools bird2
# Включаем форвардинг пакетов - без этого маршрутизация не поедет
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
sysctl -p
# Проверяем
sysctl net.ipv4.ip_forward
# Должно быть: net.ipv4.ip_forward = 1
Шаг 1: Генерируем ключи WireGuard
На node-msk:
# Создаём директорию с правильными правами
mkdir -p /etc/wireguard
chmod 700 /etc/wireguard
# Генерируем ключевую пару
wg genkey | tee /etc/wireguard/msk_private.key | wg pubkey > /etc/wireguard/msk_public.key
# Смотрим ключи
echo "Приватный ключ MSK:"
cat /etc/wireguard/msk_private.key
echo "Публичный ключ MSK:"
cat /etc/wireguard/msk_public.key
На node-fra:
mkdir -p /etc/wireguard
chmod 700 /etc/wireguard
wg genkey | tee /etc/wireguard/fra_private.key | wg pubkey > /etc/wireguard/fra_public.key
echo "Приватный ключ FRA:"
cat /etc/wireguard/fra_private.key
echo "Публичный ключ FRA:"
cat /etc/wireguard/fra_public.key
Запиши оба публичных ключа — они понадобятся в конфигах на другой стороне.
Шаг 2: Настраиваем WireGuard туннель
На node-msk создай файл /etc/wireguard/wg0.conf:
cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
# Приватный ключ node-msk
PrivateKey = <MSK_PRIVATE_KEY>
# WireGuard IP для BGP-сессии
Address = 10.0.0.1/30
# Порт, на котором слушаем
ListenPort = 51820
# MTU: WireGuard добавляет оверхед ~60 байт к IPv4
# BGP пакеты небольшие, но лучше выставить явно
MTU = 1420
# Поднимаем lo с Anycast IP при старте туннеля
PostUp = ip addr add 192.0.2.1/32 dev lo
# Убираем при остановке
PostDown = ip addr del 192.0.2.1/32 dev lo
[Peer]
# Публичный ключ node-fra
PublicKey = <FRA_PUBLIC_KEY>
# Публичный IP и порт node-fra
Endpoint = 5.6.7.8:51820
# Разрешаем трафик от WireGuard IP и Anycast-подсети
AllowedIPs = 10.0.0.2/32, 192.0.2.0/24
# Keepalive - важно! Без него BGP-сессия может отвалиться
# через NAT или фаервол
PersistentKeepalive = 25
EOF
На node-fra создай /etc/wireguard/wg0.conf:
cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
# Приватный ключ node-fra
PrivateKey = <FRA_PRIVATE_KEY>
Address = 10.0.0.2/30
ListenPort = 51820
MTU = 1420
PostUp = ip addr add 192.0.2.1/32 dev lo
PostDown = ip addr del 192.0.2.1/32 dev lo
[Peer]
# Публичный ключ node-msk
PublicKey = <MSK_PUBLIC_KEY>
Endpoint = 1.2.3.4:51820
AllowedIPs = 10.0.0.1/32, 192.0.2.0/24
PersistentKeepalive = 25
EOF
Заменяй <MSK_PRIVATE_KEY>, <FRA_PRIVATE_KEY>, <MSK_PUBLIC_KEY>, <FRA_PUBLIC_KEY> на реальные значения из Шага 1.
Поднимаем и проверяем туннель на обоих серверах:
# Устанавливаем правильные права на конфиг
chmod 600 /etc/wireguard/wg0.conf
# Поднимаем интерфейс
wg-quick up wg0
# Включаем автозапуск
systemctl enable wg-quick@wg0
# Проверяем статус
wg show wg0
Ожидаемый вывод wg show — видим peer с latest handshake не старше 25 секунд. Если handshake есть — туннель живой.
# Проверяем связность через туннель
# С node-msk:
ping -c 4 10.0.0.2
# С node-fra:
ping -c 4 10.0.0.1
Если пинги идут — едем дальше. Если нет — смотри секцию «Осложнения».
Шаг 3: Настраиваем BIRD2 для BGP
Конфиг BIRD2 на node-msk
Создай /etc/bird/bird.conf на node-msk:
cat > /etc/bird/bird.conf << 'EOF'
# =====================================================
# BIRD2 конфиг для BGP over WireGuard
# Узел: node-msk, ASN: 65001
# =====================================================
# Router ID - уникальный идентификатор маршрутизатора
# Используем WireGuard IP
router id 10.0.0.1;
# Логирование - пиши всё в syslog, потом не пожалеешь
log syslog all;
# Протокол Device - нужен для обнаружения интерфейсов
protocol device {
scan time 10;
}
# Протокол Direct <a title="DHCP Snooping - что это такое и как защитить сеть от Rogue DHCP сервера" href="https://it-apteka.com/dhcp-snooping-chto-jeto-takoe-i-kak-zashhitit-set-ot-rogue-dhcp-servera-2/" target="_blank" rel="noopener" data-wpil-monitor-id="1144">— экспортируем напрямую подключённые сети</a>
protocol direct {
ipv4;
interface "lo"; # Смотрим на lo, где живёт наш Anycast IP
}
# Kernel protocol <a title="ARP MikroTik: настройка, таблица, proxy-arp и reply-only - полный разбор" href="https://it-apteka.com/arp-mikrotik-nastrojka-tablica-proxy-arp-i-reply-only-polnyj-razbor/" target="_blank" rel="noopener" data-wpil-monitor-id="1145">— синхронизация таблицы</a> маршрутов BIRD с ядром
protocol kernel {
ipv4 {
export all; # Все маршруты из BIRD -> в таблицу ядра
import all; # Все маршруты ядра -> в BIRD
};
learn; # Учим существующие маршруты ядра
}
# =====================================================
# Статический маршрут для нашего Anycast IP
# Это то, что мы будем анонсировать через BGP
# =====================================================
protocol static anycast_routes {
ipv4;
route 192.0.2.1/32 via "lo"; # Anycast IP живёт на lo
}
# =====================================================
# Фильтр экспорта: анонсируем ТОЛЬКО наш Anycast IP
# Не надо анонсировать соседу всё подряд
# =====================================================
filter export_anycast {
if net = 192.0.2.0/24 then accept;
if net = 192.0.2.1/32 then accept;
reject;
}
# Фильтр импорта: принимаем Anycast-маршруты от соседа
filter import_anycast {
if net = 192.0.2.1/32 then accept;
reject;
}
# =====================================================
# BGP-сессия с node-fra через WireGuard туннель
# =====================================================
protocol bgp node_fra {
description "BGP to node-fra via WireGuard";
# Наш ASN
local as 65001;
# Наш IP в туннеле
local 10.0.0.1;
# ASN соседа
neighbor 10.0.0.2 as 65002;
# Тип: eBGP (разные ASN) через WireGuard
# multihop не нужен - они в одной /30 подсети
ipv4 {
import filter import_anycast;
export filter export_anycast;
next hop self; # Говорим соседу: next hop - я сам
};
# Таймеры: keepalive и hold time в секундах
# Маленькие значения = быстрый failover
# Слишком маленькие = нестабильная сессия
hold time 30;
keepalive time 10;
# Перезапуск при потере сессии
error wait time 5, 30;
error forget time 60;
}
EOF
Конфиг BIRD2 на node-fra
На node-fra — зеркальный конфиг с поменянными ASN и IP:
cat > /etc/bird/bird.conf << 'EOF'
# =====================================================
# BIRD2 конфиг для BGP over WireGuard
# Узел: node-fra, ASN: 65002
# =====================================================
router id 10.0.0.2;
log syslog all;
protocol device {
scan time 10;
}
protocol direct {
ipv4;
interface "lo";
}
protocol kernel {
ipv4 {
export all;
import all;
};
learn;
}
protocol static anycast_routes {
ipv4;
route 192.0.2.1/32 via "lo";
}
filter export_anycast {
if net = 192.0.2.1/32 then accept;
reject;
}
filter import_anycast {
if net = 192.0.2.1/32 then accept;
reject;
}
protocol bgp node_msk {
description "BGP to node-msk via WireGuard";
local as 65002;
local 10.0.0.2;
neighbor 10.0.0.1 as 65001;
ipv4 {
import filter import_anycast;
export filter export_anycast;
next hop self;
};
hold time 30;
keepalive time 10;
error wait time 5, 30;
error forget time 60;
}
EOF
Запускаем BIRD2 на обоих серверах:
# Проверяем синтаксис конфига
bird -p
# Запускаем
systemctl start bird
systemctl enable bird
# Смотрим статус
systemctl status bird
Шаг 4: Проверяем BGP-сессию
# Заходим в BIRD CLI
birdc
# Смотрим статус всех протоколов
show protocols all
# Смотрим конкретно BGP-сессию
show protocols node_fra # или node_msk на другом сервере
# Смотрим таблицу маршрутов
show route
# Смотрим только маршруты от BGP
show route protocol node_fra
# Выходим
quit
Что должно быть в выводе show protocols node_fra:
# Ожидаемый вывод (примерно):
Name Proto Table State Since Info
node_fra BGP --- up 2024-01-15 Established
Слово Established — это успех. Всё остальное — читай «Осложнения».
# Проверяем таблицу маршрутов ядра
# На node-msk должен появиться маршрут к 192.0.2.1 через 10.0.0.2
ip route show | grep 192.0.2
# Ожидаемый вывод на node-msk:
# 192.0.2.1 via 10.0.0.2 dev wg0 proto bird metric 32
# broadcast 192.0.2.1 dev lo proto kernel scope link src 192.0.2.1
Шаг 5: Настраиваем Nginx для Anycast
Ставим Nginx на оба сервера и вешаем его на Anycast IP:
apt install -y nginx
# Создаём тестовый конфиг
cat > /etc/nginx/sites-available/anycast << 'EOF'
server {
# Слушаем ТОЛЬКО на Anycast IP
listen 192.0.2.1:80;
server_name _;
location / {
# Показываем, с какого узла ответил запрос
return 200 "Hello from node-msk! Server: $hostname\n";
# На node-fra замени на соответствующий текст
}
}
EOF
ln -s /etc/nginx/sites-available/anycast /etc/nginx/sites-enabled/anycast
# Проверяем конфиг
nginx -t
# Перезапускаем
systemctl restart nginx
Проверяем:
# С любого сервера или клиента:
curl http://192.0.2.1
# Если тестируем локально с node-msk:
curl --interface 10.0.0.1 http://192.0.2.1
Шаг 6: Проверяем Anycast failover
Это самый приятный момент — имитируем падение узла и смотрим, как трафик переключается.
# На node-msk - "роняем" BGP анонс (но сервер живой)
# Способ 1: убираем маршрут из BIRD
birdc
disable anycast_routes
quit
# Или просто убиваем bird
systemctl stop bird
# На node-fra смотрим, что изменилось в таблице маршрутов
# Маршрут 192.0.2.1 через node-msk должен пропасть
ip route show | grep 192.0.2
# Curl теперь должен отвечать с node-fra
curl http://192.0.2.1
# Восстанавливаем node-msk
systemctl start bird
# Через несколько секунд BGP-сессия поднимается заново
# Проверяем
birdc
show protocols node_fra
quit
# Маршрут вернулся
ip route show | grep 192.0.2
Шаг 7: Настройка фаервола
# Если используешь UFW
ufw allow 51820/udp comment "WireGuard"
ufw allow in on wg0 to any port 179 proto tcp comment "BGP"
ufw allow in on wg0 from 10.0.0.0/30 comment "BGP peers"
ufw reload
# Если используешь iptables напрямую
iptables -A INPUT -p udp --dport 51820 -j ACCEPT
iptables -A INPUT -i wg0 -p tcp --dport 179 -j ACCEPT
iptables -A INPUT -i wg0 -s 10.0.0.0/30 -j ACCEPT
iptables -A FORWARD -i wg0 -j ACCEPT
iptables -A FORWARD -o wg0 -j ACCEPT
# Сохраняем правила
apt install -y iptables-persistent
netfilter-persistent save
Шаг 8 (бонус): Три и более узлов
Для третьего узла (скажем, node-sin в Сингапуре, 10.0.0.5, ASN 65003) добавляем WireGuard peer к каждому существующему узлу и добавляем BGP-сессию в BIRD.
В /etc/wireguard/wg0.conf на node-msk добавляем:
# Добавляем в секцию [Peer] конфига wg0 на node-msk:
[Peer]
# Публичный ключ node-sin
PublicKey = <SIN_PUBLIC_KEY>
Endpoint = <SIN_PUBLIC_IP>:51820
AllowedIPs = 10.0.0.5/32, 192.0.2.0/24
PersistentKeepalive = 25
В BIRD-конфиг на node-msk добавляем:
# Добавляем в /etc/bird/bird.conf на node-msk:
protocol bgp node_sin {
description "BGP to node-sin via WireGuard";
local as 65001;
local 10.0.0.1;
neighbor 10.0.0.5 as 65003;
ipv4 {
import filter import_anycast;
export filter export_anycast;
next hop self;
};
hold time 30;
keepalive time 10;
}
# Применяем изменения без перезапуска
wg-quick down wg0 && wg-quick up wg0
# Для BIRD - горячая перезагрузка конфига
birdc configure
Бонус: Эквивалентный конфиг для FRR
Если у тебя уже стоит FRR — держи эквивалентный конфиг:
# /etc/frr/frr.conf на node-msk (FRR версия)
frr version 8.4
frr defaults traditional
hostname node-msk
log syslog informational
service integrated-vtysh-config
!
interface lo
ip address 192.0.2.1/32
!
router bgp 65001
bgp router-id 10.0.0.1
no bgp ebgp-requires-policy
neighbor 10.0.0.2 remote-as 65002
neighbor 10.0.0.2 description node-fra
neighbor 10.0.0.2 timers 10 30
!
address-family ipv4 unicast
network 192.0.2.1/32
neighbor 10.0.0.2 activate
neighbor 10.0.0.2 next-hop-self
neighbor 10.0.0.2 prefix-list ANYCAST_ONLY out
neighbor 10.0.0.2 prefix-list ANYCAST_ONLY in
exit-address-family
!
ip prefix-list ANYCAST_ONLY seq 5 permit 192.0.2.1/32
ip prefix-list ANYCAST_ONLY seq 10 deny any
!
# Включаем bgpd в /etc/frr/daemons
sed -i 's/bgpd=no/bgpd=yes/' /etc/frr/daemons
# Перезапускаем FRR
systemctl restart frr
# Проверяем
vtysh -c "show bgp summary"
Осложнения: что пойдёт не так и как лечить
WireGuard: нет handshake / туннель не поднимается
# Диагностика WireGuard
wg show wg0
# Если latest handshake давно или вообще нет:
# 1. Проверяем, открыт ли порт
ss -ulnp | grep 51820
# 2. Проверяем, доступен ли endpoint с другой стороны
nc -zuv 5.6.7.8 51820
# 3. Смотрим системные логи
journalctl -u wg-quick@wg0 -n 50
# 4. Проверяем правила фаервола
iptables -L INPUT -n | grep 51820
ufw status verbose | grep 51820
- Публичные ключи НЕ перепутаны (частая ошибка — вставил свой вместо чужого)
- Endpoint — публичный IP, а не WireGuard IP (10.0.0.x)
- UDP 51820 открыт в фаерволе на обоих серверах
- AllowedIPs включает IP соседа
- MTU: если провайдер режет пакеты, попробуй MTU 1380
BGP: сессия не устанавливается (Active вместо Established)
# Смотрим лог BIRD
journalctl -u bird -n 100 | grep -E "BGP|error|Error"
# Или напрямую в BIRD CLI
birdc
show protocols all
show log
quit
# Проверяем TCP 179 между узлами через туннель
# С node-msk:
nc -zv 10.0.0.2 179
# Если не подключается:
# 1. Проверяем фаервол на wg0
iptables -L INPUT -n | grep 179
# 2. Проверяем, что BIRD слушает
ss -tlnp | grep 179
# 3. Проверяем Router ID в конфиге
# Router ID должен быть уникальным на каждом узле
BGP Established, но маршруты не приходят
# Смотрим детально что анонсируется и принимается
birdc
show route all
show route protocol node_fra
show route export node_fra
show route import node_fra
# Типичная причина: фильтр отбросил маршрут
# Временно меняем фильтр на accept all для диагностики
# В конфиге bird.conf:
# import all;
# export all;
# Применяем
birdc configure
# Если маршруты пошли - проблема в фильтре
# Возвращаем нормальный фильтр и отлаживаем его
Маршруты есть в BIRD, но нет в таблице ядра
# Проверяем protocol kernel
birdc
show protocols kernel1
quit
# Проверяем, что экспорт из BIRD в ядро настроен
# В конфиге должно быть:
# protocol kernel {
# ipv4 { export all; };
# }
# Смотрим таблицу маршрутов ядра
ip route show table all | grep 192.0.2
# Если маршрут есть в другой таблице:
ip rule show
Nginx не слушает на Anycast IP
# Проверяем, что IP добавлен на lo
ip addr show lo
# Если нет:
ip addr add 192.0.2.1/32 dev lo
# Проверяем конфиг nginx
nginx -t
# Смотрим на каких адресах слушает
ss -tlnp | grep nginx
# Типичная ошибка: nginx стартовал ДО того, как WireGuard добавил IP
# Решение: добавить в PostUp WireGuard
# PostUp = ip addr add 192.0.2.1/32 dev lo && systemctl restart nginx
MTU проблемы: пакеты режутся, TCP зависает
# Симптом: ping идёт, но curl/wget висит
# Диагностика: пинг с большим пакетом
ping -c 4 -M do -s 1400 10.0.0.2
# Если пакет не проходит - нужно снизить MTU
# В /etc/wireguard/wg0.conf:
# MTU = 1380 # или даже 1360
# Для TCP: включаем MSS clamping
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu
# Применяем
wg-quick down wg0 && wg-quick up wg0
Мониторинг BGP-сессий
# Простой скрипт для мониторинга состояния BGP
cat > /usr/local/bin/bgp-check.sh << 'EOF'
#!/bin/bash
PEERS=$(birdc show protocols | grep BGP | awk '{print $1, $6}')
echo "=== BGP Status ==="
echo "$PEERS"
DOWN=$(echo "$PEERS" | grep -v Established)
if [ -n "$DOWN" ]; then
echo "ALERT: BGP session DOWN!"
echo "$DOWN"
# Сюда можно добавить отправку в Telegram/Slack
exit 1
fi
echo "All BGP sessions: OK"
exit 0
EOF
chmod +x /usr/local/bin/bgp-check.sh
# Добавляем в cron - проверка каждые 5 минут
echo "*/5 * * * * /usr/local/bin/bgp-check.sh >> /var/log/bgp-check.log 2>&1" | crontab -
Прогноз: что мы построили и куда расти
Итог
По факту, мы за 30 минут собрали следующее:
- Зашифрованный туннель между двумя (или более) серверами через WireGuard — трафик идёт внутри криптографически защищённого канала
- BGP-маршрутизацию поверх туннеля через BIRD2 — каждый узел анонсирует Anycast IP соседу и получает маршруты от него
- Автоматический failover — если узел падает, BGP-сессия рвётся через
hold time(30 секунд в нашем конфиге), и маршрут к упавшему узлу исчезает из таблиц - Anycast IP на lo — один адрес, несколько точек присутствия
- Nginx на Anycast — реальный сервис, который отвечает с ближайшего узла
- Failover за 30–60 секунд (hold time + BGP convergence) без ручного вмешательства
- Нулевые расходы на балансировщик — всю работу делает протокол маршрутизации
- Масштабирование: добавить третий узел — 10 минут работы
- Безопасность: BGP-трафик внутри WireGuard, никакого открытого TCP 179 наружу
Куда расти дальше
BGP Communities для управления трафиком. Можно назначать community-теги маршрутам и управлять, куда какой трафик идёт — например, приоритизировать один узел над другим.
BFD (Bidirectional Forwarding Detection). Протокол для быстрого обнаружения падений линка — позволяет сократить failover с 30 секунд до 1-2. BIRD2 поддерживает BFD нативно.
Route reflector при большом количестве узлов. Если узлов 5+, полная mesh-топология BGP-сессий становится громоздкой. Route reflector — один центральный узел, который рассылает маршруты всем.
Интеграция с Prometheus + Grafana. BIRD2 умеет экспортировать метрики. Дашборд с состоянием BGP-сессий и счётчиками маршрутов — 30 минут работы.
Реальный Anycast с PI-блоком. Если у тебя есть PI-блок (Provider Independent) адресов и BGP-сессия с провайдером — схема из этой статьи масштабируется один в один. Добавляешь анонс своего блока в BIRD, провайдер распространяет его в интернет.
Финальный чеклист перед продом
| Пункт | Статус |
|---|---|
| WireGuard туннель установлен, handshake свежий | ✅ |
| BGP-сессия Established на обоих узлах | ✅ |
| Anycast IP виден в таблице маршрутов ядра | ✅ |
| Nginx слушает на Anycast IP, отвечает на curl | ✅ |
| Failover проверен вручную — трафик переключается | ✅ |
| Фаервол закрывает BGP (179) снаружи, открыт только через wg0 | ✅ |
| Мониторинг BGP-сессий настроен | ✅ |
| WireGuard и BIRD добавлены в автозапуск | ✅ |
Есть вопросы по конфигу или упёрся в ошибку, которой нет в «Осложнениях»? Пиши в комментарии — отвечаю по делу, без «попробуй переустановить систему».
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →


