Связность сети и целевая маршрутизация

TODO лекция была прочитана за 1:10, есть +20 минут на какую-нибудь тему

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

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

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

Автоматическая настройка «выхода в интернет» (быстрый старт)

Можно посмотреть /etc/resolv.conf и ip route show (оно же ip r).

Ещё немного читерства:

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

⇒ Сложно каждый раз руками делать ip route del / ip route add на всех машинах сразу

OSPF

ПО: zebra, quagga, bird, frr, …

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

Площадка:

Итак:

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

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

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

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

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

Целевая маршрутизация

Destination-based принцип табличной маршрутизации: «сеть получателя ⇒ маршрут».

Задача source-based маршрутизации: «свойства пакета отправителя ⇒ маршрут».

Linux: просто заведём несколько таблиц маршрутизации (разных), и будем обрабатывать пакет по правилам одной из них сообразно его свойствам:

Команда ip rule (немного документации)

Заготовка:

  1. Два компьютера с выходом в интернет у каждого

  2. Маршрутизатор, подключённый к этим двум машинам по отдельным интерфейсам и третьей сетью для внутренних клиентов

Пример 1: подключаем два клиента ко внутренней сети, настраиваем source routing: с одного адреса пакеты в одну сторону, с другого — в другую

При этом настраиваем сеть как обычно для IP_A, а для второго клиента делаем так:

# ip route add default второй_сервер table какой-то-номер
# ip rule add from «IP_B» table какой-то-номер

Пример 2: подключаем один клиент, перекидываем трафик по 80/443 портам в другую сторону

# ip route add default второй_сервер table какой-то-номер
# ip rule add dport 80 table какой-то-номер

Получаем такую настройку (первый пример от второго отличается только правилом 32765):

   1 [root@router ~]# ip rule list
   2 0:      from all lookup local
   3 32765:  from all dport 80 lookup какой-то-номер
   4 32766:  from all lookup main
   5 32767:  from all lookup default
   6 [root@router ~]# ip route list
   7 default via Сервер1 dev eth1
   8 
   9 [root@router ~]# ip route list table какой-то-номер
  10 default via Сервер2 dev eth2
  11 

Правила в ip rule

Разумеется, в обоих примерах на серверах надо дополнительно настраивать маршрут в клиентскую сеть через центральный маршрутизатор.

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

Д/З

Новое в образе (за несколько итераций):

Задание 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).

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

    • Подсказка. Есть три варианта настройки web;

      1. Я делал так:
        • На srv вписал в 0.0.0.0 зону ipv4 { export all; }; (чтобы пропихивать маршрут по умолчанию), а на web — нет;

        • При этом на web приезжают два неправильных маршрута через srv: 0.0.0.0/0 — default, и 10.0.2.0/24 ( <!> «выход в интернет» на обеих машинах настроен идентично!)

      2. Поэтому я в протокол kernel вписал preference 200 (записи в таблице ядра стали более приоритетны, чем в таблице OSPF; по умолчанию — наоборот, у OSPF приоритет 100, а у kernel — 10).

      3. Можно использовать фильтр на web в секции protocol ospf:

        import filter { if (net = 0.0.0.0/0 || net = 10.0.2.0/24) then reject; accept; };
      4. (не рекомендуется: это абъюз условия, хотя формально всё верно) Поскольку статические маршруты в целевых таблицах маршрутизации разрешены, можно на web вообще не запускать bird, а создать целевую таблицу маршрутизации на client и соответствующее правило.

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

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

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

      • ip addr

      • ip route

      • grep "^[^#]" /etc/bird/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/bird.conf

      • birdc show route

    3. client

      • ip addr

      • ip route

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

      • birdc show route

      • dig +tcp @<dns-server> oeis.org

        • <dns-server> — это адрес, оказавшийся в файле /etc/resolv.conf на машине srv после настройки по DHCP

      • echo -e "GET / HTTP/1.1\nHOST: oeis.org\n" | netcat -i1 <ip-адрес> 80

        • <ip-адрес> — это один из адресов, которые вернёт dig

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

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

LecturesCMC/LinuxNetwork2025/05_OSPFRule (последним исправлял пользователь FrBrGeorge 2025-03-24 15:03:44)