RFC 9403 A YANG Data Model for RIB Extensions

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

PDF

Аннотация

База маршрутной информации (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

Перевод на русский язык

nmalykh@protokols.ru


1Internet Engineering Task Force – комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group – комиссия по инженерным разработкам Internet.

3На самом деле в RFC 7950 приведено определение термина presence container. Прим. перев.

Запись опубликована в рубрике RFC. Добавьте в закладки постоянную ссылку.

Добавить комментарий