Update Docker_RUN.md and load_prefixes.py for improved BGP configuration and logging. Adjusted IP addresses in Docker_RUN.md for consistency and clarity. Enhanced load_prefixes.py with error logging and refined JSON message handling for better robustness during ExaBGP operations.
Build and Push Docker Image / build (push) Successful in 3m22s

This commit is contained in:
2025-07-11 17:58:56 +07:00
parent f76e70aeb3
commit 3c5740784b
2 changed files with 33 additions and 95 deletions
+14 -84
View File
@@ -270,74 +270,23 @@ docker stats bgp-server
| Параметр | Описание | Ваше значение |
|----------|----------|---------------|
| `as=65001` | Ваш AS номер | Ваш AS номер |
| `router-id=192.168.1.1` | Ваш Router ID | Ваш внешний IP или внутренний IP |
| `local.address=192.168.1.1` | Ваш локальный IP | IP адрес вашего роутера |
| `remote.address=192.168.1.100` | IP BGP сервера | IP адрес Docker контейнера |
| `router-id=192.168.0.254` | Ваш Router ID | IP адрес вашего роутера |
| `local.address=192.168.0.254` | Ваш локальный IP | IP адрес вашего роутера |
| `remote.address=192.168.100.99` | IP BGP сервера | IP адрес Docker контейнера |
| `remote.as=65000` | AS BGP сервера | AS номер BGP сервера (по умолчанию 65000) |
### Команды для RouterOS 7.14+
**Попробуйте сначала новый синтаксис:**
**Используйте рабочую конфигурацию с template и connection (см. ниже)**
```routeros
# Создание BGP экземпляра
/routing/bgp/instance
add name=bgp-server as=65001 router-id=192.168.1.1
### Настройка RouterOS 7.14 (рабочая конфигурация)
# Настройка BGP сети
/routing/bgp/network
add network=192.168.1.0/24
# Настройка BGP пира
/routing/bgp/peer
add name=bgp-server remote-address=192.168.1.100 remote-as=65000 instance=bgp-server
# Включение BGP
/routing/bgp/instance set bgp-server disabled=no
# Проверка статуса
/routing/bgp/peer print
/routing/bgp/route print
# Проверка доступных команд (для диагностики)
/routing/bgp/print
/routing/bgp/instance/print
/routing/bgp/peer/print
```
**Если новый синтаксис не работает, используйте старый синтаксис:**
### Альтернативный способ (если первый не работает)
```routeros
# Создание BGP экземпляра
/routing bgp instance
add name=bgp-server as=65001 router-id=192.168.1.1
# Настройка BGP сети
/routing bgp network
add network=192.168.1.0/24
# Настройка BGP пира
/routing bgp peer
add name=bgp-server remote-address=192.168.1.100 remote-as=65000 instance=bgp-server
# Включение BGP
/routing bgp instance set bgp-server disabled=no
# Проверка статуса
/routing bgp peer print
/routing bgp route print
```
### Старый синтаксис RouterOS (для версий до 7.14)
**Вариант 1: Использование template и connection (рекомендуется)**
**Использование template и connection:**
```routeros
# Создать шаблон BGP с вашим AS и router-id
/routing bgp template
add as=65001 disabled=no name=bgp-server output.network=bgp-networks .no-client-to-client-reflection=yes router-id=192.168.1.1 routing-table=main
add as=65001 disabled=no name=bgp-server output.network=bgp-networks .no-client-to-client-reflection=yes router-id=192.168.0.254 routing-table=main
# Фильтр на запрет экспорта маршрутов (подстраховка)
/routing filter rule
@@ -345,34 +294,35 @@ add chain=discard disabled=no rule="reject;"
# Фильтр на импорт маршрутов с изменением next-hop
/routing filter rule
add chain=bgp-server-in disabled=no rule="set gw 192.168.1.100; accept;"
add chain=bgp-server-in disabled=no rule="set gw 192.168.100.99; accept;"
# Настройка BGP пира
/routing bgp connection
add connect=yes disabled=no input.filter=bgp-server-in listen=yes local.address=192.168.1.1 .role=ebgp multihop=yes name=bgp-server.network output.filter-chain=discard remote.address=192.168.1.100/32 .as=65000 .port=179 routing-table=main templates=bgp-server
add connect=yes disabled=no input.filter=bgp-server-in listen=yes local.address=192.168.0.254 .role=ebgp multihop=yes name=bgp-server.network output.filter-chain=discard remote.address=192.168.100.99/32 .as=65000 .port=179 routing-table=main templates=bgp-server
# Проверка статуса
/routing bgp connection print
/routing bgp route print
```
### Объяснение параметров конфигурации
**BGP Template:**
- `as=65001` - ваш AS номер
- `router-id=192.168.1.1` - ваш Router ID (обычно внешний IP)
- `router-id=192.168.0.254` - ваш Router ID (IP адрес роутера)
- `output.network=bgp-networks` - сеть для экспорта (создается автоматически)
- `.no-client-to-client-reflection=yes` - отключение отражения между клиентами
**Routing Filter Rules:**
- `chain=discard` - цепочка для отклонения экспортируемых маршрутов
- `chain=bgp-server-in` - цепочка для обработки входящих маршрутов
- `set gw 192.168.1.100` - установка next-hop на IP BGP сервера
- `set gw 192.168.100.99` - установка next-hop на IP BGP сервера
**BGP Connection:**
- `connect=yes` - активное подключение
- `listen=yes` - ожидание входящих подключений
- `local.address=192.168.1.1` - ваш локальный IP
- `remote.address=192.168.1.100/32` - IP BGP сервера
- `local.address=192.168.0.254` - ваш локальный IP
- `remote.address=192.168.100.99/32` - IP BGP сервера
- `remote.as=65000` - AS номер BGP сервера
- `templates=bgp-server` - использование созданного шаблона
@@ -397,26 +347,6 @@ add connect=yes disabled=no input.filter=bgp-server-in listen=yes local.address=
/routing bgp template print
```
**Вариант 2: Использование instance и peer**
```routeros
# Создание BGP экземпляра
/routing bgp instance add name=bgp-server as=65001 router-id=192.168.1.1
# Настройка BGP сети
/routing bgp network add network=192.168.1.0/24
# Настройка BGP пира
/routing bgp peer add name=bgp-server remote-address=192.168.1.100 remote-as=65000 instance=bgp-server
# Включение BGP
/routing bgp instance set bgp-server disabled=no
# Проверка статуса
/routing bgp peer print
/routing bgp route print
```
## Устранение неполадок
### Проблема: Контейнер не запускается
+19 -11
View File
@@ -32,6 +32,10 @@ def log_message(message: str):
# Если не можем записать в файл, просто выводим в stderr
print(f"Warning: Could not write to log file: {e}", file=sys.stderr, flush=True)
def log_error(message: str):
"""Запись ошибки в лог"""
log_message(f"ERROR: {message}")
def validate_prefix(prefix: str) -> bool:
"""Валидация IP префикса"""
try:
@@ -88,13 +92,10 @@ def announce_prefixes(prefixes: Set[str]):
router_id = os.environ.get('BGP_ROUTER_ID', '192.168.1.100')
for prefix in sorted(prefixes):
# Формат команды для ExaBGP
# Формат команды для ExaBGP (упрощенный)
command = {
"command": "announce route",
"neighbor": {
"ip": neighbor_ip,
"description": "RouterOS peer"
},
"neighbor": neighbor_ip,
"attribute": {
"origin": "igp",
"as-path": [local_as],
@@ -115,10 +116,7 @@ def withdraw_prefixes(prefixes: Set[str]):
for prefix in sorted(prefixes):
command = {
"command": "withdraw route",
"neighbor": {
"ip": neighbor_ip,
"description": "RouterOS peer"
},
"neighbor": neighbor_ip,
"nlri": prefix
}
@@ -161,12 +159,22 @@ def main():
if not line:
break
line = line.strip()
if not line: # Пропуск пустых строк
continue
# Обработка команд от ExaBGP
try:
data = json.loads(line.strip())
data = json.loads(line)
log_message(f"Received command: {data}")
except json.JSONDecodeError:
log_message(f"Invalid JSON received: {line.strip()}")
# Не все сообщения от ExaBGP являются JSON
# Это может быть обычное текстовое сообщение
if line.startswith('[') and line.endswith(']'):
# Это может быть лог сообщение от ExaBGP
log_message(f"Received log message: {line}")
else:
log_message(f"Received non-JSON message: {line}")
except KeyboardInterrupt:
log_message("Received interrupt signal")