- ISP Servis: Настройка BGP na Linux a Bsd (Quagga)
- Ещё один блог сисадмина
- воскресенье, 22 сентября 2019 г.
- Настройка BGP в Quagga
- Установка пакетов
- Настройка демона zebra
- Настройка демона bgpd
- Белый список маршрутов
- Чёрный список маршрутов
- Фильтрация исходящих анонсов
- Применение политик без разрыва сеансов BGP
- Описание соседей
- Группировка настроек соседей
- Ограничение доступа к терминалу
- Анонсирование адреса Loopback-интерфейса
ISP Servis: Настройка BGP na Linux a Bsd (Quagga)
Настройка BGP na Linux a Bsd (Quagga)
Установка Quagga достаточно простая, например, для пользователей OS Debian Linux достаточно ввести команду sudo apt-get install quagga, и пакет quagga будет установлен за несколько минут. Все файлы конфигурации хранятся в /etc/quagga. Для запуска BGP нам понадобится работать с 3 файлами — daemons для выбора процессов, которые будут запускаться при старте quagga, zebra.conf (файл, который отвечает за общую конфигурацию сетевых параметров), bgpd.conf (конфигурация самого bgpd процесса).
Ниже рассмотрим конфигурацию небольшого ISP, который имеет в наличие один border AS роутер и двух провайдеров, через которых проходит весь его трафик. См. рисунок.
Daemons
Настройка daemons тривиальна — zebra=yes, bgpd=yes. Этим мы добились того, чтобы при старте через /etc/init.d/quagga start всегда запускались процессы zebra и bgpd.
zebra.conf
Синтаксис в zebra и bgpd очень близок Ciscо IOS
!
! Zebra configuration saved from vty
! 2010/08/19 21:29:23
!
hostname zebraAlex
password xxxxxxxxxxxxxx
enable password xxxxxxxxxxxxxx
log file /var/log/quagga/zebra.log
!
debug zebra events
debug zebra packet
!
interface eth0
ip address 192.168.255.25/29
ipv6 nd suppress-ra
!
interface eth1
ip address 10.10.10.102/30
ipv6 nd suppress-ra
!
interface eth2
ip address 109.205.240.1/24
ip address 109.205.245.1/24
ip address 109.205.246.1/24
ipv6 nd suppress-ra
!
ip route 109.205.240.0/21 Null0 254
!
ip forwarding
!
!
line vty
exec-timeout 0 0
Кто знаком с Cisco настройками, сразу определит, что мы имеем 3 ethernet интерфейса — eth0 и eth1 используются для соединения с нашими провайдерами, а eth2 смотрит внутрь нашей собственной сети, которая выглядит следующим образом — 109.205.240.0/21.
Команда ip route с направлением маршрута в Null означает, что при любых сбоях на физическом/сетевом уровнях наших интерфейсов, наша сеть будет для данного роутера всегда доступна и через BGP всегда будет видна нашим соседям.
hostname AS12345
password xxxxxxxxxxxx
enable password xxxxxxxxxxx
log file /var/log/quagga/bgpd.log
log stdout
!
router bgp 12345
bgp router-id 192.168.255.25
bgp log-neighbor-changes
network 109.205.240.0/21
От поля router bgp до поля network указывается основная настройка BGP процесса.
12345 — номер AS который вы получите от RIPE NCC.
Bgp router-id — IP-адрес который вы получите от вашего провайдера, будет также использоваться как идентификатор BGP роутера. Network — показывает какой prefix будете анонсировать из вашей AS.
Далее следует настройка пиринг партнеров BGP —
neighbor 192.168.255.29 remote-as 11111
neighbor 192.168.255.29 description ISP1
neighbor 192.168.255.29 next-hop-self
neighbor 192.168.255.29 soft-reconfiguration inbound
neighbor 192.168.255.29 route-map ISP1-in in
neighbor 192.168.255.29 route-map ISP1-out out
neighbor 10.10.10.101 remote-as 22222
neighbor 10.10.10.101 description ISP2
neighbor 10.10.10.101 next-hop-self
neighbor 10.10.10.101 soft-reconfiguration inbound
neighbor 10.10.10.101 route-map ISP2-in in
neighbor 10.10.10.101 route-map ISP2-out out
Neighbor и все что дальше следует, является настройкой BGP соединения с каждым провайдером, в нашем случае 192.168.255.29 — это ISP1 и 10.10.10.101 — это ISP2.
Поля Neighbor 192.168.255.29, и далее — это настройка BGP соединения для первого ISP. В нашем случае это резервный канал, он же ISP1.
Password строка определяет MD5 пароль, который используется для BGP соединения. Пароль должен быть установлен как в нашей сети так и у ISP1.
Последние две строки — настройка двух route map для входящих и исходящих путей от/в ISP1.
Для всех полученных от ISP1 маршрутов используется правило ISP1-in, а для всех посланных ISP1 маршрутов используем ISP1-out.
Таким же способом настраиваем параметры BGP соединения для ISP2.
ip prefix-list bogons description bogus nets
ip prefix-list bogons seq 20 permit 127.0.0.0/8 le 32
ip prefix-list bogons seq 30 permit 10.0.0.0/8 le 32
ip prefix-list bogons seq 35 permit 172.16.0.0/12 le 32
ip prefix-list bogons seq 40 permit 192.168.0.0/16 le 32
ip prefix-list bogons seq 45 permit 169.254.0.0/16 le 32
ip prefix-list bogons seq 50 permit 224.0.0.0/4 le 32
ip prefix-list bogons seq 55 permit 240.0.0.0/4 le 32
ip prefix-list our-CIDR-blocks seq 5 permit 109.205.240.0/21 le 32
ip prefix-list upstream-out seq 10 permit 109.205.240.0/21
!
ip as-path access-list 1 permit _64512_
ip as-path access-list 1 permit _64593_
ip as-path access-list 1 permit _64797_
ip as-path access-list 1 permit _65376_
Ip prefix list a ip-as path access list — команды для настройки фильтров.
В этом случае к фильтру bogons добавим все сети Bogon, которые не хотим принимать в нашу AS.
В as-path access-listu 1 определим номера приватных AS, которые нам также не нужны в нашем BGP маршрутизаторе.
route-map ISP1-in deny 100
match as-path 1
!
route-map ISP1-in deny 110
match ip address prefix-list bogons
!
route-map ISP1-in deny 120
match ip address prefix-list our-CIDR-blocks
!
route-map ISP1-in permit 200
set local-preference 100
!
route-map ISP1-out permit 100
match ip address prefix-list upstream-out
set as-path prepend 12345 12345 12345 12345 12345
!
route-map ISP1-out deny 200
Описание route map для ISP1-in-
по-порядку от самого низкого номера правила:
match as-path 1 — запрет приема в апдейтах роуты приватных AS номеров. См. ip as-path access-list 1
match ip address prefix-list bogons — запрет на прием приватных сетей IP
match ip address prefix-list our-CIDR-blocks — запрет на прием собственных адресов из Интернета
set as-path prepend — продлеваем путь к нашей сети через первого провайдера на 5 АС номеров. Т.е. все внешние BGP роутеры распознают этот маршрут как Backup.
set local-preference 100 — настроить для всего трафика, который будет проходить через ISP1 дальше в Интернет local-preference 100
Local-preference a weight — это параметры, используемые в BGP4 для контроля исходящего трафика внутри AS (local preference), или внутри одного роутера в случае с weight.
route-map ISP2-in deny 100
match as-path 1
!
route-map ISP2-in deny 110
match ip address prefix-list bogons
!
route-map ISP2-in deny 120
match ip address prefix-list our-CIDR-blocks
!
route-map ISP2-in permit 200
set local-preference 200
!
route-map ISP2-out permit 100
match ip address prefix-list ourIP
!
route-map ISP2-out deny 200
Описание route map для ISP2:
Речь пойдет о настройках для главного подключения.
Они схожи с настройками для резервного подключения, однако существуют два больших отличия.
a. не установлен as path prepending. Это означает, что внешние BGP роутеры распознают этот маршрут как наиболее короткий и пошлют сюда свой трафик.
b. все входящие маршруты полученные от ISP2 получат local preference 200, который выше чем у маршрутов резервного подключения, означает это, что исходящий трафик со всей AS будет передаваться через этот маршрут и этого пира.
Мы также можем установить set weight 200 — т.е. маршруты ISP2 получат высокий приоритет ещё и локально на роутере.
Источник
Ещё один блог сисадмина
воскресенье, 22 сентября 2019 г.
Настройка BGP в Quagga
Понадобилось на работе настроить динамическую маршрутизацию по протоколу BGP, чтобы сэкономить время на настройке статических маршрутов. Поэкспериментировал для начала на виртуальных машинах на домашнем компьютере, подготовил для себя шпаргалку. На работе настраивал свои серверы в паре с сетевым администратором, который со своей стороны настраивал аппаратные маршрутизаторы. (Данила, если ты это читаешь, то передаю тебе привет!) Когда работа была выполнена, дополнил шпаргалку несколькими полезными разделами.
Через пару месяцев понадобилось вернуться к настройке BGP по ещё двум поводам. Во-первых, на одной из виртуальных машин в целях резервирования анонсы нужно было принимать сразу от двух соседних маршрутизаторов. Во-вторых, понадобилось настроить сервер, который сам в целях резервирования должен быть доступен через два соседних маршрутизатора. Конфигурацию этого сервера проверил и дополнил другой сетевой администратор. (Андрей, тебе тоже привет!) В результате добавил в шпаргалку ещё несколько пунктов.
По обыкновению выбрасываю отработанный материал в мусоркублог.
Установка пакетов
Настройка демона zebra
Демон zebra выполняет роль прослойки между операционной системой и демонами динамической маршрутизации. Демоны динамической маршрутизации выступают в роли клиентов демона zebra и пользуются его API.
Первоначальная настройка демона zebra проста, нужно создать файл конфигурации /etc/quagga/zebra.conf с содержимым следующего вида:
После этого можно включать автозапуск демона при загрузке системы и запустить сам демон маршрутизации:
Дальнейшее управление демоном, в том числе его конфигурирование, можно осуществлять при помощи команды telnet:
Через telent доступен интерфейс командной строки, похожий на интерфейс командной строки устройств Cisco. После изменения настроек не забывайте сохранять их при помощи команды write.
Я настраивал демона на двух тестовых виртуальных машинах с именами bgp1 и bgp2.
Настройка демона bgpd
Демон bgpd реализует поддержку протокола динамической маршрутизации BGP.
Для первоначальной настройки демона bgpd нужно создать файл /etc/quagga/bgpd.conf.
На первой виртуальной машине содержимое файла конфигурации было примерно таким:
Эта виртуальная машина лишь анонсирует две сети на вторую виртуальную машину. Номера автономных систем на обеих виртуальных машинах одинаковы и взяты из диапазона 64496-64511 для примеров и документации. Поскольку используются одинаковые номера автономных систем, то в нашем случае будет использоваться вариант протокола iBGP — внутренний протокол пограничных шлюзов.
На второй виртуальной машине содержимое файла конфигурации было примерно следующим:
Эта виртуальная машина не анонсировала своих сетей, зато принимала анонсы от первой.
После первоначальной настройки можно на обеих виртуальных машинах включить автозапуск демонов bgpd при загрузке системы и запустить их:
Подобно демону zebra, управление и настройку демона bgpd можно осуществлять при помощи команды telnet:
Точно так же через telent доступен интерфейс командной строки, похожий на интерфейс командной строки устройств Cisco. После изменения настроек не забывайте сохранять их при помощи команды write.
Белый список маршрутов
Рассмотрим конфигурирование демона bgpd через telnet. Для примера настроим фильтрацию маршрутов на второй виртуальной машине. Для начала подключаемся через telnet:
Вводим пароль, который был указан в опции password.
Далее повышаем собственные привилегии при помощи команды enable. В ответ на запрос команды enable вводим пароль, который был указан в опции enable password.
Далее переходим в режим настройки при помощи команды configure terminal:
Настроим сначала список префиксов, который назовём PREFIX-LIST-FROM-BGP1:
Теперь создадим на основе этого списка префиксов маршрутную карту с именем MAP-FROM-BGP1:
Добавим в маршрутную карту список префиксов PREFIX-LIST-FROM-BGP1:
И покинем диалог настройки маршрутной карты:
Осталось немного. Переходим в режим настройки протокола динамической маршрутизации bgp:
Добавим созданную маршрутную карту для фильтрации маршрутов, получаемых от соседа:
Покидаем режим настройки bgp:
Сохраняем изменения конфигурации на диск:
Осталось выйти из режима конфигурирования:
В процессе настройки из любого режима можно проверять правильность каждой введённой команды, просматривая текущий файл конфигурации при помощи команды show running-config:
Чтобы посмотреть текущую таблицу маршрутов, можно воспользоваться командой show ip bgp:
Если нужно применить новый или изменённый фильтр к уже принятым маршрутам, можно воспользоваться командой clear ip bgp такого вида:
После этого все маршруты, не разрешённые маршрутной картой явным образом, должны пропасть из списка текущих маршрутов.
Чёрный список маршрутов
Цель настройки динамической маршрутизации заключается в том, чтобы перестать добавлять статические маршруты в систему вручную. Однако, если вместо этого придётся добавлять те же самые маршруты в белый список, то ручной работы не станет меньше. В большинстве случаев достаточно просто принимать все маршруты безо всякой фильтрации, но иногда может понадобиться не принимать маршруты до отдельных сетей. В таком случае поможет чёрный список маршрутов.
Не буду повторять предыдущий раздел, а расскажу кратко. Поскольку логика фильтрации обратная — нужно отбрасывать маршруты из списка, а не принимать их, то в маршрутной карте действие permit заменяется на deny:
В списке префиксов действия permit не меняется. Чтобы отбросить анонсы сети 169.254.254.0/24, нужно поместить в список одну запись:
Также может потребоваться не принимать анонсы маршрутов не только с точно совпадающим префиксом, но и анонсы маршрутов ко всем сетям, находящимся внутри указанной. Сделать это можно следующим образом:
Выражение «le 32» означает, что условию удовлетворяют не только сети с префиксом 169.254.253.0/24, но и со всеми префиксами с длиной меньше 32 или равными 32. Например, если маршрутизатор BGP1 будет анонсировать маршруты к сетям 169.254.253.0/25 и 169.254.253.128/26, то оба анонса будут отброшены маршрутной картой.
Фильтрация исходящих анонсов
Сетевые администраторы рекомендуют создавать маршрутную карту не только для принимаемых маршрутов, но и для анонсируемых. Двойная защита позволяет застраховаться от непредусмотренных ошибок, допущенных при конфигурации одного из узлов.
Делается это аналогично фильтрации принимаемых маршрутов, с той лишь разницей, что ключевое слово in нужно заменить на out и прописать имя соответствующей маршрутной карты:
Если маршрутизатор должен только принимать анонсы, то такая маршрутная карта будет выглядеть следующим образом:
Применение политик без разрыва сеансов BGP
При изменении маршрутных карт и списков префиксов, чтобы новые политики фильтрации вступали в силу, нужно выполнять команду следующего вида:
Эта команда разрывает сеанс BGP с соседним маршрутизатором и устанавливает его заново. При этом соседний маршрутизатор вновь анонсирует весь список маршрутов, который и подвергается фильтрации.
Чтобы не разрывать сеансы BGP только лишь для того, чтобы применить новые политики фильтрации маршрутов, сетевые администраторы рекомендуют включить для соседа режим мягкой переконфигурации:
В этом режиме сеанс BGP с соседним маршрутизатором не разрывается, а фильтрация применяется к уже принятому ранее списку маршрутов.
Описание соседей
Группировка настроек соседей
Рассмотрим случай, когда необходимо настроить соседство с двумя маршрутизаторами, настройки которых в целом должны быть идентичны. В примере ниже маршрутизатор с именем bgp3 и IP-адресом 169.254.252.10 соседствует с маршрутизаторами bgp1 и bgp2, имеющими IP-адреса 169.254.252.5 и 169.254.252.6 соответственно:
Настройки соседей по замыслу должны быть идентичными, но из приведённой выше конфигурации это не очевидно. Если конфигурацию будет читать другой системный администратор, то ему во-первых придётся прочитать довольно много, во-вторых первоначальный замысел может оказаться для него не очевидным. Он может изменить настройки одного из соседей, но забыть поправить подобным образом настройки второго соседа.
Первое, что приходит в голову — это объединить списки префиксов и маршрутные карты:
Конфигурация стала короче, замысел стал более понятным, но всё ещё есть возможность поменять настройки одного маршрутизатора, не меняя настройки второго. Настройки соседей можно сгруппировать:
Теперь оба соседа состоят в одной группе и их настройки объединены, так что будут меняться только одновременно, если специально не отделить их друг от друга. Получившийся файл конфигурации стал короче и нагляднее.
Ограничение доступа к терминалу
Анонсирование адреса Loopback-интерфейса
Если BGP настраивается на сервере для того, чтобы сервер был доступен через два маршрутизатора, то IP-адрес сервера, анонсируемый соседям по протоколу BGP, настраивается не на физическом интерфейсе, а на так называемом Loopback-интерфейсе.
В Debian я не нашёл способа создать отдельный петлевой интерфейс, поэтому анонсируемый IP-адрес можно добавить на один-единственный петлевой интерфейс lo в качестве дополнительного IP-адреса. Сделать это можно при помощи команды следующего вида:
Чтобы дополнительный IP-адрес назначался интерфейсу lo при перезагрузке сервера, нужно в файле /etc/network/interfaces прописать аналогичные настройки:
После этого нужно:
- настроить демона, который реализует необходимый сервис, так чтобы он принимал входящие подключения только на этот IP-адрес,
- разрешить соответствующий трафик в пакетном фильтре,
- добавить IP-адрес в конфигурацию демона bgpd.
При выполнении последнего пункта стоит учесть правила хорошего тона и создать отдельную маршрутную карту на исходящие анонсы, которая будет разрешать демону bgpd анонсировать соседям только этот IP-адрес. Например, если сервер должен принимать от маршрутизаторов только маршруты по умолчанию, а анонсировать в их сторону только Loopback-адрес 169.254.251.1, то конфигурация может выглядеть следующим образом:
На случай, если демон bgpd аварийно завершится, можно добавить в демоне zebra статический маршрут по умолчанию с низким приоритетом через одного из соседей:
Источник