Динамическая адресация и связность сети
Задачи (повторение):
- Глобальная идентификация (адресация)
- Структура адреса
Механизм раздачи
- Алгоритм доставки (маршрутизация)
- Известный маршрут и маршрут по умолчанию внутри крупной сети
- Связность крупных сетей (карта достижимости / стоимость)
Автоматическая раздача адресов
Повторение: На каждом интерфейсе, на котором включен IP, автоматически генерируется link-local адрес:
узел генерирует интерфейсный идентификатор: например, ::1c80:9aa4:528e:bb85
назначает себе адрес(-а) в префиксе fe80::/64 с младшими битами, взятыми из IID: например, fe80::1c80:9aa4:528e:bb85
Конкретное поведение и способ генерации IID определяет ряд стандартных алгоритмов
- В Linux конкретный алгоритм можно тюнить через sysctl
Можно установить фиксированный IID (в Linux — ip token, ip-token)
- или назначить LLA вручную, если очень хочется
ICMP Router Advertisement
Стандартный механизм динамической настройки конечных узлов основан на сообщениях ICMP, протокола сетевого уровня:
Router Solicitation, "запрос маршрутизатора" (type == 133 == 0x85, RS)
Шлют конечные узлы на ff02::2 на каждом интерфейсе
Router Advertisement, "объявление о маршрутизаторе" (type == 134 == 0x86, RAdv или RA)
Шлют роутеры: или по запросу RS в одни руки, или самовольно на ff02::1 с некоторым периодом (например, 200 секунд)
Высылающий RA узел считается маршрутизатором подсети
Маршрутизатор сообщает информацию о себе и о подсети
- 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
- срок доступности соседа (мс); 0 ⇒ "не определён"
сколько времени запись в ND-таблице пребывает в сост. REACHABLE при отсутствии трафика с соседом
- промежуток времени между повторными NS-запросами (мс); 0 ⇒ "не определён"
- опции в произвольном порядке.
Серверы:
Как узлы автоматически назначают себе адреса?
Маршрутизатор включает в RA-пакет опцию Prefix Information (PIO), по ссылке в т. ч. схема битов. Там указаны:
Сам префикс и его длина (например: 2001:db8:0:cc::/64)
- Сроки действия
- Флаги L и A
- Совершенно никак не связаны с флагами O и M самого пакета RA и друг с другом
- Если L==1, конечный узел добавляет on-link маршрут
в Linux это будет выглядеть, например, так: 2001:db8:0:cc::/64 dev eth1 proto ra pref medium
- Если A==1, конечный узел генерирует адрес, почти как в случае link-local:
генерирует интерфейсный идентификатор (например: ::cbd8:5100:9d29:7342)
назначает себе адрес(-а) в указанном префиксе с младшими битами, взятыми из IID (например: 2001:db8:0:cc:cbd8:5100:9d29:7342)
в Linux: ставит адресу флаг noprefixroute, за соседство отвечает L-бит! (подробнее — ниже)
Для портативных узлов есть Privacy Extensions
- Получив RA-пакет, конечная машина проверяет его на корректность и применяет настройки.
Администратор IP-сети не может явно запретить узлам назначать себе адреса и отвечать на Neighbour Solicitation. Однако, на практике он часто может заставить локальную среду не передавать RA с интерфейсов узлов, не являющихся маршрутизаторами ("RA Guard"), или же подключать узлы к среде в индивидуальном, разрешительном порядке.
On-link determination
При ручной настройке IP-адресов на интерфейсе сразу создаётся и маршрут к адресам из подсети.
При автоматической настройке IP на интерфейсе по объявлению от маршрутизатора (флаг A в RA-опции о префиксе) такая запись в таблицу маршрутов может не вноситься (в Linux включается опция-флаг noprefixroute)
Если узел генерирует себе в анонсируемом префиксе временные адреса (temporary) с некоторым периодом и сроком жизни, то достаточно не более одной такой записи про весь префикс, а не про каждый адрес
- Если анонсируется префикс с флагом L = 0, то IP-подсеть (адреса внутри префикса) доступна через его маршрутизатор, а не напрямую
- ...что имеет смысл, например, в Wi-Fi, где данные идут по радио между станцией и точкой доступа (Station ⇔ AP), а не между станциями
Настройка маршрутизатора BIRD
Добавим в bird.conf, например, на машине router следующее:
protocol device { scan time 10; # Scan interfaces every 10 seconds } # нужен, чтобы BIRD собирал данные с интерфейсов: up/down, назначенные адреса protocol radv downstream { interface "eth1" { prefix 2001:db8:1:cc::/64; }; prefix 2001:db8:1:cc::/64 { }; }
Нужно не забыть настроить router-id!
router id 198.51.100.2;
BIRD без этого отказывается работать; когда будем обсуждать OSPF, будет понятно, почему.
Назначим адреc в нужном префиксе на eth1 командой ip:
% ip -6 a add 2001:db8:1:cc::2/64 dev eth1
BIRD будет анонсировать этот префикс на eth1.
После запуска bird на srv ядро Linux на машине client настроит маршрут по умолчанию и префикс (TODO):
Запустить tcpdump на client и увидеть пакет при старте BIRD и отменяющий пакет при останове.
Динамическое распространение таблиц маршрутизации
- Большая сеть в едином администрировании
- Непростая и/или динамическая топология
- …
⇒ Сложно каждый раз руками делать ip route add
ICMP RA плохо подходит для настройки роутеров как таковых и не подходит для распространения таблиц маршрутизации ⇒ новый протокол.
OSPF версии 3
- отслеживание общего статуса всей сети
- расчёт кратчайшего взвешенного пути по Дейкстре
- удаление петель
- …
Настройка OSPF в BIRD
TODO: verify this configuration. Площадка:
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 export all; # Default is export none } protocol device { scan time 10; # Scan interfaces every 10 seconds } protocol ospf SIMPLE { export all; area 0 { interface "eth1" { }; }; }
router (маршрутизатор)
eth1 — в сети intnet
eth2 — в сети deepnet
bird.conf:
protocol kernel { scan time 20; export all; } protocol device { scan time 10; } protocol ospf SIMPLE { export all; area 0 { interface "eth1" { }; interface "eth2" { }; }; }
client
eth1 — в сети deepnet
bird.conf:
protocol kernel { scan time 20; export all; } protocol device { scan time 10; } protocol ospf SIMPLE { area 0 { interface "eth1" { }; }; }
Настроить, запустить; посмотреть, как приезжают маршруты!
Кстати! BIRD умеет записывать результаты не в основную, а в целевую таблицу маршрутизации (параметр kernel table №; в секции protocol kernel).
Обеспечение глобальной связности
Проблема глобальной связности: табличная эскалация и дескалация, а что между?
- Весь интернет в full view не запихаешь
⇒ укрупнение до «системы под единым администрированием» (внутри таких систем OSPF и ему подобные решают проблемы) — т. н. автономных систем
Выдаются IANA / региональными регистратурами / локальными
Протокол BGP со сложной семантикой
- Анонс собственной доступности
- Вычисление доступности и стоимости других AS
- Вот из AS-ок можно соорудить Full View, но
940 000+ маршрутов
- Имеет смысл только если у вас несколько AS в доступе
и вы хотите пропускать транзитный трафик либо выгадывать на стоимости перенаправления трафиков
Так делает большинство крупных операторов
- Иначе — т. н. «Last resort» (он же default route)
Т. е. очередная дихотомия: задачу связности решать надо, анонсировать доступность надо, но вычислять топологию нужно только если от этого есть польза.
(ещё раз упомяну Сети для самых маленьких с замечанием, что по этой теме они точно не про Linux)
Д/З
Новое в образе: обновление системы и bird.
Задание 5
- Суть: объединить policy routing и OSPF в следующей топологии
Верхний сервер srv: «выход в интернет» + доступность машины client
Нижний сервер web: «выход в интернет» + доступность машины client
Маршрутизатор router:
TCP-соединения на 80-й и 443-й порты идут через web; весь остальной трафик (например, ping или traceroute) — через srv
Клиент client — «просто работает»
Дополнительное условие: никаких заранее заданных статических маршрутов (в т. ч. по умолчанию) в основной таблице маршрутизации, используйте OSPF (в srv и web они приедут по DHCP)
Единственная загвоздка: как не принимать от 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
В теме письма должно встречаться слово LinuxNetwork2023
Один стабильный адрес (), другие 3 временные (temporary), 2 из них устаревшие (preferred_lft == 0)