571 lines
16 KiB
Bash
571 lines
16 KiB
Bash
#!/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 "$@" |