Исходный словарь RPSL, пример действий политики и фильтры
dictionary: RPSL
rp-attribute: # меньшие значения соответствуют более высокому предпочтению pref
operator=(integer[0, 65535]) |
rp-attribute: # атрибут BGP multi_exit_discriminator
med | |
# установить med равным 10: med = 10; | |
# установить med метрике IGP: med = igp_cost; | |
operator=(union integer[0, 65535], enum[igp_cost]) |
rp-attribute: # атрибут предпочтения места назначения BGP (dpa)
dpa | |
operator=(integer[0, 65535]) |
rp-attribute: # атрибут BGP aspath
aspath | |
# prepends AS numbers from last to first order | |
prepend(as_number, ...) |
typedef: # значение community в RPSL равно:
# - 4-байтовому целому (ok to use 3561:70 notation) | |
# - internet, no_export, no_advertise (смотри RFC-1997) | |
community_elm union | |
integer[1, 4294967295], | |
enum[internet, no_export, no_advertise], |
typedef: # список значений community { 40, no_export, 3561:70 }
community_list list of community_elm |
rp-attribute: # атрибут BGP community
community | |||
# set to a list of communities | |||
operator=(community_list) | |||
# добавить значения community | |||
operator.=(community_list) | |||
append(community_elm, ...) | |||
# удалить значения community | |||
delete(community_elm, ...) | |||
# фильтр: true если содержится одно из значений community | |||
contains(community_elm, ...) | |||
# shortcut to contains: community(no_export, 3561:70) | |||
operator()(community_elm, ...) | |||
# сравнение равенства, независящее от порядка | |||
operator==(community_list) | |||
rp-attribute: | # следующий маршрутизатор в статическом маршруте next-hop | ||
# установить равным 7.7.7.7: next-hop = 7.7.7.7; | |||
# установить собственный адрес маршрутизатора: next-hop = self; | |||
operator=(union ipv4_address, enum[self]) | |||
rp-attribute: | # цена статического маршрута cost |
operator=(integer[0, 65535]) | |||
protocol: | BGP4 | ||
# номер AS маршрутизатора партнера | |||
MANDATORY asno(as_number) | |||
# разрешить гашение осцилляций маршрута | |||
OPTIONAL flap_damp() | |||
OPTIONAL flap_damp(integer[0,65535], | |||
# penalty per flap | |||
integer[0,65535], | |||
# penalty value for supression | |||
integer[0,65535], | |||
# penalty value for reuse | |||
integer[0,65535], | |||
# halflife in secs when up | |||
integer[0,65535], | |||
# halflife in secs when down | |||
integer[0,65535]) | |||
# максимальный штраф |
protocol: OSPF
protocol: RIP
protocol: IGRP
protocol: IS-IS
protocol: STATIC
protocol: RIPng
protocol: DVMRP
protocol: PIM-DM
protocol: PIM-SM
protocol: CBT
protocol: MOSPF
Рис. .27. Словарь RPSL
На рис. . 27 показан исходный словарь RPSL. Он имеет семь rp-атрибутов: pref для присвоения локального предпочтения воспринимаемым маршрутам; med для присвоения значения атрибуту MULTI_EXIT_DISCRIMINATOR BGP; dpa для присвоения значения атрибуту DPA BGP; aspath для присвоения значения атрибуту AS_PATH BGP; community для присвоения или проверки значения атрибута community BGP; next-hop для назначения следующих маршрутизаторов в случае статических маршрутов; cost для назначения цены статических маршрутов. Словарь определяет два типа: community_elm и community_list. Тип community_elm является либо 4-байтовым целым числом без знака, либо одним из ключевых слов Интернет, no_export или no_advertise. Целое число может быть специфицировано с помощью двух 2-байтовых чисел, разделенных двоеточием ":", чтобы разделить пространство кода community так, чтобы провайдер мог использовать номер AS первых двух байт, и определить семантику выбора последних двух байт.
Исходный словарь (рис. .27) определяет только опции для BGP (Border Gateway Protocol): asno и flap_damp. Обязательная опция asno является номером AS партнера-маршрутизатора. Опция flap_damp инструктирует маршрутизатор гасить осцилляции маршрутов [21], при импортировании маршрутов от маршрутизатора-партнера. Она может быть специфицирована с или без параметров. Если параметры опущены, принимаются значения по умолчанию:
flap_damp(1000, 2000, 750, 900, 900, 20000)
То есть, назначается штраф 1000 для каждого переключения маршрута, маршрут закрывается, когда штраф достигает 2000. Штраф снижается вдвое после 15 минут стабильного режима вне зависимости оттого открыт путь или нет. Закрытый маршрут используется вновь, когда штраф падает ниже 750. Максимальный штраф маршрута может достигать 20,000 (т.e. максимальное время закрытия маршрута после стабилизации ситуации составляет около 75 минут).
Действия политики и фильтров, использующих rp-атрибуты
Синтаксис действия политики или фильтра, использующего rp-атрибут x выглядит следующим образом:
x.method(arguments)
x "op" argument
где method представляет собой метод, а "op" - метод оператора rp-атрибута x. Если метод оператора используется при спецификации составного фильтра политики, он определяется раньше, чем операторы составных фильтров политики (т.e. AND, OR, NOT или оператор). rp-атрибуту pref может быть присвоено положительное целое число следующим образом:
pref = 10;
rp-атрибуту med может быть присвоено положительное целое число или слово "igp_cost" следующим образом:
med = 0;
med = igp_cost;
rp-атрибуту dpa может быть присвоено положительное целое число следующим образом:
dpa = 100;
Значением атрибута community BGP является список, который состоит из 4-байтовых целых чисел, каждое их которых характеризует "community". Следующие примеры демонстрируют, как добавлять новые значения community к этому rp-атрибуту:
community .= { 100 };
community .= { NO_EXPORT };
community .= { 3561:10 };
В последнем случае, 4-байтовое целое число, сформированное так, что наиболее значимые два байта равны 3561, а менее значимые два байта равны 10. Следующие примеры показывают, как удалять элементы из rp-атрибута community:
community.delete(100, NO_EXPORT, 3561:10);
Фильтры, которые используют rp-атрибут community могут быть определены, как это показано в следующем примере:
community.contains(100, NO_EXPORT, 3561:10);
community(100, NO_EXPORT, 3561:10); # shortcut
rp-атрибуту community может быть присвоено значение, соответствующее списку community следующим образом:
community = {100, NO_EXPORT, 3561:10, 200};
community = {};
В этом первом случае, rp-атрибут community содержит значения (communities) 100, NO_EXPORT, 3561:10 и 200. В последнем случае, rp-атрибут community обнулен. rp-атрибут community может быть сравнен со списком communities следующим образом:
community == {100, NO_EXPORT, 3561:10, 200}; # точное соответствие
Чтобы повлиять на выбор маршрута, rp-атрибут BGP as_path может быть сделан длиннее путем предварительной прописи номеров AS следующим образом:
aspath.prepend(AS1);
aspath.prepend(AS1, AS1, AS1);
Следующие примеры некорректны:
med = -50; | # -50 лежит вне диапазона |
med = igp; | # igp не является одним из значений enum |
med.assign(10); | # заданный метод не определен |
community.append(AS3561:20); |
aut-num: AS1
export: | to AS2 action community.={3561:90}; |
to AS3 action community.={3561:80}; | |
announce AS1 |
members: AS2, AS3
aut-num: AS3561
import: | from AS3561:AS-PEERS |
action pref = 10; | |
accept community(3561:90) | |
import: | from AS3561:AS-PEERS |
action pref = 20; | |
accept community(3561:80) | |
import: | from AS3561:AS-PEERS |
action pref = 20; | |
accept community(3561:70) | |
import: | from AS3561:AS-PEERS |
action pref = 0; | |
accept ANY |