An open API service indexing awesome lists of open source software.

https://github.com/sadimer/sdn_hw


https://github.com/sadimer/sdn_hw

Last synced: about 1 year ago
JSON representation

Awesome Lists containing this project

README

          

# Задание по SDN для спецкурса "Современные облачные технологии"

## Гайд по установке и запуску
**Установить на свой компьютер openvswitch**

Для debian/ubuntu: ```sudo apt-get install openvswitch-switch```

Для rhel/centos/rocky: ```sudo yum install openvswitch``` или ```sudo dnf install openvswitch```

**Установить mininet и osken:**

```sudo pip install -r requirements.txt```

Либо ```sudo apt-get install mininet``` или ```sudo yum install mininet``` или ```sudo dnf install mininet```

**Запустить конфигурацию Mininet для отладки вашего алгоритма (на примере задачи 1):**

```sudo python3 tasks/task_1/mininet_cli.py```

**Запустить контроллер OSKen в режиме отладки (на примере задачи 1):**

```sudo osken-manager tasks/task_1/task.py```

**Запустить оценочное тестирование:**

```sudo pytest .```

## Задание 1 (6 баллов из 10)

В этом задании вам нужно реализовать алгоритм обучения MAC-адресов (MAC Learning) в файле `tasks/task_1/task.py` с использованием фреймворка OSKen для создания SDN-приложений.

### Как работает обучение MAC-адресов в коммутаторе:
1) Когда устройство получает пакет на одном из портов, оно проверяет заголовок Ethernet-кадра.
2) Извлекает из него MAC-адрес отправителя.
3) Запоминает порт, на который пришёл пакет, и добавляет эту информацию в таблицу коммутации `mac_table` (данное поле класса `SimpleSwitch`).
4) Если в таблице уже есть запись с `destination MAC-адресом` пакета, коммутатор перенаправляет его на порт, указанный в таблице. Если же записи нет, то коммутатор делает широковещательную рассылку, отправляя пакет на все доступные порты.

### Важно:
Для выполнения задания вам потребуется запрограммировать обработку пакетов, попадающих на контроллер, и настройку правил `match-action`. Эти правила позволят устройствам коммутатора узнавать, где находится `destination MAC_ADDRESS`, и прекращать широковещательную рассылку.

Для этого:
- По умолчанию, в таблице каждого коммутатора должно быть правило с наименьшим приоритетом, отправляющее пакеты на контроллер, если для них нет соответствующих `destination MAC_ADDRESS` правил.
- При отправке пакета на контроллер генерируется событие `EventOFPPacketIn`, в теле которого содержатся все слои пакета по модели OSI. Вы можете использовать это событие для обработки необходимых полей.

Ссылки на полезные ресурсы: [Примеры на GitHub](https://github.com/faucetsdn/ryu/blob/master/ryu/app) и [документация OSKen](https://docs.openstack.org/os-ken/latest/developing.html).

## Задание 2 (4 балла из 10)

В этом задании нужно расширить алгоритм обучения MAC-адресов с учётом VLAN. Реализацию выполняем в файле `tasks/task_2/task.py` с помощью OSKen.

### Отличие от предыдущего задания:
Теперь порты разделяются на разные сегменты (VLAN), и в каждом VLAN могут быть порты с одинаковыми IP-адресами.
- Порты с MAC-адресами из списка ниже будут работать в режиме `ACCESS`, соответствующем указанному VLAN.
- Остальные порты будут работать в режиме `TRUNK`, предназначенном для связи между коммутаторами.

![VLAN схема](https://media.fs.com/images/community/upload/kindEditor/202110/08/1-02-1633674435-O7SvTEZXYz.jpg)

### Важно:
- Для каждого VLAN создаётся отдельная таблица MAC-адресов на каждом коммутаторе.

```python
VLAN_MAPPING = {
"10:00:00:00:00:01": 1,
"10:00:00:00:00:02": 1,
"10:00:00:00:00:06": 1,
"10:00:00:00:00:03": 2,
"10:00:00:00:00:04": 2,
"10:00:00:00:00:05": 2,
}