Динамическая адресация и связность сети
План выглядит длиннее, чем должен был бы, потому что на текущей стадии всё, что нужно здесь сказать, должно присутствовать в письменном виде.
Задачи (повторение):
- Глобальная идентификация (адресация)
- Структура адреса
Механизм раздачи
- Алгоритм доставки (маршрутизация)
- Известный маршрут и маршрут по умолчанию внутри крупной сети
- Связность крупных сетей (карта достижимости / стоимость)
Автоматическая раздача адресов
Повторение: На каждом интерфейсе, на котором включен IP, автоматически генерируется link-local адрес:
узел генерирует интерфейсный идентификатор: например, ::1c80:9aa4:528e:bb85
назначает себе адрес(-а) в префиксе fe80::/64 с младшими битами, взятыми из IID: например, fe80::1c80:9aa4:528e:bb85
конкретное поведение и способ генерации IID определяет ряд стандартных алгоритмов, в Linux конкретный алгоритм можно тюнить через sysctl
Этот механизм подходит и для глобальных адресов (в известном префиксе подсети)!
ICMP Router Advertisement
TODO что такое подсеть
Стандартный механизм динамической настройки конечных узлов основан на сообщениях ICMP, протокола сетевого уровня:
Router Solicitation, "запрос маршрутизатора" (type == 133 == 0x85, RS)
Шлют конечные узлы на группу вещания ff02::2 на каждом интерфейсе
Router Advertisement, "объявление о маршрутизаторе" (type == 134 == 0x86, RAdv или RA)
Шлют роутеры: или по запросу RS в одни руки, или самовольно на ff02::1 с некоторым периодом (например, 200 секунд)
Высылающий RA узел считается маршрутизатором подсети
- ничего нельзя сказать о его единственности
Маршрутизатор сообщает информацию о себе (какой трафик можно направлять ему, router lifetime) и о подсети (параметры ND, MTU в подсети, рекомендуемый hop limit)
- RA позволяет рассказать абонентам о префиксах (диапазонах адресов), DNS-сервере, доп. маршрутах…
- Оба типа сообщений определены как часть Neighbour Discovery
Как и любые ND-сообщения (нужна ссылка на 04_AddressRoute), не подлежат маршрутизации, передаются между узлами в одной среде передачи данных
RA содержит:
8 бит флагов: Managed, Other, H, Pref, Proxy
- Если Other == 1, то клиент должен централизованно получать неадресную информацию у DHCP-сервера (не успеем)
- Если Managed == 1, то у DHCP-сервера нужно получать ещё и адреса
- Pref — 2-битный приоритет маршрута по умолчанию, если он существует: high, medium, low
опции переменной длины
- позволяют передать информацию о подсети: префиксах (диапазонах адресов), DNS-сервере, MTU, ...
- опции одного типа, вообще говоря, могут встречаться более одного раза
- Схема:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Def Hop Limit |M|O| |Prf| | Router Lifetime | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reachable Time | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Retransmit Timer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type-Length-Value Options ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- . . .
- значение Hop Limit по умолчанию
- флаги
- срок действительности маршрута по умолчанию (сек); 0 ⇒ нет default route
- направление всех маршрутов, указанных в RA, неявное — это IP отправителя (роутера)
срок доступности любого соседа (мс) в этой локальной среде; 0 ⇒ "не определён"
сколько времени запись в ND-таблице пребывает в сост. REACHABLE при отсутствии трафика с соседом
промежуток времени между повторными NS-запросами в этой локальной среде (мс); 0 ⇒ "не определён"
- опции в произвольном порядке.
Серверы:
Как узлы автоматически назначают себе адреса?
Администратор принимает решение: "в этом сегменте будет префикс, например, 2001:db8:0:cc::/64"
Маршрутизатор включает в RA-пакет опцию Prefix Information (PIO), по ссылке в т. ч. схема битов. Там указаны:
Сам префикс и его длина (например: 2001:db8:0:cc::/64)
- Сроки действия
- Флаги L и A
- Совершенно никак не связаны с флагами O и M самого пакета RA и друг с другом
- Если A==1, конечный узел генерирует себе адрес, почти как в случае link-local:
генерирует интерфейсный идентификатор (например: ::cbd8:5100:9d29:7342)
назначает себе адрес(-а) в указанном префиксе с младшими битами, взятыми из IID (например: 2001:db8:0:cc:cbd8:5100:9d29:7342)
в Linux: ставит адресу флаг noprefixroute
Для портативных узлов, которые постоянно прыгают из сети в сеть, есть Privacy Extensions — во избежание трекинга
в Linux: можно назначить фиксированный ip-token
- Если L==1, конечный узел добавляет on-link маршрут (адреса в этом префиксе принадлежат локальной сети)
в Linux это будет выглядеть, например, так: 2001:db8:0:cc::/64 dev eth1 proto ra pref medium
- Если L==0, конечный узел добавляет маршрут к префиксу через отправителя RA
TODO пример
Флаг P (не успеем): узел пытается игнорировать флаг A и запросить по DHCPv6-PD целый подпрефикс
- Получив RA-пакет, конечная машина проверяет его на корректность и применяет настройки.
Администратор IP-сети не может явно запретить узлам назначать себе адреса и отвечать на Neighbour Solicitation. Однако, на практике он часто может заставить локальную среду не передавать RA с интерфейсов узлов, не являющихся маршрутизаторами ("RA Guard"), или же подключать узлы к среде в индивидуальном, разрешительном порядке.
On-link determination
Выдержка из 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 — через маршрутизатор)
Если узел генерирует себе в анонсируемом префиксе временные адреса (temporary) с некоторым периодом и сроком жизни, то достаточно не более одной такой записи про весь префикс, а не про каждый адрес
TODO переделать пример
- На одной такой машине:
1 # ip -6 addr show scope global 2 2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000 3 inet6 2a00:f480:8:300:f44:350c:5e39:7125/64 scope global temporary dynamic 4 valid_lft 573933sec preferred_lft 55254sec 5 inet6 2a00:f480:8:300:a3a:b8a7:a5cc:f37e/64 scope global temporary deprecated dynamic 6 valid_lft 487811sec preferred_lft 0sec 7 inet6 2a00:f480:8:300:21b3:4c1a:367:86fc/64 scope global temporary deprecated dynamic 8 valid_lft 401693sec preferred_lft 0sec 9 inet6 2a00:f480:8:300:ddbb:557d:95e7:21ea/64 scope global mngtmpaddr noprefixroute 10 valid_lft forever preferred_lft forever 11
Один стабильный адрес (не temporary), другие 3 временные (temporary), 2 из них устаревшие (preferred_lft == 0)
- Если анонсируется префикс с флагом L = 0, то узлы с адресами внутри префикса доступны через его маршрутизатор, а не напрямую
TODO а точно ли wifi такой?
- ...что имеет смысл, например, в Wi-Fi, где данные идут по радио между станцией и точкой доступа (Station ⇔ AP), а не между станциями.
Но Wi-Fi vendors вынуждены поддерживать IPv4 и прикидываться Ethernet
- несмотря на это, узел может самопроизвольно проявиться как сосед.
Настройка маршрутизатора 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
- отслеживание общего статуса всей сети
- расчёт кратчайшего взвешенного пути по Дейкстре
- удаление петель
- …
Настройка OSPF в BIRD
TODO: улучшить демо.
Площадка:
base (маршрутизатор)
eth0 — выход в интернет не используется
eth1 — в сети intnet
bird.conf:
protocol kernel { learn; # Learn all alien routes from the kernel scan time 20; # Scan kernel routing table every 20 seconds ipv6 { export all; # Default is export none }; } protocol device { scan time 10; # Scan interfaces every 10 seconds } protocol ospf v3 SIMPLE { ipv6 { export all; }; area 0 { interface "eth1" { # towards router }; }; }
router (маршрутизатор)
eth1 — в сети intnet
eth2 — в сети deepnet
bird.conf:
protocol kernel { scan time 20; ipv6 { export all; }; } protocol device { scan time 10; } protocol ospf v3 SIMPLE { ipv6 { export all; }; area 0 { interface "eth1" { # towards base }; interface "eth2" { # towards client }; }; }
client
eth1 — в сети deepnet
bird.conf:
protocol kernel { scan time 20; ipv6 { export all; }; } protocol device { scan time 10; } protocol ospf v3 SIMPLE { area 0 { interface "eth1" { # uplink; towards router }; }; }
После поднятия всех интерфейсов и запуска 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.3198.51.100.4-3 — это пара: router ID и интерфейс (тоже 32-бит ID, выбирает BIRD в нашем случае) этого роутера.
Настроить, запустить; посмотреть, как приезжают маршруты!
Кстати! BIRD умеет записывать результаты не в основную, а в целевую таблицу маршрутизации (параметр kernel table №; в секции protocol kernel).
Обеспечение глобальной связности
Проблема глобальной связности: табличная эскалация и деэскалация, а что между?
- Весь интернет в full view не запихаешь
⇒ укрупнение до «системы под единым администрированием» (внутри таких систем OSPF и ему подобные решают проблемы) — т. н. автономных систем
Выдаются IANA / региональными регистратурами / локальными
Протокол BGP со сложной семантикой
- Анонс собственной доступности
- Вычисление доступности и стоимости других AS
- Вот из AS-ок можно соорудить Full View, но
240 000+ маршрутов, а для многострадального IPv4 — 1 000 000+
- Имеет смысл только если у вас несколько AS в доступе
и вы хотите пропускать транзитный трафик либо выгадывать на стоимости перенаправления трафиков
Так делает большинство крупных операторов
- Иначе — т. н. «Last resort» (он же default route)
Т. е. очередная дихотомия: задачу связности решать надо, анонсировать доступность надо, но вычислять топологию нужно только если от этого есть польза.
(ещё раз упомяну Сети для самых маленьких с замечанием, что по этой теме они точно не про Linux)
Д/З
Новое в образе: обновление системы и bird.
Задание 5 (копипаста; требует переработки)
- Суть: объединить policy routing и OSPF в следующей топологии
Отдельный сервер outworld вместо "выхода в интернет" (облачков на картинке)
Верхний сервер srv: «выход в интернет» + доступность машины client
Нижний сервер web: «выход в интернет» + доступность машины client
Маршрутизатор router:
TCP-соединения на 80-й и 443-й порты идут через web; весь остальной трафик (например, ping или traceroute) — через srv
Клиент client — «просто работает»
Дополнительное условие: никаких заранее заданных статических маршрутов (в т. ч. по умолчанию) в основной таблице маршрутизации, используйте OSPF (в srv и web они приедут по RAdv)
Единственная загвоздка: как не принимать от web маршрут по умолчанию в основную таблицу маршрутизации на router
Допустимо использовать статические маршруты в целевых таблицах маршрутизации (в идеале они тоже должны заполняться OSPF, но я сам пока не пробовал)
ВНИМАНИЕ! Предварительная настройка в отчёт не входит! Отчёт делается по уже работоспособной сети. Отчёт (конфигурацию bird надо показывать, даже если вы его на данном хосте не использовали):
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
report 5 router
ip addr
ip route
ip rule
ip route list table <номер>
<номер> — это номер целевой таблицы маршрутизации для web
- Если в вашем решении используется несколько целевых таблиц, команда выполняется для каждой
grep "^[^#]" /etc/bird.conf
birdc show route
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
Четыре отчёта с названиями report.05.router, report.05.srv, report.05.web, report.05.client переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru
В теме письма должно встречаться слово LinuxNetwork2026

Два бирда налаживают соседство и устанавливают common knowledge