Особенности работы ARP протокола в Junos Network Operating System

16 Jan 2020 - orlik

Share on:

Особенности обработки ARP запросов в Junos OS, а также защита от атак с использованием протокола ARP.

Обработка исходящих ARP запросов

Когда на маршрутизатор приходит пакет, у которого destination адрес принадлежит direct сети на ethernet интерфейсе, Juniper PFE выполняет поиск в таблице маршрутизации для адреса назначения, результатом которого возможны три варианта:

NH Type “Unicast”

Будет найдена /32 запись с NH Type “Unicast”, это означает, что для данного маршрута уже есть ARP запись и пакет можно отправить далее

> request pfe execute command "sh route ip prefix 10.0.150.205 detail" target afeb0
SENT: Ukern command: sh route ip prefix 10.0.150.205 detail

IPv4 Route Table 0, default.0, 0x80000:
Destination        NH IP Addr      Type     NH ID Interface
------------------ --------------- -------- ----- ---------
10.0.150.205       10.0.150.205    Unicast   986  RT-ifl 444 ge-0/0/1.172 ifl 444

NH Type “Resolve”

Будет найдена запись с NH Type “Resolve”. Подобная запись является конечной в поиске только при отсутствии /32 записей для данного адреса. Когда трафик попадает под Resolve маршрут, Lookup chip 1 отправляет оповещение на PFE CPU о необходимости выполнить резолв для данного адреса. Создается локальная запись о том, что FPC пытается резолвить данный маршрут, затем отправляется запрос на RE о необходимости выполнения резолва.

> request pfe execute command "sh route ip prefix 10.0.150.200/29" target afeb0
SENT: Ukern command: sh route ip prefix 10.0.150.200/29


IPv4 Route Table 0, default.0, 0x80000:
Destination        NH IP Addr      Type     NH ID Interface
------------------ --------------- -------- ----- ---------
10.0.150.200/29                    Resolve   968  RT-ifl 444 ge-0/0/1.172 ifl 444

Если по истечении этого таймера, от RE не будет получено ответа (например, хост недоступен и не может отрезолвлен), то интерфейс, с которого пришел запрос на резолв, на 10 секунд помечается как throttled и все дельнейшие запросы о необходимости резолва от данного интерфейса и приходящие на FPC CPU игнорируются. При этом можно видеть в syslog FPC сообщения вида

[Jan  1 01:01:01.001 LOG: Info] NH_RESOLUTION_REQ_THROTTLED: Next-hop resolution requests from interface 350 throttled

NH Type “Hold”

Третий вариант записи в таблице имеет NH Type “Hold”. Данный тип записи создает RE после того, как получит запрос на резолв от FPC CPU, после чего RE отправляет ARP who-has запрос с интерфейса (в примере это ge-0/0/1.172). Данный тип записи необходим, чтобы избежать ситуации когда RE одновременно отправит несколько запросов на резолв для одного и того же адреса (например, пришедшие с разных FPC).

> request pfe execute command "sh route ip prefix 10.0.150.204" target afeb0
SENT: Ukern command: sh route ip prefix 10.0.150.204


IPv4 Route Table 0, default.0, 0x80000:
Destination        NH IP Addr      Type     NH ID Interface
------------------ --------------- -------- ----- ---------
10.0.150.204                        Hold    9705  RT-ifl 444 ge-0/0/1.172 ifl 444

Если RE получит ответ на свой ARP запрос, то запись будет сконвертирована из Hold в Unicast, в ARP таблице появится соответствующая запись.

> show arp no-resolve interface ge-0/0/1.172 expiration-time
MAC Address       Address         Interface                TTE    Flags
00:0c:29:0a:37:7f 10.0.150.205   ge-0/0/1.172             1441    none
Total entries: 1

Обработка входящих ARP запросов

Все входящие ARP пакеты попадают под действие __default_arp_policer__ 2. Данный полисер применен глобально на каждом PFE и обрабатывает arp запросы для всех интерфейсов одного PFE.

Примечание: Учитываются не только запросы с broadcast адресом назначения, но и все пакеты, у которых EtherType = 0x0806, в том числе ответы на запросы, отправленные маршрутизатором. И даже пакеты с Dst MAC других клиентов, которые попали на маршрутизатор ошибочно, например из-за петли или hash collision на L2 оборудовании, подключенном на данном интерфейсе.

Пропускная способность __default_arp_policer__ - 150000 Bps, burst - 15000 bytes. При размере ARP запроса в 42 байта данный полисер может пропустить ~446 pps. Если на один PFE поступает больше 446 пакетов в секунду, все лишние запросы будут отброшены полисером. Cуществует вероятность, что часть пакетов не дойдет до RE, как следствие, ARP записи на интерфейсах этого PFE не обновятся и будут удалены. Это черевато кратковременными пропаданиями связи у клиентов, и, как вариант, падением некоторых протоколов маршрутизации (BGP/LDP/RSVP).

