Динамическая адресация и связность сети

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

Задачи (повторение):

  1. Глобальная идентификация (адресация)
    1. Структура адреса
    2. Механизм раздачи

  2. Алгоритм доставки (маршрутизация)
    1. Известный маршрут и маршрут по умолчанию внутри крупной сети
    2. Связность крупных сетей (карта достижимости / стоимость)

Автоматическая раздача адресов

Повторение: На каждом интерфейсе, на котором включен IP, автоматически генерируется link-local адрес:

Этот механизм подходит и для глобальных адресов!

ICMP Router Advertisement

Стандартный механизм динамической настройки конечных узлов основан на сообщениях ICMP, протокола сетевого уровня:

RA содержит:

Серверы:

Как узлы автоматически назначают себе адреса?

   The default behavior (see
   Section 5.2) when sending a packet to an address for which no
   information is known about the on-link status of the address is to
   forward the packet to a default router; the reception of a Prefix
   Information option with the "on-link" (L) flag set to zero does not
   change this behavior.

/!\ Администратор IP-сети не может явно запретить узлам назначать себе адреса и отвечать на Neighbour Solicitation. Однако, на практике он часто может заставить локальную среду не передавать RA с интерфейсов узлов, не являющихся маршрутизаторами ("RA Guard"), или же подключать узлы к среде в индивидуальном, разрешительном порядке.

Выдержка из rfc4291:

   on-link     - an address that is assigned to an interface on a
                 specified link.  A node considers an address to be on-
                 link if:

                    - it is covered by one of the link's prefixes (e.g.,
                      as indicated by the on-link flag in the Prefix
                      Information option), or

                    - a neighboring router specifies the address as the
                      target of a Redirect message, or

                    - a Neighbor Advertisement message is received for
                      the (target) address, or

                    - any Neighbor Discovery message is received from
                      the address.

По умолчанию все адресаoff-link.

…что имеет смысл, например, в Wi-Fi, где данные идут по радио между станцией и точкой доступа (Station ⇔ AP), а не между станциями.

В Linux при ручной настройке IP-адресов на интерфейсе сразу создаётся и маршрут к адресам из подсети (on-link).

При автоматической настройке IP на интерфейсе по объявлению от маршрутизатора (флаг A в RA-опции о префиксе) за добавление маршрута отвечает флаг L (1 — on-link, 0 — через маршрутизатор).

Настройка маршрутизатора BIRD

Добавим в bird.conf, например, на машине router следующее:

protocol device {
# нужен, чтобы BIRD собирал данные с интерфейсов: up/down, назначенные адреса
}
protocol radv downstream {
        interface "eth1" { };
}

downstream — имя сущности в bird.

/!\ Нужно не забыть настроить router-id!

#router id 198.51.100.3;
router id 0xc6336403;

BIRD без этого отказывается работать; когда будем обсуждать OSPF, будет понятно, почему.

Назначим адрес в нужном префиксе на eth1 командой ip:

% ip -6 a add 2001:db8:1:cc::2/64 dev eth1

BIRD будет анонсировать этот префикс на eth1.

После запуска bird на srv ядро Linux на машине client настроит маршрут по умолчанию и префикс:

# до старта bird
[root@client ~]# ip -6 monitor label addr route
# запустили bird на машине router
[ROUTE]default via fe80::a00:27ff:fe00:2f68 dev eth1 proto ra metric 1024 expires 1800sec pref medium
# назначили глобальный префикс на машине router
[ROUTE]2001:db8:1:cc::/64 dev eth1 proto kernel metric 256 expires 86400sec pref medium
[ADDR]3: eth1    inet6 2001:db8:1:cc:a00:27ff:fe0c:f4b/64 scope global dynamic mngtmpaddr proto kernel_ra 
       valid_lft 86400sec preferred_lft 14400sec
[ROUTE]local 2001:db8:1:cc:a00:27ff:fe0c:f4b dev eth1 table local proto kernel metric 0 pref medium

Для префиксов и интерфейсов можно назначать опции:

protocol radv downstream {
        prefix 2001:db8:1:cc::/64 {
                valid lifetime 14400;
                preferred lifetime 10800;
                # etc.
        };
}

Запустить tcpdump на client и увидеть пакет при старте BIRD и отменяющий пакет при останове.

[root@client ~]# tcpdump -i eth1 -xx -n -v icmp6
tcpdump: listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes
# запустили bird
17:15:12.592434 IP6 (flowlabel 0x5dbd9, hlim 255, next-header ICMPv6 (58) payload length: 48) fe80::a00:27ff:fe00:2f68 > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 48
        hop limit 64, Flags [none], pref medium, router lifetime 1800s, reachable time 0ms, retrans timer 0ms
          prefix info option (3), length 32 (4): 2001:db8:1:cc::/64, Flags [onlink, auto], valid time 86400s, pref. time 14400s
        0x0000:  3333 0000 0001 0800 2700 2f68 86dd 6005
        0x0010:  dbd9 0030 3aff fe80 0000 0000 0000 0a00
        0x0020:  27ff fe00 2f68 ff02 0000 0000 0000 0000
        0x0030:  0000 0000 0001 8600 d993 4000 0708 0000
        0x0040:  0000 0000 0000 0304 40c0 0001 5180 0000
        0x0050:  3840 0000 0000 2001 0db8 0001 00cc 0000
        0x0060:  0000 0000 0000
