Internet Engineering Task Force (IETF) A. Lindem
Request for Comments: 9403 LabN Consulting, L.L.C.
Category: Standards Track Y. Qu
ISSN: 2070-1721 Futurewei Technologies
November 2023
A YANG Data Model for RIB Extensions
Модель данных YANG для расширений RIB
Аннотация
База маршрутной информации (Routing Information Base или RIB) — это список маршрутов и соответствующих административных данных и административного состояния.
В RFC 8349 определены базовые блоки для построения модели данных RIB, а эта модель дополняет их для поддержки множества следующих узлов (next hop) для каждого маршрута, а также дополнительных атрибутов.
Статус документа
Документ относится к категории Internet Standards Track.
Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.
Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc9403.
Авторские права
Copyright (c) 2023. Авторские права принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.
К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Revised BSD License).
1. Введение
Этот документ задаёт модель данных YANG [RFC7950] расширяющую модель данных RIB из модуля YANG ietf-routing [RFC8349] дополнительными атрибутами маршрутов.
RIB представляет собой набор маршрутов с атрибутами, управляемыми и поддерживаемыми протоколами плоскости управления. Каждая база RIB содержит маршруты лишь для одного семейства адресов [RFC8349]. В рамках протокола маршруты выбираются на основе используемой этим протоколом метрики и протокол помещает маршруты в RIB. Предпочтительный или активный маршрут RIB выбирает, сравнивая предпочтения (административная дистанция) маршрутов-кандидатов, установленных разными протоколами.
Заданный в этом документе модуль расширяет RIB для поддержки дополнительных атрибутов маршрута, таких как несколько следующих узлов (next hop), метрика маршрута, административные теги.
Рассматриваемые в документе модули YANG соответствуют архитектуре хранилищ данных управления сетью (Network Management Datastore Architecture или NMDA) [RFC8342].
2. Термины и обозначения
В [RFC8342] определены термины:
-
configuration — конфигурация;
-
system state — состояние системы;
-
operational state — рабочее состояние.
В [RFC7950] определены термины:
-
action — действие;
-
augment — дополнение;
-
container — контейнер;
-
container with presence3 — контейнер присутствия;
-
data model — модель данных;
-
data node — узел данных;
-
leaf — лист;
-
list — список;
-
mandatory node — обязательный узел;
-
module — модуль;
-
schema tree — дерево схемы.
В параграфе 5.2 [RFC8349] определён термин RIB.
2.1. Диаграммы деревьев
Деревья в этом документе представлены в нотации [RFC8340].
2.2. Префиксы в именах узлов данных
В этом документе имена узлов данных, действий и других объектов модели данных часто указываются без префикса, если контекст позволяет определить модуль YANG, где это имя задано. В остальных случаях имена указываются со стандартным префиксом соответствующего модуля YANG, как показано в таблице 1.
Таблица : Префиксы и соответствующие им модули YANG.
|
Префикс |
Модуль YANG |
Документ |
|---|---|---|
|
if |
ietf-interfaces |
[RFC8343] |
|
rt |
ietf-routing |
[RFC8349] |
|
v4ur |
ietf-ipv4-unicast-routing |
[RFC8349] |
|
v6ur |
ietf-ipv6-unicast-routing |
[RFC8349] |
|
inet |
ietf-inet-types |
[RFC6991] |
|
ospf |
ietf-ospf |
[RFC9129] |
|
isis |
ietf-isis |
[RFC9130] |
3. Устройство модели
Заданный в этом документе модуль YANG дополняет модули ietf-routing, ietf-ipv4-unicast-routing и ietf-ipv6-unicast-routing, определённые в [RFC8349] и обеспечивающие базу для определения модели данных системы маршрутизации. Вместе с модулем ietf-routing и другими модулями YANG из [RFC8349], базовая модель данных YANG RIB, определённая здесь, служит для реализации и мониторинга RIB.
Модули из [RFC8349] также задают базовую конфигурацию и рабочее состояние для статических маршрутов IPv4 и IPv6. Этот документ задаёт дополнения для статических маршрутов, поддерживающие несколько next hop и дополнительные атрибуты next-hop.
3.1. Теги и предпочтения
Отдельные маршрутные теги поддерживаются как на уровне маршрута, так и на уровне next-hop. Для выбора предпочтительного статического маршрута следующего узла поддерживаются предпочтения по next hop. Ниже приведено дерево с тегамии и предпочтения, дополняющими следующий интервал статических индивидуальных маршрутов IPv4 и IPv6.
augment /rt:routing/rt:control-plane-protocols
/rt:control-plane-protocol/rt:static-routes/v4ur:ipv4
/v4ur:route/v4ur:next-hop/v4ur:next-hop-options
/v4ur:simple-next-hop:
+--rw preference? uint32
+--rw tag? uint32
augment /rt:routing/rt:control-plane-protocols
/rt:control-plane-protocol/rt:static-routes/v4ur:ipv4
/v4ur:route/v4ur:next-hop/v4ur:next-hop-options
/v4ur:next-hop-list/v4ur:next-hop-list/v4ur:next-hop:
+--rw preference? uint32
+--rw tag? uint32
augment /rt:routing/rt:control-plane-protocols
/rt:control-plane-protocol/rt:static-routes/v6ur:ipv6
/v6ur:route/v6ur:next-hop/v6ur:next-hop-options
/v6ur:simple-next-hop:
+--rw preference? uint32
+--rw tag? uint32
augment /rt:routing/rt:control-plane-protocols
/rt:control-plane-protocol/rt:static-routes/v6ur:ipv6
/v6ur:route/v6ur:next-hop/v6ur:next-hop-options
/v6ur:next-hop-list/v6ur:next-hop-list/v6ur:next-hop:
+--rw preference? uint32
+--rw tag? uint32
augment /rt:routing/rt:ribs/rt:rib/rt:routes/rt:route:
+--ro metric? uint32
+--ro tag* uint32
+--ro application-tag? uint32
3.2. Ремонтный путь
Расчёт быстрой перемаршрутизации (IP Fast Reroute или IPFRR) протоколом маршрутизации заранее определяет ремонтные пути [RFC5714] и эти пути помещаются в RIB.
Следующий узел (next hop) каждого маршрута в RIB дополняется ремонтным путём, как показано ниже.
augment /rt:routing/rt:ribs/rt:rib/rt:routes/rt:route
/rt:next-hop/rt:next-hop-options/rt:simple-next-hop:
+--ro repair-path
+--ro outgoing-interface? if:interface-state-ref
+--ro next-hop-address? inet:ip-address-no-zone
+--ro metric? uint32
augment /rt:routing/rt:ribs/rt:rib/rt:routes/rt:route
/rt:next-hop/rt:next-hop-options/rt:next-hop-list
/rt:next-hop-list/rt:next-hop:
+--ro repair-path
+--ro outgoing-interface? if:interface-state-ref
+--ro next-hop-address? inet:ip-address-no-zone
+--ro metric? uint32
4. Дерево модели RIB
Дерево модуля ietf-routing.yang с дополнениями этого документа приведено в Приложении A с нотацией [RFC8340].
5. Модуль YANG RIB Extension
Этот модуль YANG ссылается на [RFC6991], [RFC8343], [RFC8349], [RFC9129], [RFC9130], [RFC5714].
<CODE BEGINS> file "ietf-rib-extension@2023-11-20.yang"
module ietf-rib-extension {
yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-rib-extension";
prefix rib-ext;
import ietf-inet-types {
prefix inet;
reference
"RFC 6991: Common YANG Data Types";
}
import ietf-interfaces {
prefix if;
reference
"RFC 8343: A YANG Data Model for Interface Management";
}
import ietf-routing {
prefix rt;
reference
"RFC 8349: A YANG Data Model for Routing
Management (NMDA Version)";
}
import ietf-ipv4-unicast-routing {
prefix v4ur;
reference
"RFC 8349: A YANG Data Model for Routing
Management (NMDA Version)";
}
import ietf-ipv6-unicast-routing {
prefix v6ur;
reference
"RFC 8349: A YANG Data Model for Routing
Management (NMDA Version)";
}
import ietf-ospf {
prefix ospf;
reference "RFC 9129: YANG Data Model for the OSPF Protocol";
}
import ietf-isis {
prefix isis;
reference "RFC 9130: YANG Data Model for the IS-IS Protocol";
}
organization
"IETF RTGWG (Routing Area Working Group)";
contact
"WG Web: <https://datatracker.ietf.org/wg/rtgwg/>
WG List: <mailto:rtgwg@ietf.org>
Author: Acee Lindem
<mailto:acee.ietf@gmail.com>
Author: Yingzhen Qu
<mailto:yingzhen.qu@futurewei.com>";
description
"Этот модуль YANG расширяет RIB из модуля YANG ietf-routing
дополнительными атрибутами маршрутов.
Модуль YANG соответствует архитектуре NMDA (RFC 8342).
Авторские права (Copyright (c) 2023) принадлежат IETF Trust
и лицам, указанным в качестве авторов кода. Все права защищены.
Распространение и использование в исходной или двоичной форме с
изменениями или без таковых разрешено в соответствии с лицензией
Simplified BSD, изложенной в разделе 4 IETF Trust's Legal
Provisions применительно к документам IETF
(http://trustee.ietf.org/license-info).
Эта версия данного модуля YANG является частью RFC 9403, где
правовые вопросы рассмотрены более полно.";
revision 2023-11-20 {
description
"Исходная версия.";
reference
"RFC 9403: A YANG Data Model for RIB Extensions";
}
/* Группировки */
grouping rib-statistics {
description
"Статистика, применяемая для дополнения RIB.";
container statistics {
config false;
description
"Контейнер для статистики RIB.";
leaf total-routes {
type uint32;
description
"Полное число маршрутов в RIB.";
}
leaf total-active-routes {
type uint32;
description
"Полное число активных маршрутов в RIB. Активными считаются
маршруты, имеющие предпочтение перед другими маршрутами к
тому же префиксу получателей.";
}
leaf total-route-memory {
type uint64;
units "bytes";
description
"Память для всех маршрутов RIB.";
}
list protocol-statistics {
description
"Статистика RIB для протоколов маршрутизации, помещающих
маршруты в RIB.";
leaf protocol {
type identityref {
base rt:routing-protocol;
}
description
"Протокол маршрутизации, помещающий маршруты в RIB.";
}
leaf routes {
type uint32;
description
"Полное число маршрутов в RIB для протокола
маршрутизации, указанного узлом protocol.";
}
leaf active-routes {
type uint32;
description
"Полное число активных маршрутов в RIB для протокола
маршрутизации, указанного узлом protocol. Активными
считаются маршруты, имеющие предпочтение перед другими
маршрутами к тому же префиксу получателей.";
}
leaf route-memory {
type uint64;
units "bytes";
description
"Память для всех маршрутов в RIB для протокола
маршрутизации, указанного узлом protocol.";
}
}
}
}
grouping repair-path {
description
"Группировка для ремонтного пути IP Fast Reroute (IPFRR).";
container repair-path {
description
"IPFRR next-hop для ремонтного пути.";
leaf outgoing-interface {
type if:interface-state-ref;
description
"Имя выходного интерфейса.";
}
leaf next-hop-address {
type inet:ip-address-no-zone;
description
"IP-адрес следующего узла.";
}
leaf metric {
type uint32;
description
"Метрика ремонтного пути. Хотя этот путь является локальным
и его метрика не анонсируется наружу, она полезна для
поиска и устранения неполадок.";
}
reference
"RFC 5714: IP Fast Reroute Framework";
}
}
augment "/rt:routing/rt:control-plane-protocols/"
+ "rt:control-plane-protocol/rt:static-routes/v4ur:ipv4/"
+ "v4ur:route/v4ur:next-hop/v4ur:next-hop-options/"
+ "v4ur:simple-next-hop" {
description
"Дополнение simple-next-hop в индивидуальном маршруте IPv4.";
leaf preference {
type uint32;
default "1";
description
"Предпочтение служит для выбора среди статических маршрутов.
Предпочтительны маршруты с меншим значением preference, а
одинаковые значения ведут к статическим маршрутам с
равноценными путями (Equal-Cost Multipath или ECMP).";
}
leaf tag {
type uint32;
default "0";
description
"Связанный с маршрутом 32-битовый не анализируемый тег,
который может применяться в решениях на основе правил,
например для анонсирования или фильтрации маршрута.";
}
}
augment "/rt:routing/rt:control-plane-protocols/"
+ "rt:control-plane-protocol/rt:static-routes/v4ur:ipv4/"
+ "v4ur:route/v4ur:next-hop/v4ur:next-hop-options/"
+ "v4ur:next-hop-list/v4ur:next-hop-list/v4ur:next-hop" {
description
"Дополнение конфигурации статического маршрута next-hop-list.";
leaf preference {
type uint32;
default "1";
description
"Предпочтение служит для выбора среди статических маршрутов.
Предпочтительны маршруты с меншим значением preference, а
одинаковые значения ведут к статическим маршрутам с
равноценными путями (Equal-Cost Multipath или ECMP).";
}
leaf tag {
type uint32;
default "0";
description
"Связанный с маршрутом 32-битовый не анализируемый тег,
который может применяться в решениях на основе правил,
например для анонсирования или фильтрации маршрута.";
}
}
augment "/rt:routing/rt:control-plane-protocols/"
+ "rt:control-plane-protocol/rt:static-routes/v6ur:ipv6/"
+ "v6ur:route/v6ur:next-hop/v6ur:next-hop-options/"
+ "v6ur:simple-next-hop" {
description
"Дополнение simple-next-hop в индивидуальном маршруте IPv6.";
leaf preference {
type uint32;
default "1";
description
"Предпочтение служит для выбора среди статических маршрутов.
Предпочтительны маршруты с меншим значением preference, а
одинаковые значения ведут к статическим маршрутам с
равноценными путями (Equal-Cost Multipath или ECMP).";
}
leaf tag {
type uint32;
default "0";
description
"Связанный с маршрутом 32-битовый не анализируемый тег,
который может применяться в решениях на основе правил,
например для анонсирования или фильтрации маршрута.";
}
}
augment "/rt:routing/rt:control-plane-protocols/"
+ "rt:control-plane-protocol/rt:static-routes/v6ur:ipv6/"
+ "v6ur:route/v6ur:next-hop/v6ur:next-hop-options/"
+ "v6ur:next-hop-list/v6ur:next-hop-list/v6ur:next-hop" {
description
"Дополнение конфигурации статического маршрута next-hop-list.";
leaf preference {
type uint32;
default "1";
description
"Предпочтение служит для выбора среди статических маршрутов.
Предпочтительны маршруты с меншим значением preference, а
одинаковые значения ведут к статическим маршрутам с
равноценными путями (Equal-Cost Multipath или ECMP).";
}
leaf tag {
type uint32;
default "0";
description
"Связанный с маршрутом 32-битовый не анализируемый тег,
который может применяться в решениях на основе правил,
например для анонсирования или фильтрации маршрута.";
}
}
augment "/rt:routing/rt:ribs/rt:rib" {
description
"Добавление статистики в RIB.";
uses rib-statistics;
}
augment "/rt:routing/rt:ribs/rt:rib/"
+ "rt:routes/rt:route" {
description
"Дополнение маршрута с базовыми атрибутами в RIB.";
leaf metric {
when "not(derived-from("
+ "../rt:source-protocol, 'ospf:ospf')) "
+ "and not(derived-from( "
+ "../rt:source-protocol, 'isis:isis'))" {
description
"Это дополнение действительно лишь для маршрутов,
полученных не от протоколов OSPF и IS-IS. Модели YANG
для OSPF и IS-IS уже включают дополнение metric.";
}
type uint32;
description
"Метрика — целое число, указывающее стоимость маршрута с
точки зрения установившего маршрут протокола маршрутизации.
В общем случае меньшее значение метрики в рамках одного
протокола маршрутизации говорит о меньшей стоимости маршрута
и его предпочтительности по сравнению с большей метрикой.
Метрика разных протоколов маршрутизации не сравнима.";
}
leaf-list tag {
when "not(derived-from("
+ "../rt:source-protocol, 'ospf:ospf')) "
+ "and not(derived-from( "
+ "../rt:source-protocol, 'isis:isis'))" {
description
"Это дополнение действительно лишь для маршрутов,
полученных не от протоколов OSPF и IS-IS. Модели YANG
для OSPF и IS-IS уже включают дополнение tag.";
}
type uint32;
description
"Связанный с маршрутом 32-битовый не анализируемый тег,
который может применяться в решениях на основе правил,
например для анонсирования или фильтрации маршрута.";
}
leaf application-tag {
type uint32;
description
"Связанный с приложением дополнительный тег, который может
использоваться приложениями, требующими семантики и/или
правил, отличных от принятых для обычных тегов. Например,
тег обычно автоматически анонсируется в OSPF AS-External
LSA, а связанный с приложением тег не анонсируется неявно.";
}
}
augment "/rt:routing/rt:ribs/rt:rib/"
+ "rt:routes/rt:route/rt:next-hop/rt:next-hop-options/"
+ "rt:simple-next-hop" {
description
"Добавление repair-path в simple-next-hop.";
uses repair-path;
}
augment "/rt:routing/rt:ribs/rt:rib/"
+ "rt:routes/rt:route/rt:next-hop/rt:next-hop-options/"
+ "rt:next-hop-list/rt:next-hop-list/rt:next-hop" {
description
"Добавление ремонтного пути в next-hop.";
uses repair-path;
}
}
<CODE ENDS>
6. Вопросы безопасности
Заданный этим документом модуль YANG определяет схему для данных, предназначенную для доступа через сеть с использованием протоколов управления, таких как NETCONF [RFC6241] или RESTCONF [RFC8040]. Нижним уровнем NETCONF служит защищённый транспорт с обязательной поддержкой SSH (Secure Shell) [RFC6242]. Нижним уровнем RESTCONF служит протокол HTTPS с обязательной поддержкой защиты на транспортном уровне (TLS) [RFC8446].
Модель доступа к конфигурации сети (NACM – Network Configuration Access Control Model) [RFC8341] обеспечивает возможность разрешить доступ лишь определённых пользователей NETCONF или RESTCONF к заранее заданному подмножеству операций NETCONF или RESTCONF и содержимого.
В заданном здесь модуле ietf-rib-extension.yang определено множество узлов данных, которые разрешают запись, создание и удаление (т. е. config true, как принято по умолчанию). Эти узлы могут быть конфиденциальными или уязвимыми в некоторых сетевых средах. Запись в такие узлы (например, edit-config) без должной защиты может негативно влиять на работу сети. Ниже перечислены ветви и узлы, которые могут быть конфиденциальны или уязвимы.
/v4ur:next-hop-options/v4ur:simple-next-hop/rib-ext:preference
/v4ur:next-hop-options/v4ur:simple-next-hop/rib-ext:tag
/v4ur:next-hop-options/v4ur:next-hop-list/v4ur:next-hop-list/v4ur:next-hop/rib-ext:preference
/v4ur:next-hop-options/v4ur:next-hop-list/v4ur:next-hop-list/v4ur:next-hop/rib-ext:tag
/v6ur:next-hop-options/v6ur:simple-next-hop/rib-ext:preference
/v6ur:next-hop-options/v6ur:simple-next-hop/rib-ext:tag
/v6ur:next-hop-options/v6ur:next-hop-list/v6ur:next-hop-list/v6ur:next-hop/rib-ext:preference
/v6ur:next-hop-options/v6ur:next-hop-list/v6ur:next-hop-list/v6ur:next-hop/rib-ext:tag
Для этих дополнений модуля ietf-routing.yang возможность удалять, добавлять и изменять предпочтения и теги для статических маршрутов может приводить к ошибочной маршрутизации трафика.Некоторые из доступных для чтения узлов в этом модуле YANG могут быть конфиденциальны или уязвимы в той или иной сетевой среде. Важно контролировать доступ к таким объектам (например, get, get-config, notification). Ниже перечислены ветви и узлы, которые могут быть конфиденциальны или уязвимы.
/rt:routing/rt:ribs/rt:rib/rib-ext:statistics
/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route/rib-ext:metric
/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route/rib-ext:tag
/rt:routing/rt:ribs/rt:rib/rt:routes/rt:route/rib-ext:application-tag
/rt:route/rt:next-hop/rt:next-hop-options/rt:simple-next-hop/rib-ext:repair-path
/rt:routes/rt:route/rt:next-hop/rt:next-hop-options/rt:next-hop-list/rt:next-hop-list/rt:next-hop/rib-ext:repair-path
Раскрытие RIB будет показывать топологию маршрутизации в сети. Это может быть нежелательно, поскольку такое раскрытие может способствовать другим атакам. Кроме того, операторы могут считать сведения о топологии конфиденциальными.Соображения безопасности, рассмотренные в [RFC8349], применимы к расширениям, описанным здесь.
7. Взаимодействие с IANA
Этот документ регистрирует URI в IETF XML Registry [RFC3688].
URI: urn:ietf:params:xml:ns:yang:ietf-rib-extension Registrant Contact: The IESG. XML: N/A; регистрируемый URI является пространством имён XML.
Агентство IANA зарегистрировало указанный ниже подуль YANG в реестре YANG Module Names [RFC6020].
Name: ietf-rib-extension Namespace: urn:ietf:params:xml:ns:yang:ietf-rib-extension Prefix: rib-ext Reference: RFC 9403
8. Литература
8.1. Нормативные документы
[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <https://www.rfc-editor.org/info/rfc3688>.
[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <https://www.rfc-editor.org/info/rfc6020>.
[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.
[RFC6242] Wasserman, M., «Using the NETCONF Protocol over Secure Shell (SSH)», RFC 6242, DOI 10.17487/RFC6242, June 2011, <https://www.rfc-editor.org/info/rfc6242>.
[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <https://www.rfc-editor.org/info/rfc6991>.
[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <https://www.rfc-editor.org/info/rfc7950>.
[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, «RESTCONF Protocol», RFC 8040, DOI 10.17487/RFC8040, January 2017, <https://www.rfc-editor.org/info/rfc8040>.
[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.
[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., and R. Wilton, «Network Management Datastore Architecture (NMDA)», RFC 8342, DOI 10.17487/RFC8342, March 2018, <https://www.rfc-editor.org/info/rfc8342>.
[RFC8343] Bjorklund, M., «A YANG Data Model for Interface Management», RFC 8343, DOI 10.17487/RFC8343, March 2018, <https://www.rfc-editor.org/info/rfc8343>.
[RFC8349] Lhotka, L., Lindem, A., and Y. Qu, «A YANG Data Model for Routing Management (NMDA Version)», RFC 8349, DOI 10.17487/RFC8349, March 2018, <https://www.rfc-editor.org/info/rfc8349>.
[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.
[RFC9129] Yeung, D., Qu, Y., Zhang, Z., Chen, I., and A. Lindem, «YANG Data Model for the OSPF Protocol», RFC 9129, DOI 10.17487/RFC9129, October 2022, <https://www.rfc-editor.org/info/rfc9129>.
[RFC9130] Litkowski, S., Ed., Yeung, D., Lindem, A., Zhang, J., and L. Lhotka, «YANG Data Model for the IS-IS Protocol», RFC 9130, DOI 10.17487/RFC9130, October 2022, <https://www.rfc-editor.org/info/rfc9130>.
[W3C.REC-xml-20081126] Bray, T., Paoli, J., Sperberg-McQueen, M., Maler, E., and F. Yergeau, «Extensible Markup Language (XML) 1.0 (Fifth Edition)», World Wide Web Consortium Recommendation REC-xml-20081126, November 2008, <https://www.w3.org/TR/2008/REC-xml-20081126>.
8.2. Дополнительная литература
[RFC5714] Shand, M. and S. Bryant, «IP Fast Reroute Framework», RFC 5714, DOI 10.17487/RFC5714, January 2010, <https://www.rfc-editor.org/info/rfc5714>.
[RFC7951] Lhotka, L., «JSON Encoding of Data Modeled with YANG», RFC 7951, DOI 10.17487/RFC7951, August 2016, <https://www.rfc-editor.org/info/rfc7951>.
[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.
[RFC8792] Watsen, K., Auerswald, E., Farrel, A., and Q. Wu, «Handling Long Lines in Content of Internet-Drafts and RFCs», RFC 8792, DOI 10.17487/RFC8792, June 2020, <https://www.rfc-editor.org/info/rfc8792>.
Приложение A. Комбинированное дерево
Ниже представлено комбинированное дерево модулей ietf-routing.yang, ietf-ipv4-unicast-routing.yang, ietf-ipv6-unicast-routing.yang, ietf-rib-extension.yang.
module: ietf-routing
+--rw routing
+--rw router-id? yang:dotted-quad {router-id}?
+--ro interfaces
| +--ro interface* if:interface-ref
+--rw control-plane-protocols
| +--rw control-plane-protocol* [type name]
| +--rw type identityref
| +--rw name string
| +--rw description? string
| +--rw static-routes
| +--rw v4ur:ipv4
| | +--rw v4ur:route* [destination-prefix]
| | +--rw v4ur:destination-prefix inet:ipv4-prefix
| | +--rw v4ur:description? string
| | +--rw v4ur:next-hop
| | +--rw (v4ur:next-hop-options)
| | +--:(v4ur:simple-next-hop)
| | | +--rw v4ur:outgoing-interface?
| | | | if:interface-ref
| | | +--rw v4ur:next-hop-address?
| | | | inet:ipv4-address
| | | +--rw rib-ext:preference? uint32
| | | +--rw rib-ext:tag? uint32
| | +--:(v4ur:special-next-hop)
| | | +--rw v4ur:special-next-hop? enumeration
| | +--:(v4ur:next-hop-list)
| | +--rw v4ur:next-hop-list
| | +--rw v4ur:next-hop* [index]
| | +--rw v4ur:index string
| | +--rw v4ur:outgoing-interface?
| | | if:interface-ref
| | +--rw v4ur:next-hop-address?
| | | inet:ipv4-address
| | +--rw rib-ext:preference? uint32
| | +--rw rib-ext:tag? uint32
| +--rw v6ur:ipv6
| +--rw v6ur:route* [destination-prefix]
| +--rw v6ur:destination-prefix inet:ipv6-prefix
| +--rw v6ur:description? string
| +--rw v6ur:next-hop
| +--rw (v6ur:next-hop-options)
| +--:(v6ur:simple-next-hop)
| | +--rw v6ur:outgoing-interface?
| | | if:interface-ref
| | +--rw v6ur:next-hop-address?
| | | inet:ipv6-address
| | +--rw rib-ext:preference? uint32
| | +--rw rib-ext:tag? uint32
| +--:(v6ur:special-next-hop)
| | +--rw v6ur:special-next-hop? enumeration
| +--:(v6ur:next-hop-list)
| +--rw v6ur:next-hop-list
| +--rw v6ur:next-hop* [index]
| +--rw v6ur:index string
| +--rw v6ur:outgoing-interface?
| | if:interface-ref
| +--rw v6ur:next-hop-address?
| | inet:ipv6-address
| +--rw rib-ext:preference? uint32
| +--rw rib-ext:tag? uint32
+--rw ribs
+--rw rib* [name]
+--rw name string
+--rw address-family identityref
+--ro default-rib? boolean {multiple-ribs}?
+--ro routes
| +--ro route* []
| +--ro route-preference? route-preference
| +--ro next-hop
| | +--ro (next-hop-options)
| | +--:(simple-next-hop)
| | | +--ro outgoing-interface?
| | | | if:interface-ref
| | | +--ro v4ur:next-hop-address?
| | | | inet:ipv4-address
| | | +--ro v6ur:next-hop-address?
| | | | inet:ipv6-address
| | | +--ro rib-ext:repair-path
| | | +--ro rib-ext:outgoing-interface?
| | | | if:interface-state-ref
| | | +--ro rib-ext:next-hop-address?
| | | | inet:ip-address-no-zone
| | | +--ro rib-ext:metric? uint32
| | +--:(special-next-hop)
| | | +--ro special-next-hop? enumeration
| | +--:(next-hop-list)
| | +--ro next-hop-list
| | +--ro next-hop* []
| | +--ro outgoing-interface?
| | | if:interface-ref
| | +--ro v4ur:address?
| | | inet:ipv4-address
| | +--ro v6ur:address?
| | | inet:ipv6-address
| | +--ro rib-ext:repair-path
| | +--ro rib-ext:outgoing-interface?
| | | if:interface-state-ref
| | +--ro rib-ext:next-hop-address?
| | | inet:ip-address-no-zone
| | +--ro rib-ext:metric? uint32
| +--ro source-protocol identityref
| +--ro active? empty
| +--ro last-updated? yang:date-and-time
| +--ro v4ur:destination-prefix? inet:ipv4-prefix
| +--ro v6ur:destination-prefix? inet:ipv6-prefix
| +--ro rib-ext:metric? uint32
| +--ro rib-ext:tag* uint32
| +--ro rib-ext:application-tag? uint32
+---x active-route
| +---w input
| | +---w v4ur:destination-address? inet:ipv4-address
| | +---w v6ur:destination-address? inet:ipv6-address
| +--ro output
| +--ro route
| +--ro next-hop
| | +--ro (next-hop-options)
| | +--:(simple-next-hop)
| | | +--ro outgoing-interface?
| | | | if:interface-ref
| | | +--ro v4ur:next-hop-address?
| | | | inet:ipv4-address
| | | +--ro v6ur:next-hop-address?
| | | | inet:ipv6-address
| | +--:(special-next-hop)
| | | +--ro special-next-hop? enumeration
| | +--:(next-hop-list)
| | +--ro next-hop-list
| | +--ro next-hop* []
| | +--ro outgoing-interface?
| | | if:interface-ref
| | +--ro v4ur:next-hop-address?
| | | inet:ipv4-address
| | +--ro v6ur:next-hop-address?
| | | inet:ipv6-address
| +--ro source-protocol identityref
| +--ro active? empty
| +--ro last-updated? yang:date-and-time
| +--ro v4ur:destination-prefix? inet:ipv4-prefix
| +--ro v6ur:destination-prefix? inet:ipv6-prefix
+--rw description? string
+--ro rib-ext:statistics
+--ro rib-ext:total-routes? uint32
+--ro rib-ext:total-active-routes? uint32
+--ro rib-ext:total-route-memory? uint64
+--ro rib-ext:protocol-statistics* []
+--ro rib-ext:protocol? identityref
+--ro rib-ext:routes? uint32
+--ro rib-ext:active-routes? uint32
+--ro rib-ext:route-memory? uint64
Приложение B. Пример ietf-rib-extension.yang
Ниже представлен пример XML [W3C.REC-xml-20081126] использующий модуль расширения RIB и RFC 8349. Символ \ в конце строки указывает перенос длинной строки [RFC8792].
<routing xmlns="urn:ietf:params:xml:ns:yang:ietf-routing">
<control-plane-protocols>
<control-plane-protocol>
<type>static</type>
<name>static-routing-protocol</name>
<static-routes>
<ipv4 xmlns="urn:ietf:params:xml:ns:yang:\
ietf-ipv4-unicast-routing">
<route>
<destination-prefix>0.0.0.0/0</destination-prefix>
<next-hop>
<next-hop-address>192.0.2.2</next-hop-address>
<preference xmlns="urn:ietf:params:xml:ns:yang:\
ietf-rib-extension">30</preference>
<tag xmlns="urn:ietf:params:xml:ns:yang:\
ietf-rib-extension">99</tag>
</next-hop>
</route>
</ipv4>
<ipv6 xmlns="urn:ietf:params:xml:ns:yang:\
ietf-ipv6-unicast-routing">
<route>
<destination-prefix>::/0</destination-prefix>
<next-hop>
<next-hop-address>2001:db8:aaaa::1111</next-hop-address>
<preference xmlns="urn:ietf:params:xml:ns:yang:\
ietf-rib-extension">30</preference>
<tag xmlns="urn:ietf:params:xml:ns:yang:\
ietf-rib-extension">66</tag>
</next-hop>
</route>
</ipv6>
</static-routes>
</control-plane-protocol>
</control-plane-protocols>
<ribs>
<rib>
<name>ipv4-primary</name>
<address-family xmlns:v4ur="urn:ietf:params:xml:ns:yang:\
ietf-ipv4-unicast-routing">v4ur:ipv4-unicast</address-family>
<default-rib>true</default-rib>
<routes>
<route>
<destination-prefix xmlns="urn:ietf:params:xml:ns:yang:\
ietf-ipv4-unicast-routing">0.0.0.0/0</destination-prefix>
<next-hop>
<next-hop-address xmlns="urn:ietf:params:xml:ns:yang:\
ietf-ipv4-unicast-routing">192.0.2.2</next-hop-address>
</next-hop>
<route-preference>5</route-preference>
<source-protocol>static</source-protocol>
<last-updated>2015-10-24T18:02:45+02:00</last-updated>
</route>
<route>
<destination-prefix xmlns="urn:ietf:params:xml:ns:yang:\
ietf-ipv4-unicast-routing">198.51.100.0/24\
</destination-prefix>
<next-hop>
<next-hop-address xmlns="urn:ietf:params:xml:ns:yang:\
ietf-ipv4-unicast-routing">192.0.2.2</next-hop-address>
<repair-path xmlns="urn:ietf:params:xml:ns:yang:\
ietf-rib-extension">
<next-hop-address>203.0.113.1</next-hop-address>
<metric>200</metric>
</repair-path>
</next-hop>
<route-preference>120</route-preference>
<source-protocol xmlns:rip="urn:ietf:params:xml:ns:yang:\
ietf-rip">rip:rip</source-protocol>
<last-updated>2015-10-24T18:02:45+02:00</last-updated>
</route>
</routes>
</rib>
<rib>
<name>ipv6-primary</name>
<address-family xmlns:v6ur="urn:ietf:params:xml:ns:yang:\
ietf-ipv6-unicast-routing">v6ur:ipv6-unicast</address-family>
<default-rib>true</default-rib>
<routes>
<route>
<destination-prefix xmlns="urn:ietf:params:xml:ns:yang:\
ietf-ipv6-unicast-routing">0::/0</destination-prefix>
<next-hop>
<next-hop-address xmlns="urn:ietf:params:xml:ns:yang:\
ietf-ipv6-unicast-routing">2001:db8:aaaa::1111\
</next-hop-address>
</next-hop>
<route-preference>5</route-preference>
<source-protocol>static</source-protocol>
<last-updated>2015-10-24T18:02:45+02:00</last-updated>
</route>
<route>
<destination-prefix xmlns="urn:ietf:params:xml:ns:yang:\
ietf-ipv6-unicast-routing">2001:db8:bbbb::/64\
</destination-prefix>
<next-hop>
<next-hop-address xmlns="urn:ietf:params:xml:ns:yang:\
ietf-ipv6-unicast-routing">2001:db8:aaaa::1111\
</next-hop-address>
<repair-path xmlns="urn:ietf:params:xml:ns:yang:\
ietf-rib-extension">
<next-hop-address>2001:db8:cccc::2222</next-hop-address>
<metric>200</metric>
</repair-path>
</next-hop>
<route-preference>120</route-preference>
<source-protocol xmlns:rip="urn:ietf:params:xml:ns:yang:\
ietf-rip">rip:rip</source-protocol>
<last-updated>2015-10-24T18:02:45+02:00</last-updated>
</route>
</routes>
</rib>
</ribs>
</routing>
Ниже представлен тот же пример в формате JSON [RFC7951].
{
"ietf-routing:routing": {
"control-plane-protocols": {
"control-plane-protocol": [
{
"type": "static",
"name": "static-routing-protocol",
"static-routes": {
"ietf-ipv4-unicast-routing:ipv4": {
"route": [
{
"destination-prefix": "0.0.0.0/0",
"next-hop": {
"next-hop-address": "192.0.2.2",
"ietf-rib-extension:preference": 30,
"ietf-rib-extension:tag": 99
}
}
]
},
"ietf-ipv6-unicast-routing:ipv6": {
"route": [
{
"destination-prefix": "::/0",
"next-hop": {
"next-hop-address": "2001:db8:aaaa::1111",
"ietf-rib-extension:preference": 30,
"ietf-rib-extension:tag": 66
}
}
]
}
}
}
]
},
"ribs": {
"rib": [
{
"name": "ipv4-primary",
"address-family": "ietf-ipv4-unicast-routing:ipv4-unicast",
"default-rib": true,
"routes": {
"route": [
{
"next-hop": {
"ietf-ipv4-unicast-routing:next-hop-address": \
"192.0.2.2"
},
"route-preference": 5,
"source-protocol": "static",
"last-updated": "2015-10-24T18:02:45+02:00",
"ietf-ipv4-unicast-routing:destination-prefix": \
"0.0.0.0/0"
},
{
"next-hop": {
"ietf-rib-extension:repair-path": {
"next-hop-address": "203.0.113.1",
"metric": 200
},
"ietf-ipv4-unicast-routing:next-hop-address": \
"192.0.2.2"
},
"route-preference": 120,
"source-protocol": "ietf-rip:rip",
"last-updated": "2015-10-24T18:02:45+02:00",
"ietf-ipv4-unicast-routing:destination-prefix": \
"198.51.100.0/24"
}
]
}
},
{
"name": "ipv6-primary",
"address-family": "ietf-ipv6-unicast-routing:ipv6-unicast",
"default-rib": true,
"routes": {
"route": [
{
"next-hop": {
"ietf-ipv6-unicast-routing:next-hop-address": \
"2001:db8:aaaa::1111"
},
"route-preference": 5,
"source-protocol": "static",
"last-updated": "2015-10-24T18:02:45+02:00",
"ietf-ipv6-unicast-routing:destination-prefix": "::/0"
},
{
"next-hop": {
"ietf-rib-extension:repair-path": {
"next-hop-address": "2001:db8:cccc::2222",
"metric": 200
},
"ietf-ipv6-unicast-routing:next-hop-address": \
"2001:db8:aaaa::1111"
},
"route-preference": 120,
"source-protocol": "ietf-rip:rip",
"last-updated": "2015-10-24T18:02:45+02:00",
"ietf-ipv6-unicast-routing:destination-prefix": \
"2001:db8:bbbb::/64"
}
]
}
}
]
}
}
}
Благодарности
Авторы благодарны Les Ginsberg, Krishna Deevi, Suyoung Yoon за полезные комментарии и предложения. Спасибо Tom Petch, Rob Wilton, Chris Hopps, Martin Björklund, Jeffrey Zhang, Éric Vyncke, Lars Eggert, Bo Wu за их рецензии и комментарии.
Адреса авторов
Acee Lindem LabN Consulting, L.L.C. 301 Midenhall Way Cary, NC 27513 United States of America Email: acee.ietf@gmail.com Yingzhen Qu Futurewei Technologies 2330 Central Expressway Santa Clara, CA 95050 United States of America Email: yingzhen.qu@futurewei.comПеревод на русский язык
1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.
2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.
3На самом деле в RFC 7950 приведено определение термина presence container. Прим. перев.