Переписан BGP сервер на FRR

This commit is contained in:
2025-07-11 18:06:07 +07:00
parent 3c5740784b
commit e197dae9f7
14 changed files with 1222 additions and 812 deletions
+64 -54
View File
@@ -1,85 +1,95 @@
#!/usr/bin/env python3
"""
Скрипт для генерации конфигурации ExaBGP из переменных окружения
Скрипт для генерации конфигурации FRR из переменных окружения
"""
import os
import sys
from pathlib import Path
def get_env_var(name: str, default: str) -> str:
def get_env_var(name, default):
"""Получение переменной окружения с значением по умолчанию"""
return os.environ.get(name, default)
def generate_exabgp_config():
"""Генерация конфигурации ExaBGP"""
def generate_frr_config():
"""Генерация конфигурации FRR"""
# Получение переменных окружения
# Получение настроек из переменных окружения
local_as = get_env_var('BGP_LOCAL_AS', '65000')
router_id = get_env_var('BGP_ROUTER_ID', '192.168.1.100')
neighbor_ip = get_env_var('BGP_NEIGHBOR_IP', '192.168.1.1')
neighbor_as = get_env_var('BGP_NEIGHBOR_AS', '65001')
hold_time = get_env_var('BGP_HOLD_TIME', '90')
keepalive = get_env_var('BGP_KEEPALIVE', '30')
md5_password = get_env_var('BGP_MD5_PASSWORD', '')
log_level = get_env_var('BGP_LOG_LEVEL', 'INFO')
log_level = get_env_var('BGP_LOG_LEVEL', 'info')
# Генерация конфигурации
config = f"""# Автоматически сгенерированная конфигурация ExaBGP
process load-prefixes {{
run /app/scripts/load_prefixes.py;
encoder json;
}}
# Конфигурация FRR
config = f"""# FRR Configuration File
# Generated automatically from environment variables
# Глобальные настройки
frr version 8.5.2
frr defaults traditional
hostname bgp-server
log syslog {log_level}
service integrated-vtysh-config
# Настройки BGP
neighbor {neighbor_ip} {{
router-id {router_id};
local-address {router_id};
local-as {local_as};
peer-as {neighbor_as};
# Только исходящие анонсы (не принимаем префиксы)
capability {{
graceful-restart;
}}
# Настройки сессии
hold-time {hold_time};
"""
router bgp {local_as}
bgp router-id {router_id}
bgp log-neighbor-changes
neighbor {neighbor_ip} remote-as {neighbor_as}
neighbor {neighbor_ip} description RouterOS Client
neighbor {neighbor_ip} timers {keepalive} {hold_time}
neighbor {neighbor_ip} capability graceful-restart
neighbor {neighbor_ip} soft-reconfiguration inbound
!
address-family ipv4 unicast
neighbor {neighbor_ip} activate
neighbor {neighbor_ip} route-map OUTBOUND out
neighbor {neighbor_ip} route-map INBOUND in
exit-address-family
!
# Добавление MD5 пароля если указан
if md5_password:
config += f" md5-password \"{md5_password}\";\n"
config += f"""
# Логирование
api {{
processes [load-prefixes];
neighbor-changes;
receive {{
parsed;
update;
}}
send {{
parsed;
update;
}}
}}
}}
# Route maps для фильтрации
route-map OUTBOUND permit 10
description Allow all outbound routes
!
route-map INBOUND deny 10
description Deny all inbound routes (receive-only mode)
!
# Настройки интерфейса
interface eth0
ip address {router_id}/24
!
# Статические маршруты (будут добавлены динамически)
# ip route 192.168.1.0/24 Null0
"""
return config
def main():
"""Основная функция"""
if len(sys.argv) > 1 and sys.argv[1] == '--print':
# Вывод конфигурации в stdout
print(generate_exabgp_config())
else:
# Запись конфигурации в файл
config = generate_exabgp_config()
with open('/app/exabgp.conf', 'w') as f:
try:
# Генерация конфигурации
config = generate_frr_config()
# Запись в файл
config_path = Path('/etc/frr/frr.conf')
config_path.parent.mkdir(parents=True, exist_ok=True)
with open(config_path, 'w') as f:
f.write(config)
print("Configuration generated successfully")
print(f"FRR configuration generated: {config_path}")
print("Configuration content:")
print(config)
except Exception as e:
print(f"Error generating FRR configuration: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()