#!/bin/bash # BGP Server Installation Script for Ubuntu 24.04 # Устанавливает BIRD и настраивает BGP сервер set -e # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Функции для вывода print_info() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # Проверка на root права check_root() { if [[ $EUID -ne 0 ]]; then print_error "Этот скрипт должен быть запущен с правами root" exit 1 fi } # Получение IP адреса сервера get_server_ip() { # Попытка получить основной IP адрес local ip=$(ip route get 8.8.8.8 | awk '{print $7; exit}' 2>/dev/null) if [[ -z "$ip" ]]; then # Альтернативный способ ip=$(hostname -I | awk '{print $1}' 2>/dev/null) fi if [[ -z "$ip" ]]; then print_warning "Не удалось определить IP адрес, используем 192.168.1.1" ip="192.168.1.1" fi echo "$ip" } # Проверка версии Ubuntu check_ubuntu_version() { if [[ ! -f /etc/os-release ]]; then print_error "Не удалось определить версию ОС" exit 1 fi source /etc/os-release if [[ "$ID" != "ubuntu" ]]; then print_error "Этот скрипт предназначен только для Ubuntu" exit 1 fi if [[ "$VERSION_ID" != "24.04" ]]; then print_warning "Скрипт тестировался на Ubuntu 24.04. Текущая версия: $VERSION_ID" fi print_success "Обнаружена Ubuntu $VERSION_ID" } # Обновление системы update_system() { print_info "Обновление системы..." apt update apt upgrade -y print_success "Система обновлена" } # Установка BIRD install_bird() { print_info "Установка BIRD..." # Установка BIRD2 apt install -y bird2 # Проверка установки if command -v bird &> /dev/null; then print_success "BIRD установлен успешно" else print_error "Ошибка установки BIRD" exit 1 fi } # Создание директорий create_directories() { print_info "Создание директорий..." mkdir -p /var/log/bird mkdir -p /opt/bgp-server/data mkdir -p /opt/bgp-server/scripts mkdir -p /opt/bgp-server/logs # Установка прав доступа chown -R bird:bird /var/log/bird chmod 755 /opt/bgp-server/scripts print_success "Директории созданы" } # Копирование файлов конфигурации copy_config_files() { print_info "Копирование файлов конфигурации..." # Резервная копия оригинальных конфигураций if [[ -f /etc/bird/bird.conf ]]; then cp /etc/bird/bird.conf /etc/bird/bird.conf.backup.$(date +%Y%m%d_%H%M%S) fi if [[ -f /etc/bird/bird6.conf ]]; then cp /etc/bird/bird6.conf /etc/bird/bird6.conf.backup.$(date +%Y%m%d_%H%M%S) fi # Получение IP адреса сервера local server_ip=$(get_server_ip) print_info "Используется IP адрес: $server_ip" # Создание правильной конфигурации BIRD IPv4 cat > /etc/bird/bird.conf << EOF # BIRD Configuration for BGP Server # Ubuntu 24.04 # Logging configuration log "/var/log/bird/bird.log" all; log stderr all; # Router ID router id $server_ip; # Protocol configuration protocol device { scan time 10; } protocol direct { disabled; } protocol kernel { disabled; } table bgp_table; protocol static { table bgp_table; } protocol bgp { local as 65001; listen bgp port 179; hold time 90; keepalive time 30; startup hold time 240; # Сервер НЕ принимает маршруты от клиентов import none; # Сервер раздает ТОЛЬКО свои статические маршруты export where source = RTS_STATIC; # MD5 аутентификация (опционально) # password "your_bgp_password"; table limit 100000; # Фильтры: не принимаем ничего, раздаем всё import filter { reject; }; export filter { accept; }; } filter community_filter { reject; } function add_community() { # пусто } protocol pipe { table master; peer table bgp_table; import all; export none; } EOF # Создание правильной конфигурации BIRD IPv6 cat > /etc/bird/bird6.conf << EOF # BIRD IPv6 Configuration for BGP Server # Ubuntu 24.04 # Logging configuration log "/var/log/bird/bird6.log" all; log stderr all; # Router ID router id $server_ip; # Protocol configuration protocol device { scan time 10; } protocol direct { disabled; } protocol kernel { disabled; } table bgp_table; protocol static { table bgp_table; } protocol bgp { local as 65001; listen bgp port 179; hold time 90; keepalive time 30; startup hold time 240; # Сервер НЕ принимает маршруты от клиентов import none; # Сервер раздает ТОЛЬКО свои статические маршруты export where source = RTS_STATIC; # MD5 аутентификация (опционально) # password "your_bgp_password"; table limit 100000; # Фильтры: не принимаем ничего, раздаем всё import filter { reject; }; export filter { accept; }; } filter community_filter { reject; } function add_community() { # пусто } protocol pipe { table master; peer table bgp_table; import all; export none; } EOF # Копирование скриптов cp scripts/load_prefixes.py /opt/bgp-server/scripts/ cp scripts/monitor.py /opt/bgp-server/scripts/ # Копирование файла с префиксами cp data/prefixes.txt /opt/bgp-server/data/ # Установка прав на выполнение для скриптов chmod +x /opt/bgp-server/scripts/*.py # Установка правильных прав доступа к конфигурации chown bird:bird /etc/bird/bird*.conf chmod 644 /etc/bird/bird*.conf print_success "Файлы конфигурации созданы и скопированы" } # Настройка firewall configure_firewall() { print_info "Настройка firewall..." # Установка ufw если не установлен if ! command -v ufw &> /dev/null; then apt install -y ufw fi # Разрешение BGP порта ufw allow 179/tcp comment "BGP" # Разрешение SSH ufw allow ssh comment "SSH" # Включение firewall ufw --force enable print_success "Firewall настроен" } # Настройка systemd сервисов configure_services() { print_info "Настройка systemd сервисов..." # Включение автозапуска для bird (IPv4) systemctl enable bird # Проверка существования bird6 сервиса if systemctl list-unit-files | grep -q bird6; then systemctl enable bird6 print_info "BIRD6 сервис найден и включен" else print_warning "BIRD6 сервис не найден, будет использоваться только IPv4" fi # Запуск сервисов systemctl start bird # Проверка статуса bird if systemctl is-active --quiet bird; then print_success "BIRD (IPv4) запущен" else print_error "Ошибка запуска BIRD (IPv4)" systemctl status bird fi # Запуск bird6 если существует if systemctl list-unit-files | grep -q bird6; then systemctl start bird6 if systemctl is-active --quiet bird6; then print_success "BIRD (IPv6) запущен" else print_error "Ошибка запуска BIRD (IPv6)" systemctl status bird6 fi else print_warning "BIRD6 не запущен (сервис не найден)" fi } # Проверка конфигурации check_configuration() { print_info "Проверка конфигурации BIRD..." # Проверка синтаксиса IPv4 конфигурации if bird -p /etc/bird/bird.conf; then print_success "Конфигурация BIRD (IPv4) корректна" else print_error "Ошибка в конфигурации BIRD (IPv4)" print_info "Попытка создания простой конфигурации..." create_simple_config if bird -p /etc/bird/bird.conf; then print_success "Простая конфигурация BIRD (IPv4) создана" else print_error "Не удалось создать рабочую конфигурацию BIRD (IPv4)" exit 1 fi fi # Проверка синтаксиса IPv6 конфигурации if command -v bird6 &> /dev/null; then if bird6 -p /etc/bird/bird6.conf; then print_success "Конфигурация BIRD (IPv6) корректна" else print_warning "Ошибка в конфигурации BIRD (IPv6), будет использоваться только IPv4" fi else print_warning "BIRD6 не установлен, пропускаем проверку IPv6" fi } # Создание простой конфигурации create_simple_config() { local server_ip=$(get_server_ip) print_info "Создание простой конфигурации BIRD с IP: $server_ip" cat > /etc/bird/bird.conf << EOF # Простая конфигурация BIRD для BGP сервера # Ubuntu 24.04 log "/var/log/bird/bird.log" all; log stderr all; router id $server_ip; protocol device { scan time 10; } protocol direct { disabled; } protocol kernel { disabled; } protocol static {} protocol bgp { local as 65001; listen bgp port 179; import none; export where source = RTS_STATIC; import filter { reject; }; export filter { accept; }; } EOF chown bird:bird /etc/bird/bird.conf chmod 644 /etc/bird/bird.conf print_success "Простая конфигурация создана" } # Создание systemd таймера для автоматической загрузки префиксов create_systemd_timer() { print_info "Создание systemd таймера для загрузки префиксов..." # Создание сервиса cat > /etc/systemd/system/bgp-prefix-loader.service << EOF [Unit] Description=BGP Prefix Loader After=bird.service bird6.service [Service] Type=oneshot ExecStart=/usr/bin/python3 /opt/bgp-server/scripts/load_prefixes.py User=root StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target EOF # Создание таймера cat > /etc/systemd/system/bgp-prefix-loader.timer << EOF [Unit] Description=Run BGP Prefix Loader every 5 minutes Requires=bgp-prefix-loader.service [Timer] OnBootSec=1min OnUnitActiveSec=5min Unit=bgp-prefix-loader.service [Install] WantedBy=timers.target EOF # Перезагрузка systemd и включение таймера systemctl daemon-reload systemctl enable bgp-prefix-loader.timer systemctl start bgp-prefix-loader.timer print_success "Systemd таймер создан" } # Создание alias для удобства create_aliases() { print_info "Создание alias команд..." # Добавление в .bashrc root пользователя cat >> /root/.bashrc << EOF # BGP Server Aliases alias bgp-status='python3 /opt/bgp-server/scripts/monitor.py' alias bgp-load='python3 /opt/bgp-server/scripts/load_prefixes.py' alias bgp-monitor='python3 /opt/bgp-server/scripts/monitor.py -c' alias bird-status='systemctl status bird bird6' alias bird-restart='systemctl restart bird bird6' alias bird-logs='journalctl -u bird -f' alias bird6-logs='journalctl -u bird6 -f' EOF print_success "Alias команды добавлены" } # Финальная проверка final_check() { print_info "Выполнение финальной проверки..." # Проверка статуса сервисов echo "" print_info "Статус сервисов:" systemctl status bird --no-pager -l echo "" # Проверка bird6 если существует if systemctl list-unit-files | grep -q bird6; then systemctl status bird6 --no-pager -l else print_warning "BIRD6 сервис не установлен" fi # Проверка прослушивания порта if netstat -tlnp | grep :179; then print_success "BGP порт 179 прослушивается" else print_warning "BGP порт 179 не прослушивается" fi # Проверка конфигурации echo "" print_info "Проверка конфигурации:" if birdc show protocols 2>/dev/null; then print_success "BIRD отвечает на команды" else print_warning "BIRD не отвечает на команды (возможно, нужно время для запуска)" fi # Проверка firewall echo "" print_info "Статус firewall:" ufw status print_success "Установка завершена успешно!" } # Основная функция main() { echo "==========================================" echo "BGP Server Installation Script" echo "Ubuntu 24.04" echo "==========================================" check_root check_ubuntu_version update_system install_bird create_directories copy_config_files configure_firewall configure_services check_configuration create_systemd_timer create_aliases final_check echo "" echo "==========================================" echo "УСТАНОВКА ЗАВЕРШЕНА" echo "==========================================" echo "" echo "Полезные команды:" echo " bgp-status - Показать статус BGP сервера" echo " bgp-load - Загрузить префиксы из файла" echo " bgp-monitor - Непрерывный мониторинг" echo " bird-status - Статус сервисов BIRD" echo " bird-restart - Перезапуск сервисов BIRD" echo " bird-logs - Просмотр логов BIRD" echo "" echo "Файлы конфигурации:" echo " /etc/bird/bird.conf - Конфигурация BIRD IPv4" echo " /etc/bird/bird6.conf - Конфигурация BIRD IPv6" echo " /opt/bgp-server/data/prefixes.txt - Файл с префиксами" echo "" echo "Логи:" echo " /var/log/bird/bird.log - Логи BIRD IPv4" echo " /var/log/bird/bird6.log - Логи BIRD IPv6" echo "" echo "Для применения изменений выполните:" echo " source /root/.bashrc" echo "" } # Запуск основной функции main "$@"