Переписан BGP сервер на FRR
This commit is contained in:
+64
-54
@@ -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()
|
||||
Reference in New Issue
Block a user