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

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

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

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

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

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

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

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

ICMP Router Advertisement

TODO что такое подсеть

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

RA содержит:

Серверы:

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

/!\ Администратор 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.

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

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

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

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

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

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

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

#router id 198.51.100.3;
router id 0xc6336403;

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

Назначим адреc в нужном префиксе на 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: улучшить демо.

Площадка:

После поднятия всех интерфейсов и запуска bird на трёх машинах:

[root@base ~]# birdc show ospf n SIMPLE
BIRD 3.2.0 ready.
SIMPLE:
Router ID       Pri          State      DTime   Interface  Router IP
198.51.100.3      1     Full/BDR        35.253  eth1       fe80::a00:27ff:fea6:2da4

[root@router ~]# birdc show ospf n SIMPLE
BIRD 3.2.0 ready.
SIMPLE:
Router ID       Pri          State      DTime   Interface  Router IP
198.51.100.2      1     Full/DR         37.749  eth1       fe80::a00:27ff:fe99:69e6
198.51.100.4      1     Full/DR         30.463  eth2       fe80::a00:27ff:fe08:5e3f

[root@client ~]# birdc show ospf n SIMPLE
BIRD 3.2.0 ready.
SIMPLE:
Router ID       Pri          State      DTime   Interface  Router IP
198.51.100.3      1     Full/BDR        35.947  eth1       fe80::a00:27ff:fe7e:e445

Hello timer у всех по умолчанию равен 10, так что роутеры увидят друг друга за 20 секунд.

Взгляд на систему с точки зрения машины client:

[root@client ~]# birdc show ospf state
BIRD 3.2.0 ready.

area 0.0.0.0

        router 198.51.100.2
                distance 20
                network [198.51.100.2-4] metric 10
                external ::/0 metric2 10000

        router 198.51.100.3
                distance 10
                network [198.51.100.2-4] metric 10
                network [198.51.100.4-3] metric 10

        router 198.51.100.4
                distance 0
                network [198.51.100.4-3] metric 10

        network [198.51.100.2-4]
                distance 20
                router 198.51.100.2
                router 198.51.100.3

        network [198.51.100.4-3]
                distance 10
                router 198.51.100.4
                router 198.51.100.3

198.51.100.4-3 — это пара: router ID и интерфейс (тоже 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. Суть: объединить policy routing и OSPF в следующей топологии
    • ../../../LinuxNetwork2022/05_IProuteRule/PortRouting.svg

    • Отдельный сервер outworld вместо "выхода в интернет" (облачков на картинке)

    • Верхний сервер srv: «выход в интернет» + доступность машины client

    • Нижний сервер web: «выход в интернет» + доступность машины client

    • Маршрутизатор router:

      • TCP-соединения на 80-й и 443-й порты идут через web; весь остальной трафик (например, ping или traceroute) — через srv

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

    • Дополнительное условие: никаких заранее заданных статических маршрутов (в т. ч. по умолчанию) в основной таблице маршрутизации, используйте OSPF (в srv и web они приедут по RAdv)

      • Единственная загвоздка: как не принимать от web маршрут по умолчанию в основную таблицу маршрутизации на router

      • Допустимо использовать статические маршруты в целевых таблицах маршрутизации (в идеале они тоже должны заполняться OSPF, но я сам пока не пробовал)

  2. <!> ВНИМАНИЕ! Предварительная настройка в отчёт не входит! Отчёт делается по уже работоспособной сети.

  3. Отчёт (конфигурацию bird надо показывать, даже если вы его на данном хосте не использовали):

    1. report 5 srv и report 5 web (они, по идее, идентичны?):

      • ip addr

      • ip route

      • grep "^[^#]" /etc/bird.conf

      • birdc show route

      • ping -c3 <client>

        • <client> — это IP-адрес клиента

      • tcpdump -i eth0 -c 2 tcp

    2. report 5 router

      • ip addr

      • ip route

      • ip rule

      • ip route list table <номер>

        • <номер> — это номер целевой таблицы маршрутизации для web

        • Если в вашем решении используется несколько целевых таблиц, команда выполняется для каждой
      • grep "^[^#]" /etc/bird.conf

      • birdc show route

    3. client

      • ip addr

      • ip route

      • grep "^[^#]" /etc/bird.conf

      • birdc show route

      • dig +tcp @1.1.1.1 ya.ru

      • echo -e "GET / HTTP/1.1\nHOST: ya.ru\n" | netcat 77.88.55.242 80

  4. Четыре отчёта с названиями report.05.router, report.05.srv, report.05.web, report.05.client переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru

    • В теме письма должно встречаться слово LinuxNetwork2026

LecturesCMC/LinuxNetwork2026/Six/05_RAdvOSPF (последним исправлял пользователь FrBrGeorge 2026-03-18 22:21:10)