Различия между версиями 9 и 10
Версия 9 от 2023-07-01 19:39:28
Размер: 20560
Редактор: ArsenyMaslennikov
Комментарий: bird2 has hit the rolling repo
Версия 10 от 2023-12-04 02:06:16
Размер: 20624
Редактор: ArsenyMaslennikov
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 71: Строка 71:
 * подсистема Open vSwitch: [[https://ovn.org/|OVN]]

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

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

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

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

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

Повторение: На каждом интерфейсе, на котором включен 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"), или же подключать узлы к среде в индивидуальном, разрешительном порядке.

При ручной настройке 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

  • отслеживание общего статуса всей сети
  • расчёт кратчайшего взвешенного пути по Дейкстре
  • удаление петель

ПО: zebra, quagga, bird, frr

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

TODO: verify this configuration. Площадка:

  • ../../../LinuxNetwork2023/05_OSPFRule/Routing.svg

  • 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 и ему подобные решают проблемы) — т. н. автономных систем

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

  • Выдаются IANA / региональными регистратурами / локальными

  • Протокол BGP со сложной семантикой

    • Анонс собственной доступности
    • Вычисление доступности и стоимости других AS
  • Вот из AS-ок можно соорудить Full View, но
    • 940 000+ маршрутов

    • Имеет смысл только если у вас несколько AS в доступе
      • и вы хотите пропускать транзитный трафик либо выгадывать на стоимости перенаправления трафиков

    • Так делает большинство крупных операторов

  • Иначе — т. н. «Last resort» (он же default route)

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

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

Д/З

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

Задание 5

  1. Суть: объединить policy routing и OSPF в следующей топологии
    • ../../../LinuxNetwork2022/05_IProuteRule/PortRouting.svg

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

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

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

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

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

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

      • Единственная загвоздка: как не принимать от 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

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

LecturesCMC/LinuxNetwork2023/Six/05_RAdvOSPF (последним исправлял пользователь ArsenyMaslennikov 2023-12-04 02:06:16)