Протоколы динамической маршрутизации позволяют автоматизировать построение маршрутных таблиц благодаря обмену таблицами между роутерами и корректировке на основе полученной информации. Если изменяется топология или выходит из строя маршрутизатор, новый путь строится автоматически. В RRAS Win 2012 R2 появилась поддержка протокола BGP, возможности которого были дополнены в Win 2016. Самое время разобраться.

 

Протокол BGP

Для настройки динамической маршрутизации Win-админам был доступен OSPF, но вот в Win 2008, многие компоненты которой были переписаны наново, его убрали, не добавив взамен ничего. Вероятно, в MS посчитали, что OSPF не сильно популярен, и в нем не видели необходимости. В настройках остался только статический маршрут и устаревший RIPv2, но последний серьезно уже мало кто воспринимает. Проектов третьих фирм, реализующих поддержку OSPF в Win, также за это время предложено не было, и, чтобы решить вопросы маршрутизации, использовали маршрутизаторы сторонних компаний. Самые отчаянные, чтобы запустить OSPF, ставили VM с устаревшей Win 2003.

Но время шло, виртуализация в MS постепенно набирала обороты, концепция гибридных сетей требовала скорейшего решения проблемы маршрутизации в большом количестве виртуальных сетей и систем. Как результат, в Win 2012 R2 в службе роли маршрутизации и удаленного доступа (routing and remote access service, RRAS) анонсировали поддержку BGPv4. Служба RRAS интегрирована с технологией виртуализации сети Hyper-V и может выполнять маршрутизацию сетевого трафика для множества изолированных виртуальных сетей в том же ЦОД.

Протокол BGP разрабатывался для обмена маршрутной информацией между автономными системами в глобальной Сети. BGP является дистанционно-векторным протоколом, но вместо метрики использует список автономных систем (autonomous system, AS), сквозь которые пролегает маршрут (AS Path), поэтому его рассматривают как маршрутно-векторный (path vector). Метрики устанавливаются вручную, и у разных маршрутов может быть своя маршрутная политика. Многие админы считают его достаточно сложным в настройках. Последняя версия протокола датирована 2006 годом и описана в RFC 4271.

В отличие от RIP, в BGP обмен полными таблицами между маршрутизаторами выполняется только при первом подключении, затем пересылаются лишь сообщения об изменениях, а также keep-alive и служебные сообщения. Основная функция BGP-маршрутизатора — обмен информацией о доступности сетей с другими роутерами. Информация о доступности сетей включает список AS, через которые проходит эта информация. Роутеры, с которыми производится обмен таблицами, называются соседями или пирами (peers). В качестве транспортного протокола BGP использует TCP/179. Под автономной системой понимают множество IP-сетей и роутеров, управляемых одним или несколькими операторами, имеющими единую политику маршрутизации с интернетом. Диапазоны номеров автономных систем (autonomous system number, ASN) назначаются централизованно, но диапазон 64 512–65 534 выделен под приватное использование. Поэтому говорить о том, что BGP используется только для маршрутизации в глобальной Сети, неправильно. Различают:

  • Internal BGP (внутренний BGP, iBGP) — BGP, работающий внутри AS, хотя iBGP-соседи не обязательно должны быть непосредственно соединены;
  • External BGP (внешний BGP, eBGP) — BGP, работающий между автономными системами.

Настройка iBGP и eBGP, за некоторым исключением, одинакова. Оба варианта поддерживаются в реализации от MS, а поэтому RRAS вполне может использоваться для маршрутизации трафика внутри LAN. BGP от MS совместим со всеми устройствами, поддерживающими четвертую версию протокола. Реализованы все стандартные возможности: ECMP (equal-cost multi-path routing), HoldTime-конфигурации, статистика, использование в качестве транспорта IPv4 и IPv6, перепись атрибутов, режимы работы смешанный/пассивный и многое другое.

