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

Долг за прошлую лекцию: Proxy ARP

(я воспользуюсь читерским скриптом autonet, который настраивает в виртуалках сеть, пользуясь полем SKU Number: в аппаратном профиле; этот скрипт также включает net.ipv4.ip_forward=1)

<!> Возможно, в связи с этим что-то из лекции придётся пропустить — не успеем.

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

  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 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 какой-то-номер

Получаем такую настройку:

   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

Некоторые провайдеры, например, «Акадо», блокируют DNS-запросы на сторонние сервера. Если вам не повезло с таким провайдером, посмотрите в файл /etc/resolv.conf на машине srv после настройки по DHCP. Там будет IP-адрес «ближайшего» DNS-сервера, который надо использовать вместо 1.1.1.1

  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 зону 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.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 (если DNS-сервер 1.1.1.1 недоступен, используйте ваш локальный DNS, который появится на base в файле resolv.conf после запуска dhcpcd eth0)

      • ip addr

      • ip route

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

      • birdc show route

      • dig +tcp @1.1.1.1 oeis.org # см. выше про 1.1.1.1

      • echo -e "GET / HTTP/1.1\nHOST: oeis.org\n" | netcat 104.239.138.29 80

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

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

LecturesCMC/LinuxNetwork2024/05_OSPFRule (последним исправлял пользователь FrBrGeorge 2024-03-27 15:12:32)