Лабораторная работа 8. SDN: сегментация и маршрутизация

Цель

Вы разделите сеть на VLAN и настроите маршрутизацию между ними через SDN-контроллер.

Задачи

  1. Разделите четыре клиента на две VLAN.
  2. Настройте trunk между двумя OVS-мостами через Faucet.
  3. Подтвердите изоляцию, затем включите L3 на контроллере.
  4. Переведите клиента в другой сегмент и повторите матрицу связности.

Рабочее окружение

Вам понадобятся знания из ЛБ7 и Ubuntu-ВМ. Укажите в отчёте, сколько времени заняла работа. На ВМ:

cd ~/labs-mag/containerlab/lab8
sudo bash up.sh
 a ─ порт 1:l8s1:порт 3 ═══ порт 3:l8s2:порт 1 ─ c
 b ─ порт 2      │                   │      порт 2 ─ d
                └──── Faucet ───────┘
КлиентПорт OVSVLANАдрес eth1Будущий шлюз
al8s1:1red, 10010.8.100.10/2410.8.100.1
bl8s1:2blue, 20010.8.200.10/2410.8.200.1
cl8s2:1red, 10010.8.100.20/2410.8.100.1
dl8s2:2blue, 20010.8.200.20/2410.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 и правила для одного межсегментного пакета. Ответьте:

  1. Чем native_vlan отличается от tagged_vlans?
  2. Почему одного изменения IP клиента недостаточно для смены VLAN?
  3. Почему связность между VLAN после включения L3 не нарушает L2-сегментацию?
  4. Что доказывают 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 и уберите свои клиентские команды.