Files
2025-07-11 19:24:43 +07:00

571 lines
16 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "$@"