Все пакеты далее попадают на PFE CPU, откуда пересылаются на RE.

Между PFE и RE пакеты попадают в отдельную очередь L2 Packets

> request pfe execute command "show ttp statistics" target afeb0
...
TTP Receive Statistics:
                   Control        High      Medium         Low     Discard
                ----------  ----------  ----------  ----------  ----------
 L2 Packets              0         129          80           0           0
 L3 Packets              0         754        1375           0           0
 Drops                   0           0           0           0           0
 Queue Drops             0           0           0           0           0
 Unknown                 0           0           0           0           0
 Coalesce                0           0           0           0           0
 Coalesce Fail           0           0           0           0           0
...

После чего все ARP пакеты от всех PFE попадают в kernel очередь, где и обрабатываются.

Полисер __default_arp_policer__

Отслеживать __default_arp_policer__ полисер возможно из CLI:

> show policer __default_arp_policer__
Policers:
Name                                                Bytes              Packets
__default_arp_policer__                       64833769988           1439659193

или по SNMP (лучше по pps)

OID: .1.3.6.1.4.1.2636.3.5.1.1.4.23.95.95.100.101.102.97.117.108.116.95.97.114.112.95.112.111.108.105.99.101.114.95.95.23.95.95.100.101.102.97.117.108.116.95.97.114.112.95.112.111.108.105.99.101.114.95.95

Также возможно использовать телеметрию.

Способы защиты от ARP flood

Полисер __default_arp_policer__ необходим для защиты RE от флуда. Если не отслеживать количество отброшенных им пакетов, то при флуде от клиентов маршрутизатор будет функционировать стабильно, в отличии от клиентов, которые будут испытывать серьезные проблемы со связью. Существует несколько вариантов защиты от подобных ситуаций.

Индивидуальные ARP полисеры

На каждый логический интерфейс примененяется индивидуальный ARP полисер и все ARP пакеты на этом интерфейсе не будут попадать под действие __default_arp_policer__. В случае флуда на данном интерфейсе все лишние пакеты будут отброшены, не оказывая никакого влияния на другие интерфейсы.

> show configuration interfaces ge-0/0/1.172
family inet {
    policer {
        arp arp8k;
    }
    address 10.0.150.201/29;
}

Отключение __default_arp_policer__

Полисер __default_arp_policer__ отключается на каждом логическом интерфейсе физического интерфейса командой

set interfaces ge-0/0/1.172 family inet policer disable-arp-policer

Внимание: В этом случае на PFE нет никакой защиты от ARP флуда и большое количество запросов может повлиять на стабильность системы!

Проверить отключение полисера возможно по отсутствию строки

Policer: Input: __default_arp_policer__

в выводе команды

show interface detail ge-0/0/1.172

DDoS Protection

В Junos OS присутствует механизм DDoS protection 3 для защиты RE от всевозможных атак, в том числе и от флуда ARP пакетами. Особенностью реализации данного вида защиты является очередность, с которой обрабатывается ARP трафик:

Cначала трафик попадает под действие ARP полисера (индивидуального или __default_arp_policer__), затем обрабатывается системой анализа DDoS protection.

Таким образом, с настройками по умолчанию (bandwidth 20000 pps) DDoS protection для протокола ARP никогда не сработает. Необходимо снижать пороговые значения для того, чтобы система детектировала атаки.

Комбинированный пример

Рассмотрим случай:

Все ARP запросы попадут под действие __default_arp_policer__, после которого пройдет только ~440 pps. Эти 440 pps вызовут срабатывание DDoS protection и включение flow-detection. Вредоносные flow будут заблокированы и не поступят на Control Plane оборудования.

Но блокироваться данные вредоносные flow будут после __default_arp_policer__, таким образом, из 1100 pps более 600 pps будут по-прежнему отбрасываться на __default_arp_policer__, что будет негативно сказываться на работе других клиентов.

Поэтому при срабатывании DDoS-protection для восстановления нормальной работы клиентов, необходимо выставлять индивидуальные ARP полисеры для интерфейсов “проблемных клиентов”. Это возможно автоматизировать через конфигурирование event-options, например:

policy arpddos {
    events ddos_scfd_flow_found;
    attributes-match {
        ddos_scfd_flow_found.protocol-name matches ARP;
    }
    then {
        change-configuration {
            commands {
                "set interfaces {$$.source-name} family inet policer arp arp8k";
            }
        }
    }
}

Также возможно выполнение скрипта, который будет применять ARP полисеры различной емкости в зависимости от сконфигурированной на интерфейсе маски сети.

Ссылки

1. MX Series LU-chip Overview
2. ARP Policer Overview
3. Control Plane Distributed Denial-of-Service (DDoS) Protection Overview

Tags: juniper arp policer ddos