Единственный момент, к которому нужно быть готовым, — GUI для настройки BGP не предусмотрено. Как и в Win 2012 R2, так и в Win 2016 все настройки BGP делаются исключительно при помощи PowerShell. Модуль в Win 2016 RemoteAccess получил 13 новых командлетов, 9 из которых относятся к настройкам роутинга BGP. Мы посмотрим, как реализовать iBGP. Консоль RRAS позволяет лишь активировать маршрутизатор, но в установках интерфейса по-прежнему можно добавить только правила для DHCP, IGMP, RIP и NAT.

Командлеты для управления BGP
Командлеты для управления BGP
 

Установка маршрутизатора

Чтобы начать работать с BGP, необходимо установить компонент Remote access service (RAS) и/или службу ролей Routing (маршрутизация). Второй вариант позволяет развернуть BGP-маршрутизатор без установки самой службы RAS, то есть когда нужен только роутер, без DirectAccess или VPN. Это уменьшает используемые ресурсы. При помощи диспетчера сервера процедура установки стандартная, выбираем «Удаленный доступ» и при настройке службы ролей — «Маршрутизация». В консоли PowerShell чуть проще:

PS> Install-WindowsFeature Routing

Компонент установлен, но не настроен на выполнение определенных задач. Это можно сделать из консоли «Маршрутизация и удаленный доступ» (RRaS). Открываем, переходим в «Настроить и включить маршрутизацию...» и, следуя указаниям мастера, выбираем конфигурацию. Для BGP нужно отметить «Особая конфигурация» и затем «Маршрутизация локальной сети». По окончании соглашаемся с запуском службы Routing and Remote Access.

Инициируем маршрутизатор при помощи GUI
Инициируем маршрутизатор при помощи GUI

В случае PowerShell используется командлет Install-RemoteAccess, которому нужно указать режим. Один используется для настройки мультитенантной работы, другой для VPN/маршрутизации. Для мультитенантной работы вводим

PS> Install-RemoteAccess -MultiTenancy

И обязательно разрешаем BGP для всех:

PS> Enable-RemoteAccessRoutingDomain -Name example.org -Type All -PassThru

Если нам нужен просто BGP-маршрутизатор в LAN, используем

PS> Install-RemoteAccess -VpnType RoutingOnly

Проверяем текущую конфигурацию, введя Get-RemoteAccess без параметров. Все настройки BGP-маршрутизатора производятся при помощи 31 командлета модуля RemoteAccess. Получить их список легко:

PS> Get-Command *BGP*

Для создания BGP-роутера используется командлет Add-BgpRouter. Минимальная информация, которая ему нужна, — это идентификатор (-BGPIdentifier) и номер AS (-LocalASN). В качестве BGPIdentifier рекомендуется указывать IP-адрес, это упрощает администрирование, хотя, в общем, идентификатор может быть произвольной цифрой и никто не мешает использовать собственную нумерацию. Для внутренних сетей следует использовать AS из приватного диапазона. Во всех командлетах, относящихся к настройке BGP, доступен параметр -RoutingDomain, определяющий домен маршрутизации. Полезен в многопользовательских средах, позволяет разделить маршруты. Мы его использовать не будем.

PS> Add-BgpRouter -BGPIdentifier 192.168.1.2 -LocalASN 64512

Смотрим результат:

PS> Get-BgpRouter
Создаем BGP-роутер
Создаем BGP-роутер

Командлет покажет основные настройки. Изменить значения или установить другие настройки можно при помощи командлета Set-BgpRouter. Например, разрешим IPv6-роутинг:

PS> Set-BgpRouter -IPv6Routing Enable

При необходимости для удаления BGP-роутера используем командлет Remove-BgpRouter. Роутер готов. Роутеры BGP не обнаруживают пиров автоматически, более того, они вообще могут находиться в другой сети, поэтому связь с каждым соседом настраивается вручную. Поэтому нашему маршрутизатору нужно сообщить о соседях, с которыми будет устанавливаться BGP-сессия. Если пир работает под управлением Win 2012 R2 / 16, то подготовительные мероприятия на нем аналогичны ранее описанным. Ведь наш роутер для другого тоже является пиром.

