Лабораторная работа 8. SDN: сегментация и маршрутизация
Цель
Вы разделите сеть на VLAN и настроите маршрутизацию между ними через SDN-контроллер.
Задачи
- Разделите четыре клиента на две VLAN.
- Настройте trunk между двумя OVS-мостами через Faucet.
- Подтвердите изоляцию, затем включите L3 на контроллере.
- Переведите клиента в другой сегмент и повторите матрицу связности.
Рабочее окружение
Вам понадобятся знания из ЛБ7 и Ubuntu-ВМ. Укажите в отчёте, сколько времени заняла работа. На ВМ:
cd ~/labs-mag/containerlab/lab8
sudo bash up.sh a ─ порт 1:l8s1:порт 3 ═══ порт 3:l8s2:порт 1 ─ c
b ─ порт 2 │ │ порт 2 ─ d
└──── Faucet ───────┘| Клиент | Порт OVS | VLAN | Адрес eth1 | Будущий шлюз |
|---|---|---|---|---|
| a | l8s1:1 | red, 100 | 10.8.100.10/24 | 10.8.100.1 |
| b | l8s1:2 | blue, 200 | 10.8.200.10/24 | 10.8.200.1 |
| c | l8s2:1 | red, 100 | 10.8.100.20/24 | 10.8.100.1 |
| d | l8s2:2 | blue, 200 | 10.8.200.20/24 | 10.8.200.1 |
DPID: l8s1 — 0x0801, l8s2 — 0x0802. Начальная конфигурация содержит одну VLAN lab; в первом задании вы замените её на red/blue. eth0 клиентов не меняйте. OVS настраивайте через Faucet; команды ovs-vsctl set Port ... tag=... и ручное добавление flows не являются решением задания.
Задание 1. Сегментация
1. На ВМ откройте configs/faucet/faucet.yaml. Замените раздел vlans:
vlans:
red:
vid: 100
blue:
vid: 200В interfaces каждого datapath задайте:
- порт 1:
native_vlan: red; - порт 2:
native_vlan: blue; - порт 3:
tagged_vlans: [red, blue], безnative_vlan.
Сохраните существующие name и dp_id. Числовые ключи портов не превращайте в имена Linux-интерфейсов.
2. Проверьте конфигурацию, примените и подключите мосты на ВМ:
sudo docker exec clab-labs8-controller check_faucet_config /etc/faucet/faucet.yaml
sudo docker kill --signal=HUP clab-labs8-controller
CTRL=$(sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' clab-labs8-controller)
sudo ovs-vsctl set-controller l8s1 "tcp:$CTRL:6653"
sudo ovs-vsctl set-controller l8s2 "tcp:$CTRL:6653"
sudo ovs-vsctl list Controller
sudo docker logs --tail 40 clab-labs8-controllerПосле каждого изменения YAML повторяйте проверку до HUP и проверяйте журнал после него. Успешный разбор YAML сам по себе не подтверждает применение.
3. Откройте клиентов через sudo docker exec -it clab-labs8-a bash и аналогично b/c/d. В каждом контейнере назначьте адрес eth1 по таблице и поднимите интерфейс. Для a:
ip address add 10.8.100.10/24 dev eth1
ip link set eth1 up
ip route add 10.8.200.0/24 via 10.8.100.1Для c маршрут аналогичен. В b и d добавьте маршрут в 10.8.100.0/24 через 10.8.200.1. Маршруты задайте сейчас, чтобы последующий отказ отражал отсутствие L3 на контроллере, а не отсутствие маршрута на клиенте.
Задание 2. Проверка изоляции
1. Проверьте ping в обе стороны внутри VLAN: a↔c и b↔d. Затем a→b, a→d, c→b: до включения L3 ответы на эти запросы приходить не должны. Для каждого опыта сохраните ip route get АДРЕС, ip neigh show dev eth1 и ping -c 4 -W 2 АДРЕС.
2. На ВМ начните захват trunk:
sudo tcpdump -i l8x -w /tmp/lab8-vlan.pcapПовторите успешные проверки, остановите захват и прочитайте sudo tcpdump -enn -r /tmp/lab8-vlan.pcap. Найдите теги 100 и 200. Сравните с кадром на eth1 клиента, где access-трафик не содержит 802.1Q.
Задание 3. Маршрутизация через Faucet
1. На ВМ дополните определения VLAN в faucet.yaml:
vlans:
red:
vid: 100
faucet_vips: [10.8.100.1/24]
faucet_mac: '0e:00:00:08:01:01'
blue:
vid: 200
faucet_vips: [10.8.200.1/24]
faucet_mac: '0e:00:00:08:02:01'
routers:
inter-vlan:
vlans: [red, blue]Остальные разделы сохраните. Повторите проверку конфигурации, HUP и проверку журнала. Клиентские маршруты не меняйте.
2. Повторите ping для всех пар клиентов a/b/c/d. После того как контроллер определит соседей, связь должна работать между всеми клиентами. Найдите ARP-ответы шлюза, проверьте адрес назначения Ethernet и изменение TTL при переходе между VLAN. На ВМ сравните:
sudo ovs-ofctl -O OpenFlow13 dump-flows l8s1
sudo ovs-ofctl -O OpenFlow13 dump-flows l8s2Найдите маршрутизирующие правила и объясните, где фактически пересылается пакет.
Задание 4. Ошибка trunk и перенос клиента
1. Удалите blue из tagged_vlans порта 3 на l8s2, примените конфигурацию. Проверьте b→d и a→c. Связь через trunk для blue должна пропасть, а для red — сохраниться. Сверьте конфигурации двух концов и PCAP. Верните blue, повторите проверки.
2. Самостоятельно перенесите c в blue через native_vlan порта 1 l8s2. До изменения запишите новую матрицу. После применения измените адрес c на 10.8.200.30/24 и его маршрут в red через 10.8.200.1; удалите старый адрес и старый маршрут. Включённая L3 может сохранить связь между всеми клиентами, но VLAN, шлюз и необходимость маршрутизации для выбранных пар изменятся.
3. Чтобы проверить, что клиент перешёл в другую VLAN, временно удалите раздел routers из конфигурации Faucet. Связь b↔c и c↔d должна работать, а a→c — нет. Восстановите L3, затем верните c в исходную red и повторите матрицу. Изоляцию меняет конфигурация контроллера; изменение IP-адреса клиента только согласует его подсеть с новым сегментом.
Отчёт и вопросы для защиты
Приложите YAML до/после L3, матрицы для трёх состояний, trunk-PCAP и правила для одного межсегментного пакета. Ответьте:
- Чем native_vlan отличается от tagged_vlans?
- Почему одного изменения IP клиента недостаточно для смены VLAN?
- Почему связность между VLAN после включения L3 не нарушает L2-сегментацию?
- Что доказывают MAC шлюза и изменение TTL?
Сохранение и завершение
Сохраните финальную адресацию и маршруты в configs/*/startup.sh. YAML уже находится на ВМ. Выполните sudo bash verify.sh routed; для проверки состояния до L3 предусмотрено sudo bash verify.sh isolated.
Скопируйте PCAP и конфигурации в отчёт. Выполните sudo bash down.sh. Для повтора: up.sh, получите новый CTRL, подключите оба моста и повторите матрицу. Для полного повторения задания верните стартовую конфигурацию с одной VLAN и уберите свои клиентские команды.