Анонсируем Full-View на изолированном стенде

в 9:50, , рубрики: BGP, frr, full-view, linux, vmx

Дано: изолированная среда виртуализации VMware.

Задача: Поднять Juniper vMX и анонсировать на него несколько Full-View.

Схема стенда:

Схема стенда

Схема стенда

Схема потребовалась для тестов во время разработки одного из компонентов нашего сервиса по управлению аплинками и в процессе количество VM с анонсами было увеличено. Этот стенд использовался для сбора BMP и NetFlow с маршрутизатора и последующего анализа. В процессе работы генерировался трафик между различными виртуальными машинами, частично отключались анонсы, изменялись политики маршрутизации и выключались аплинки, что имитировало продуктивное окружение

Официальный гайд для установки vMX: тут главное не забывать использовать интерфейсы VMXNET3, иначе работать не будут, по умолчанию все новые добавлялись как E1000.

Где взять все маршруты Интернета (Full-View)

Routeview публикует BGP RIB дампы в формате MRT TABLE DUMP V2, вы можете найти архив с этими данными здесь. Также дампы можно найти в RIPE.

Извлечь информацию из MRT-дампа можно утилитой bgpdump.

bgpdump -m rib.20250212.1600 > raw_full_view.txt

Так выглядят часть полученного файла:

TABLE_DUMP2|1739376000|B|87.121.64.4|57463|1.23.150.0/24|57463 9498 55410 55410 55410 55410 55410 55410 45528 45528 45528 45528 45528|IGP|87.121.64.4|0|0|0:52320 0:61568 17:1131 64700:13538 65400:1 65400:65400|NAG||
TABLE_DUMP2|1739376000|B|45.61.0.85|22652|1.23.150.0/24|22652 9498 55410 55410 55410 55410 55410 55410 45528 45528 45528 45528 45528|IGP|45.61.0.85|0|0|9498:2 9498:11 9498:91 9498:55410 34111:9498 34911:9498 40510:9498|NAG||
TABLE_DUMP2|1739376000|B|202.73.40.45|18106|1.23.150.0/24|18106 9498 55410 55410 55410 55410 55410 55410 45528 45528 45528 45528 45528|IGP|202.73.40.45|0|0|9989:2000|NAG||
TABLE_DUMP2|1739376000|B|89.149.178.10|3257|1.23.150.0/24|3257 9498 55410 55410 55410 55410 55410 55410 45528 45528 45528 45528 45528|IGP|89.149.178.10|0|10|3257:4000 3257:8863 3257:50002 3257:50121 3257:51200 3257:51202|NAG||
TABLE_DUMP2|1739376000|B|147.28.7.2|3130|1.23.150.0/24|3130 174 9498 55410 55410 55410 55410 55410 55410 45528 45528 45528 45528 45528|IGP|147.28.7.2|0|0|174:21001 174:22013 3130:394|NAG||
TABLE_DUMP2|1739376000|B|168.209.255.56|3741|1.23.150.0/24|3741 3491 9498 55410 55410 55410 55410 55410 55410 45528 45528 45528 45528 45528|IGP|168.209.255.56|0|0||NAG||

Парсим данные

Напишем скрипт full_view_parser для парсинга "сырых" данных, результатом будет файл с уникальными префиксами:

#!/usr/bin/env python3

import sys

# Проверяем, переданы ли аргументы
if len(sys.argv) < 3:
    print("Использование: python3 script.py path/to/your/input_file.txt path/to/your/output_file.txt")
    sys.exit(1)

input_file_path = sys.argv[1]
output_file_path = sys.argv[2]

prefixes = set()
# Открываем входной файл и обрабатываем его построчно
try:
    with open(input_file_path, 'r', encoding='utf-8') as file:
        for line in file:
            parts = line.strip().split('|')
            if len(parts) > 5:
                prefix = parts[5].strip()
                prefixes.add(prefix)
except FileNotFoundError:
    print(f"Файл '{input_file_path}' не найден.")
    sys.exit(1)
