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. Прим. перев.