Для подключения пира используется командлет Add-BgpPeer. В качестве параметров необходимо указать его произвольное имя, используемое для удобной идентификации, IP-адрес пира, номер AS и локальный IP, с которого будет устанавливаться соединение. Подключимся к пиру с адресом 192.168.1.100 и укажем его ASN.

PS> Add-BgpPeer -PeerName LAN1 -PeerIPAddress 192.168.1.100 -LocalIPAddress 192.168.1.2 -PeerASN 64513

Теперь роутер попробует присоединиться к пиру по указанному адресу по 179/TCP (следует проверить, не блокируется ли порт файрволом). Аналогичным образом добавляем остальных соседей, поддерживающих обмен BGP. Результат можно проверить, введя Get-BgpPeer. Кроме указанных, у командлета Add-BgpPeer есть ряд параметров, о которых стоит упомянуть:

  • OperationMode — задает режим BGP-маршрутизатора. Допустимые значения: mixed (инициирует и принимает запросы, по умолчанию) и Server (только принимает запросы).
  • PeeringMode — режим для пира. Допустимые значения: Automatic (подключается автоматически) и Manual (ручной запуск при помощи Start-BgpPeer).
  • HoldTimeSec — при отсутствии информации с пира в течение этого времени (в секундах) сессия обрывается и предпринимается попытка переподключения. Значение по умолчанию — 180.
  • IdleHoldTimeSec — время в секундах, в течение которого роутер будет находиться в состоянии Idle после неудачной попытки подключения, то есть через которое повторно попытается подключиться к пиру.
  • Weight — число, указывающее вес узла, означающее приоритет, чем ниже, тем лучше. По умолчанию 32 768.
  • MaxAllowedPrefix — максимальное число сетевых префиксов, которые маршрутизатор получает от пира. Позволяет ограничить количество информации. Например, нам не нужна вся таблица, достаточно маршрута по умолчанию.

Переопределить или сбросить параметры можно при помощи командлета Set-BgpPeer, указав имя пира в параметре -PeerName.

PS> Set-BgpPeer -PeerName LAN1 -Weight 200

В случае если пир не нужен, его удаляют при помощи Remove-BgpPeer.

Подключаем соседей
Подключаем соседей
 

Добавление маршрутов

С инфраструктурой закончили. Роутеры готовы обмениваться таблицами. Но мы пока не указали маршруты, поэтому отсылать нечего. За маршруты отвечает командлет Add-BgpCustomRoute. Самый простой способ — это просто указать сеть (-Network) или интерфейс (-Interface).

PS> Add-BgpCustomRoute -Network "192.168.1.0/24"

Во втором случае в анонс BGP теоретически должны автоматически подхватываться и все статические маршруты, привязанные к интерфейсу, но это происходит почему-то не всегда. Имя адаптера можно узнать при помощи Get-NetAdapter.

PS> Add-BgpCustomRoute -Interface "Ethernet0"

Можно комбинировать оба параметра (Network и Interface), добавляя в анонс сети, с которыми нет непосредственного подключения или которые не указаны в static route.

PS> Add-BgpCustomRoute -Interface "Ethernet0" -Network "192.168.2.0/24"

Протокол BGP поддерживает возможности суммирования (aggregate) маршрутов — очень гибкая функция, позволяющая оптимизировать таблицу благодаря тому, что несколько сетей передаются как один маршрут. В Win 2012 R2 поддержка aggregate реализована еще не была, а в Win 2016 уже появились командлеты Add/Set-BgpRouteAggregate, позволяющие добавлять и изменять aggregate-маршрут. Соберем все сети в один маршрут.

PS> Add-BgpRouteAggregate –Prefix "192.168.0.0/16" -PreserveASPath enable