except Exception as e:
    print(f"Произошла ошибка: {e}")
    sys.exit(1)
# Сохраняем уникальные префиксы в выходной файл
try:
    with open(output_file_path, 'w', encoding='utf-8') as output_file:
        for prefix in prefixes:
            output_file.write(prefix + 'n')

except Exception as e:
    print(f"Произошла ошибка при записи в файл: {e}")
    sys.exit(1)

Запускаем скрипт:

./full_view_parser.py raw_full_view.txt parsed_full_view.txt

Проверяем первые 10 строк:
# head -n 10 parsed_full_view.txt
117.185.16.0/22
204.108.158.0/24
147.110.176.0/24
96.47.56.0/24
38.105.209.0/24
185.107.20.0/24
41.220.48.0/20
165.225.76.0/22
185.84.184.0/22
23.217.172.0/22

Количество строк в файле:
# cat parsed_full_view.txt | wc -l
1 029 874


Похоже на правду

Route table на VM

Анонсировать Full-View будем с виртуальной машины, для этого необходимо установить все префиксы из файла в таблицу маршрутизации, иначе BGP не будет их анонсировать своему пиру.

Напишем скрипт add_route, который добавит маршруты в blackhole:

#!/bin/bash

# Укажите путь к файлу с маршрутами
ROUTES_FILE="parsed_full_view.txt"

# Проверяем, существует ли файл
if [[ ! -f "$ROUTES_FILE" ]]; then
  echo "Файл не найден: $ROUTES_FILE"
  exit 1
fi

# Читаем файл построчно и добавляем маршруты
while IFS= read -r prefix; do
  if [[ -n "$prefix" ]]; then
    echo "Добавляем маршрут: $prefix"
    ip route add blackhole "$prefix"
  fi
done < "$ROUTES_FILE"

echo "Все маршруты добавлены."

Время выполнения: 31m 2s

Настройка FRR

В качестве сервиса, реализующего протокол BGP используем FRR.

Конфигурация стандартная:

# cat /etc/frr/frr.conf
frr version 8.4.4
frr defaults traditional
hostname fake-isp1
log syslog informational
service integrated-vtysh-config
!
router bgp 64106
 neighbor 192.168.10.6 remote-as 64110
 !
address-family ipv4 unicast
redistribute kernel
neighbor 192.168.10.6 prefix-list accept_all out
 exit-address-family
exit
!
ip prefix-list accept_all seq 5 permit any
!

Добавленные на VM маршруты видны как kernel route, поэтому для перераспределения маршрутов kernel в BGP используется команда redistribute kernel:

# vtysh

Hello, this is FRRouting (version 8.4.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

fake-isp# sh ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
    O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
    T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
    f - OpenFabric,
    > - selected route, * - FIB route, q - queued, r - rejected, b - backup
    t - trapped, o - offload failure

K>* 1.1.105.0/24 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.1.149.0/24 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.4.143.0/24 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.4.192.0/18 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.6.19.0/24 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.6.42.0/24 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.6.66.0/24 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.6.134.0/23 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.7.4.0/24 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.7.140.0/24 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.7.143.0/24 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.7.201.0/24 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.10.131.0/24 [0/0] unreachable (blackhole), 6d18h50m
K>* 1.10.170.0/24 [0/0] unreachable (blackhole), 6d18h50m

Проверяем полученные маршруты на vMX:

> show bgp neighbor 192.168.10.5 | match "Received prefixes"
  Received prefixes:      1029880 

Далее потребовалось настроить еще несколько VM с уже меньшим количеством префиксов (10k и 20k), для этого можно взять первые 10k и 20k строк в файле и повторить настройки:

head -n 10000 parsed_full_view.txt > 10k.txt
head -n 20000 parsed_full_view.txt > 20k.txt

P.S. Использовался именно Juniper vMX для того чтобы создать условия, максимально приближенные к production.

Автор: eleslon

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js