# остановили bird, он отозвал дефолтный маршрут
17:15:22.780134 IP6 (flowlabel 0x5dbd9, hlim 255, next-header ICMPv6 (58) payload length: 48) fe80::a00:27ff:fe00:2f68 > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 48
        hop limit 64, Flags [none], pref medium, router lifetime 0s, reachable time 0ms, retrans timer 0ms
          prefix info option (3), length 32 (4): 2001:db8:1:cc::/64, Flags [onlink, auto], valid time 86400s, pref. time 14400s
        0x0000:  3333 0000 0001 0800 2700 2f68 86dd 6005
        0x0010:  dbd9 0030 3aff fe80 0000 0000 0000 0a00
        0x0020:  27ff fe00 2f68 ff02 0000 0000 0000 0000
        0x0030:  0000 0000 0001 8600 e09b 4000 0000 0000
        0x0040:  0000 0000 0000 0304 40c0 0001 5180 0000
        0x0050:  3840 0000 0000 2001 0db8 0001 00cc 0000
        0x0060:  0000 0000 0000

2 packets captured
2 packets received by filter
0 packets dropped by kernel

Динамическое распространение таблиц маршрутизации

⇒ Сложно каждый раз руками делать ip route add

ICMP RA плохо подходит для настройки роутеров как таковых и не подходит для распространения таблиц маршрутизации ⇒ нужен новый протокол.

OSPF версии 3

ПО: zebra, quagga, frr, bird

Настройка OSPF в BIRD

TODO Непременно отметить, что OSPFv3 работает только на link local адресах.

TODO Превратить в полноценный пример, нарисовать картинку (в т. ч. «маршрут по умолчанию»:

clone:
        eth1: intnet
subrouter:
        eth1: intnet
        eth2: deepnet
router:
        eth1: deepnet
        eth2: srvnet
base:
        eth1: srvnet

[root@router ~]# sysctl net.ipv6.conf.all.forwarding=1
[root@router ~]# cat /etc/bird/bird.conf
router id 0x09876543;

protocol device { }

protocol radv downstream {
        interface "eth2" { };
}

protocol direct { ipv6; }

protocol kernel {
        ipv6 { export all; };
}

protocol ospf v3 SIMPLE {
        ipv6 { export all; };
        area 0 { 
                interface "eth1" { };
        };
}
[root@router ~]# bird

[root@subrouter ~]# sysctl net.ipv6.conf.all.forwarding=1
[root@subrouter ~]# cat /etc/bird/bird.conf
router id 0xc6336403;

protocol device { }

protocol radv downstream {
        interface "eth1" { };
}

protocol direct { ipv6; }

protocol kernel {
        ipv6 { export all; };
}

protocol ospf v3 SIMPLE {
        ipv6 { export all; };
        area 0 {
                interface "eth2" { };
        };
}
[root@subrouter ~]# bird

Проверка:

[root@router ~]# birdc show ospf n
[root@router ~]# birdc show route
[root@router ~]# birdc show ospf state

[root@subrouter ~]# birdc show route

Добавление маршрута по умолчанию:

[root@subrouter ~]# cat /etc/bird/bird.conf
protocol static {
        ipv6;
        route ::/0 via "eth0";
}

Убедиться, что default доехал до router:

[root@router ~]# ip -6 r
[root@router ~]# birdc show route

<Router_ID>-3 — это пара: router ID и ifindex интерфейса (тоже 32-бит ID, выбирает BIRD в нашем случае) этого роутера.

Кстати! BIRD умеет записывать результаты не в основную, а в целевую таблицу маршрутизации (параметр kernel table №; в секции protocol kernel).

Обеспечение глобальной связности

Проблема глобальной связности: табличная эскалация и деэскалация, а что между?

https://img-fotki.yandex.ru/get/5637/83739833.27/0_b9007_9151d107_XL.png

Т. е. очередная дихотомия: задачу связности решать надо, анонсировать доступность надо, но вычислять топологию нужно только если от этого есть польза.

(ещё раз упомяну Сети для самых маленьких с замечанием, что по этой теме они точно не про Linux)

Д/З

Новое в образе: обновление системы и bird.

Задание 5

  1. Топология:
    • TODO {{ картинка }}

      /homework5.jpg

    • Маршрутизатор с default-маршрутом "в интернет": gw

    • Ещё два маршрутизатора, резервирующих друг друга: r1 и r2

      • у обоих: один интерфейс в сторону base, другой в общую среду с gw

      • r1, r2 и gw находятся в одном интнете
    • Маршрутизатор первого хопа: base. Подключен к 3 интнетам:

      • сеть с r1

      • сеть с r2

      • сеть с client

    • Клиент client — «просто работает»

  2. Предварительная настройка
    • gw: OSPF в сторону r1 и r2

    • r1, r2: OSPF на обоих интерфейсах

    • base: рассылка RA в сторону client, на остальных интерфейсах OSPF-область

      • Выдать машине client глобальный IP-префикс

    • Там, где надо, включить net.ipv6.conf.all.forwarding

    • Кроме того:
      • на gw указать в BIRD статический маршрут до ::/0 через второй интерфейс;

      • назначить на этот интерфейс иной глобальный адрес, например, 3fff::242. Будем считать, что это ресурс в интернете

Нужно достичь доступности между client и gw.

LecturesCMC/LinuxNetwork2026/Six/05_RAdvOSPF (последним исправлял пользователь ArsenyMaslennikov 2026-04-03 01:49:00)