После добавления маршрутов начнется обмен таблицами, результат можем просмотреть при помощи Get-BgpRouteInformation, статистику — Get-BgpStatistics. Но даже в небольших сетях можно увидеть, что мы получаем от пиров много мусора, а сами отправляем им лишнюю информацию. Для решения этих вопросов используются политики.

Добавляем маршруты
Добавляем маршруты
 

Политики

Практически все упоминавшиеся командлеты позволяют в качестве опций указать, к какой политике относится команда. Все это дает возможность очень тонко настраивать информацию, передаваемую между BGP-роутерами. Настройку серьезных правил лучше начинать с создания политик. За установки политик отвечают командлеты Add/Set-BgpRoutingPolicy и Add/Set-BgpRoutingPolicyForPeer. Первая отвечает собственно за создание политик, вторая позволяет привязать политику к пиру. Начнем с первой.

Параметров у Add-BgpRoutingPolicy много, хотя обязательны только имя (Name) и тип политики (PolicyType). Последний указывает, что будет делать политика, и может принимать три значения: ModifyAttribute (замена атрибутов), Allow (разрешает маршруты, подпадающие под критерии) и Deny (запрещает). Кроме этого, префиксы можно отбирать при помощи четырех критериев: MatchASNRange (диапазон AS), MatchCommunity (комьюнити), MatchNextHop (по NextHop, то есть мы можем программировать политику под определенный маршрут) и MatchPrefix (массив сетевых префиксов). У критерия MatchPrefix есть антипод IgnorePrefix, позволяющий исключить указанный префикс. И конечно, никуда не делся RoutingDomain.

В качестве дополнительных действий определяются NewMED и ClearMED (создание и очистка multi-exit discriminator, MED), NewLocalPref (установка атрибута Local-Pref, передается между iBGP-пирами для определения приоритетного узла), NewNextHop (назначение NextHop, то есть следующего узла для маршрута), AddCommunity и RemoveCommunity (установка и удаление атрибута Community).
Создадим простую политику, которая разрешает все префиксы, кроме локального. Записать можно так:

PS> Add-BgpRoutingPolicy -Name LocalNetPolicy -MatchPrefix "192.168.1.0/24" -PolicyType Allow

Но лучше так:

PS> Add-BgpRoutingPolicy -Name LocalNetPolicy -IgnorePrefix "192.168.1.0/24" -PolicyType Deny

Посмотреть политики можно, введя Get-BgpRoutingPolicy.

Теперь необходимо применить политику к пиру. Параметры Add-BGPRoutingPolicyForPeer в общем стандартные, следует пояснить только -Direction. Он может иметь два значения: Ingress (применяется к входящим префиксам) и Egress (к исходящим).

Применим политику к исходящим префиксам, отправляемым к пиру LAN, теперь ему будет уходить только разрешенный список префиксов.

PS> Add-BgpRoutingPolicyForPeer -PeerName LAN1 -PolicyName “LocalNetPolicy” -Direction Egress

Собирая разные параметры, мы можем реализовать различные схемы. Атрибут Local Preference указывает маршрутизаторам внутри автономной системы, как выйти за ее пределы, и передается только внутри AS. Точка выхода у того роутера, у которого значение выше. При настройках по умолчанию все клиенты будут выходить в Сеть через один роутер, но мы можем настроить политику так, чтобы часть клиентов получала другое значение Local-Pref и использовала, соответственно, другой роутер для выхода:

PS> Add-BgpRoutingPolicy -Name LocalPrefPolicy -PolicyType ModifyAttribute -MatchPrefix 10.10.10.0/24 -NewLocalPref 400
PS> Add-BgpRoutingPolicyForPeer -PeerName LAN1 -PolicyName “LocalPrefPolicy” -Direction Ingress
Создаем новую политику
Создаем новую политику
 

Вывод

Вот, собственно, и все. Несмотря на отсутствие GUI, настройку BGP в Windows вряд ли назовешь запутанной и сложной: понимая процесс, легко можно реализовать любые возможности, заложенные в протоколе.

Оставить мнение