Интерфейсный уровень: сетевые мосты и VLAN
- Забегая вперёд: настройка IP (иначе так бы и пришлось фреймы гонять socat-олм)
# ip address add dev eth1 10.3.2.1/24
10.3.2.1 — просто какой-то адрес из внутреннего диапазона
/24 — количество битов в адресе сети (aka «сетевая маска 255.255.255.0»)
Если не ошибиться в настройке IP, доступность абонентов локальной сети на интерфейсном уровне можно будет проверить на сетевом, с помощью ping, например.
Среда передачи данных из нескольких носителей
Задача: имеется несколько сред передачи данных, каждая по своему носителю. Интерфейсный уровень всех сред совместим. Организовать единую среду, работающую поверх всех носителей — локальную сеть.
- Повторение: инкапсуляция и декапсуляция трафика между уровнями
В частности, Eth → IP и IP -> Eth
- Несколько сред передачи данных на одном устройстве
- Eth0 → IP / маршрутизация / IP → Eth1 — маршрутизатор, это потом
- Eth0 → Eth1 — мост / хаб
Что нужно для того, чтобы превратить Linux-машину в хаб?
- Постоянный promisc режим (для пересылки всего всем)
- Постоянная ретрансляция всего повсюду (но зачем?)
Что нужно для того, чтобы превратить Linux-машину в мост?
- Постоянный promisc режим
- Построение таблиц вида «eth → MAC» всех активных абонентов
- Динамическая актуализация таблиц
- Полная ретрансляция широковещательных фреймов
- Полная ретрансляция фреймов с (пока) неизвестным получателем (возможность для атаки!)
- Целевая ретрансляция фреймов с интерфейса на интерфейс по таблице абонентов
Дополнительные свойства моста:
- antispoof
(примеры посмотреть не успеем) Firewall уровня 2: Поддержка firewall L2 в nftables.
- Фильтрация на основании MAC-адреса (отправителя или получателя) / интерфейса
- Перенаправление между интерфейсами на основании MAC-адреса (отправителя или получателя)
- …
не особо работает, потому что у большинства устройств можно сменить MAC:
# ip link set dev eth1 address 08:07:06:05:04:03
Создание моста
Три хоста:
- Базовый
- Клон
- Клон-мост
Ethernet-подключение:
- Базовый
- сеть A
- Клон
- Сеть B
- Клон-мост
- сеть A
- Сеть B
На клон-мосту:
ip link add dev имя type bridge
ip link set имя up (и всех интерфейсов для бриджа)
ip link set ethN master имя (для всех интерфейсов бриджа)
ip l их покажет, и bridge link тоже
bridge monitor покажет обновление таблиц, а bridge fdb — сами таблицы
На самом деле всё! Настроим сеть с двух сторон и запингаем!
Добавим ещё клон:
- Клон2
- Сеть B
Теперь за интерфейсом eth2 клона-моста есть уже два абонента, и один — за eth1. Благодаря мосту все три абонента считают, что они подключены к единой среде передачи данных.
Другими параметрами моста можно управлять с помощью команды bridge
VLAN
Два термина:
- «Инженерный» — группа объединённых в единую среду передачи данных интерфейсов, изолированная от других групп интерфейсов
«Теоретический» — поток фреймов, снабжённых дополнительным полем — тегом VID (идентификатором виртуальной сети). Такие теги необходимо сначала рассортировать по VID, затем (аппаратно или программно) удалить оттуда тег, и только затем их можно декапсулировать в IP.
- (автора статьи в русской Википедии слегка пришибло инженерным подходом)
Про IEEE_802.1Q:
На месте EtherType — 0x8100 + ещё 2 октета (включая VID); а уже потом EtherType
- VID 1 часто используется для управления
- Аппаратно поддерживается почти всеми карточками
- А ещё бывает два тега подряд и всякое…
Путаница двух терминов!
Если видите в тексте «тегированные» и «нетегированные» VLAN-ы — это инженерный подход
- В этом случае речь идёт про воображаемое или задаваемое сетевой апаратурой объединение интерфейсов в группы, а в реальности по сети ходят вперемежку 802.1Q-фреймы и обычные фреймы соответственно.
- Например, если два интерфейса объединить в один бридж, а два других — в другой, получится как бы два изолированных «нетегированных VLAN-а»
- Если успеем, это можно смоделировать
- Если успеем, это можно смоделировать
Мы будем явно различать
- 802.1Q-фреймы как «фреймы из VLAN такой-то»
- «просто фреймы» (без поля 802.1Q)
Пример использования 802.1Q
Шесть хостов:
- Базовый
- Сеть A
- Клон
- Сеть B
- Мост1
- Сеть A
- Сеть B
- Сеть С
- Мост2
- Сеть D
- Сеть E
- Сеть С
- Клон2
- Сеть D
- Клон3
- Сеть E
Идея в том, чтобы
на мосту-1 завернуть фреймы «сети A» в один vlan, а «сети B» — в другой и запустить их все вперемежку в «сеть C»
- на мосту-2 выковырять их из «сети C» и разложить в «сеть D» и «сети E» соответственно
- Таким образом, Базовый окажется в одной сети с Клоном2, а Клон — с Клоном3
На обоих мостах — одинаковая конфигурация:
- Вынимаем из сети C два VLAN-а (допустим, 5 и 7):
ip link add link eth3 name vlan№ type vlan id №
Создаём два бриджа, добавляем туда по одному VLAN-у и eth1 либо eth2
ip link add dev br№ type bridge
ip link set vlan№ master br№
ip link set eth№№ master br№
Делаем всем интерфейсам set up
- Например, так:
# for I in `ls /sys/class/net`; do ip link set $I up; done
- Например, так:
После настройки IP на 4 клонах образуется 2 VLAN-а, которые не смешиваются
Чтобы посмотреть, Какой именно VLAN ID фильтруется на связанном интерфейсе, надо поискать строку 802.1Q в выдаче команды ip -d link связвнный@интерфейс
Настройка VALN-ов может быть не настолько атомарной, для этого используется команда bridge vlan
Если успеем: простой способ передачи отчётов из виртуалок
Интерфейс eth0 в виртуалках — особенный: он напрямую выходит в вашу сеть (с точки зрения хост-системы это выглядит так, как если бы сама программа VirtualBox обращалась к сети).
- Внутри такой «сети» есть «сервер», который раздаёт автоматическую настройку
Достаточно запустить dhcpcd eth0, и интерфейс будет поднят и настроен как 10.0.2.15/24.
Адрес хост-системы при этом — 10.0.2.2/24
Достаточно иметь на хост системе (или где-нибудь ещё запущенный Secure Shell сервер и выполнить
scp report.* пользователь@10.0.2.2:
или, например, scp report.* факультетский_аккаунт@prac.cs.msu.ru:
Настраивать eth0 надо строго после формирования всех отчётов, а не то в них добавится лишняя информация!
Д/З
TODO Образ не изменился.
Задание 3
Поскольку последний пример из лекции «толстоват» (6 вируталок), в Д/З предлагается сделать не очень актуальный, но зато более простой вариант:
- Площадка:
- Базовая машина:
Интерфейс eth1 подключён к сети-1
- Клон:
Интерфейс eth1 подключён к сети-2
- Мост:
Интерфейс eth1 подключён к сети-1
Интерфейс eth2 подключён к сети-2
- Базовая машина:
- Отчёт:
Мост (report 3 bridge)
Задать линк, достающий из сети-1 фреймы 802.1Q с VID 7
Задать линк, достающий из сети-2 фреймы 802.1Q с VID 9
- Объединить оба линка бриджем
- Поднять все интерфейсы
Базовая машина (report 3 base)
Задать линк, достающий из сети-1 фреймы 802.1Q с VID 7
Настроить ip-адрес этого интерфейс-линка (да, ip должен быть именно на vlan7@eth1)
- Поднять все интерфейсы
Запустить tcpdump -c 8 на этом интерфейс-линке
Клон (report 3 clone)
Задать линк, достающий из сети-2 фреймы 802.1Q с VID 9
Настроить ip-адрес этого интерфейс-линка (да, ip должен быть именно на vlan9@eth1)
- Поднять все интерфейсы
Запустить ping -c 8 адрес_базовой_машины (должен проходить)
Три отчёта (report.03.base, report.03.bridge и report.03.clone) именно с такими названиями переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru
В теме письма должно встречаться слово LinuxNetwork2024