flowchart LR
A["PC1"] --> B["Router1"]
B --> C["Router3"]
C --> D["PC3"]
6 Лабораторная работа №1 по информатике ‘Построение и настройка простой сети’
6.1 Введение
Подготовлено на основе материала Брайана Линка (https://brianlinkletter.com/2021/05/use-containerlab-to-emulate-open-source-routers/) и является его переводом.
Цель работы: подготовить виртуальную сеть из контейнеров и сымитировать возможные неполадки в ней.
Документируйте свои действия и их результатыв простом вордовском файле. Это будет ваш отчет! Можно в простом формате файл-скриншот с результатами.
6.2 Практическая часть
6.2.1 Подготовка
Минимальные требования для выполнения: 2 ядра ЦПУ и 2 Гб ОЗУ.
Для выполнениим данной лабораторной работы вам потребуется:
- Компьютер с операционной системой Linux (сборки Debian или Ubuntu)
- Docker - контейнеризатор приложений
- Containerlab - программное обеспечение для моделирования сетей
Если подходящего компьютера нет в наличии, можно выйти из положения двумя способами. Первый, если у вас компьютер с операционной системой Windows 10/11, можно установить Windows Subsystem for Linux 2 (WSL2). Подробная инструкция представлена на сайте Microsoft. Второй путь заключается в создании виртуальной машины. Её можно создать с помощью программы VirtualBox. Для создания виртуальной машины вам потребуется образ операционной системы, который можно скачать на сайте разработчика операционной системы (для примера). Инструкцию по созданию виртуальной машины можно посмотреть здесь. Рекомендую выделить минимум 40 гб на виртуальный жесткий диск и половину от максимального количества оперативной памяти и ядер процессора.
Установка Docker и Containerlab осуществляется в терминале. Для установки вам потребуются права администратора.
Docker
```{bash}
sudo apt install apt-transport-https ca-certificates
sudo apt install -y curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt update
apt-cache policy docker-ce
sudo apt install -y docker-ce
```Containerlab
```{bash}
bash -c "$(curl -sL https://get.containerlab.dev)"
```Для скачивания образов контейнеров необходимо зарегистрироваться на сайте Docker Hub и авторизоваться в командной строке.
```{bash}
sudo docker login
```6.2.2 Создание сети
Containerlab поддерживает любую свободно доступную сетевую операционную систему, которые запускает как Linux контейнер. Для начала создайте папку, в которой мы будем хранить наши файлы.
```{bash}
mkdir -p ~/Documents/lab
cd ~/Documents/lab
```6.2.2.1 Создание файла топологии
Containerlab определяет топологию в специальном файле, записанном в формате YAML. Чтобы создать файл топологии, откройте любой текстовой редактор (vim, nano и др.) и вставьте следующий текст.
lab1.yml
name: lab1
topology:
nodes:
router1:
kind: linux
image: frrouting/frr:v7.5.1
binds:
- router1/daemons:/etc/frr/daemons
router2:
kind: linux
image: frrouting/frr:v7.5.1
binds:
- router2/daemons:/etc/frr/daemons
router3:
kind: linux
image: frrouting/frr:v7.5.1
binds:
- router3/daemons:/etc/frr/daemons
PC1:
kind: linux
image: praqma/network-multitool:latest
PC2:
kind: linux
image: praqma/network-multitool:latest
PC3:
kind: linux
image: praqma/network-multitool:latest
links:
- endpoints: ["router1:eth1", "router2:eth1"]
- endpoints: ["router1:eth2", "router3:eth1"]
- endpoints: ["router2:eth2", "router3:eth2"]
- endpoints: ["PC1:eth1", "router1:eth3"]
- endpoints: ["PC2:eth1", "router2:eth3"]
- endpoints: ["PC3:eth1", "router3:eth3"]
6.2.2.2 Создание конфигурационных файлов
Согласно нашему файлу топологии, конфигурационные файлы для каждого маршрутизатора лежат в отдельной папке. Создадим соответствующие папки и конфигурационные файлы. Конфигурационные файлы описывают параметры запуска демонов, которые будут осуществялть маршурутизацию. Демон - компьютерная программа в Unix-подобных системах, запускаемая самой системой и работающая в фоновом режиме без прямого взаимодействия с пользователем.
Создание папок
```{bash}
mkdir router1
mkdir router2
mkdir router3
```Конфигурационный файл router1/daemons
zebra=yes
bgpd=no
ospfd=yes
ospf6d=no
ripd=no
ripngd=no
isisd=no
pimd=no
ldpd=yes
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
staticd=no
pbrd=no
bfdd=no
fabricd=no
vtysh_enable=yes
zebra_options=" -s 90000000 --daemon -A 127.0.0.1"
bgpd_options=" --daemon -A 127.0.0.1"
ospfd_options=" --daemon -A 127.0.0.1"
ospf6d_options=" --daemon -A ::1"
ripd_options=" --daemon -A 127.0.0.1"
ripngd_options=" --daemon -A ::1"
isisd_options=" --daemon -A 127.0.0.1"
pimd_options=" --daemon -A 127.0.0.1"
ldpd_options=" --daemon -A 127.0.0.1"
nhrpd_options=" --daemon -A 127.0.0.1"
eigrpd_options=" --daemon -A 127.0.0.1"
babeld_options=" --daemon -A 127.0.0.1"
sharpd_options=" --daemon -A 127.0.0.1"
staticd_options=" --daemon -A 127.0.0.1"
pbrd_options=" --daemon -A 127.0.0.1"
bfdd_options=" --daemon -A 127.0.0.1"
fabricd_options=" --daemon -A 127.0.0.1"
Копируем конфиги в остальные папки
```{bash}
cp router1/daemons router2/daemons
cp router1/daemons router3/daemons
```6.2.2.3 Разворачивание сети
Теперь мы готовы к разворачиванию сети. Это можно сделать одной командой.
```{bash}
sudo clab deploy --topo lab1.yml
```В случае успеха в терминал в качестве вывода получите таблицу с описание сети. Вы можете получить эту же информацию с помощью команды sudo clab inspect --name lab1
| № | Name | Container ID | Image | Kind | State | IPv4 Address | IPv6 Address |
|---|---|---|---|---|---|---|---|
| 1 | clab-lab1-PC1 | a5c797da41f7 | praqma/network-multitool:latest | linux | running | 172.20.20.7/24 | 2001:172:20:20::7/64 |
| 2 | clab-lab1-PC2 | b8434ec89f76 | praqma/network-multitool:latest | linux | running | 172.20.20.3/24 | 2001:172:20:20::3/64 |
| 3 | clab-lab1-PC3 | 2803415a1340 | praqma/network-multitool:latest | linux | running | 172.20.20.5/24 | 2001:172:20:20::5/64 |
| 4 | clab-lab1-router1 | 763b7303c956 | frrouting/frr:v7.5.1 | linux | running | 172.20.20.4/24 | 2001:172:20:20::4/64 |
| 5 | clab-lab1-router2 | 6d8f27bd1ef3 | frrouting/frr:v7.5.1 | linux | running | 172.20.20.6/24 | 2001:172:20:20::6/64 |
| 6 | clab-lab1-router3 | b7442f1b0019 | frrouting/frr:v7.5.1 | linux | running | 172.20.20.2/24 | 2001:172:20:20::2/64 |
Информацию о сети можно получить и в графическом виде.
```{bash}
sudo containerlab graph --topo lab1.yml
```После выполнения команды, откройте веб-браузер на странице http://0.0.0.0:50080/ .
В таблице вы видите, что каждый узел имеет адрес IPv4 в сети управления. Если ваши сетевые узлы используют сервер SSH, вы сможете подключиться к ним через SSH. Однако контейнеры, которые мы используем сейчас, оба основаны на Alpine Linux и не имеют установленного openssh-server, поэтому мы подключимся к каждому узлу с помощью Docker.
6.2.3 Настройка сети
В настоящее время узлы работают, но сеть не настроена. Чтобы настроить сеть, войдите в каждый узел и выполните его собственные команды конфигурации, либо в оболочке (оболочка ash в Alpine Linux), либо в его маршрутизаторе CLI (vtysh в FRR).
6.2.3.1 Настройка сетевых узлов
Чтобы настроить PC1, запустите Docker и новую оболочку в контейнере clab-lab1-PC1.
```{bash}
sudo docker exec -it clab-lab1-PC1 /bin/ash
```На основе сетевого плана, который мы создали при проектировании этой сети, настройте интерфейс eth1 PC1 с IP-адресом и статическими маршрутами к внешним сетям передачи данных.
Конфигурация для PC1
ip addr add 192.168.11.2/24 dev eth1
ip route add 192.168.0.0/16 via 192.168.11.1 dev eth1
ip route add 10.10.10.0/24 via 192.168.11.1 dev eth1
exit
Конфигурация для PC2
ip addr add 192.168.12.2/24 dev eth1
ip route add 192.168.0.0/16 via 192.168.12.1 dev eth1
ip route add 10.10.10.0/24 via 192.168.12.1 dev eth1
exit
Конфигурация для PC3
ip addr add 192.168.13.2/24 dev eth1
ip route add 192.168.0.0/16 via 192.168.13.1 dev eth1
ip route add 10.10.10.0/24 via 192.168.13.1 dev eth1
exit
Для подключения к роутерам, используйте следующую команду
```{bash}
sudo docker exec -it clab-lab1-router1 vtysh
```Конфигурация для router1
configure terminal
service integrated-vtysh-config
interface eth1
ip address 192.168.1.1/24
exit
interface eth2
ip address 192.168.2.1/24
exit
interface eth3
ip address 192.168.11.1/24
exit
interface lo
ip address 10.10.10.1/32
exit
exit
write
exit
Конфигурация для router2
configure terminal
service integrated-vtysh-config
interface eth1
ip address 192.168.1.2/24
exit
interface eth2
ip address 192.168.3.1/24
exit
interface eth3
ip address 192.168.12.1/24
exit
interface lo
ip address 10.10.10.2/32
exit
exit
write
exit
Конфигурация для router3
configure terminal
service integrated-vtysh-config
interface eth1
ip address 192.168.2.2/24
exit
interface eth2
ip address 192.168.3.2/24
exit
interface eth3
ip address 192.168.13.1/24
exit
interface lo
ip address 10.10.10.3/32
exit
exit
write
exit
6.2.3.2 Тестирование
После настройки интерфейсов на каждом узле вы сможете отправлять ping-запросы с PC1 на любой IP-адрес, настроенный на маршрутизаторе router1, но не на интерфейсы на других узлах. Проверьте это на каждом узле.
```{bash}
sudo docker exec -it clab-lab1-PC1 /bin/ash
ping -c1 192.168.11.1
ping -c1 192.168.13.2
```6.2.3.3 Добавление динамической маршрутизации
Чтобы сделать каждую сеть доступной, настройте динамическую маршрутизацию на роутерах. Для этого определите простую OSPF (Open Shortest Path First) область на каждом роутере для всех сетей подключенных к ним.
```{bash}
sudo docker exec -it clab-lab1-router1 vtysh
```Конфигурация для router1
configure terminal
router ospf
passive-interface eth3
passive-interface lo
network 192.168.1.0/24 area 0.0.0.0
network 192.168.2.0/24 area 0.0.0.0
network 192.168.11.0/24 area 0.0.0.0
exit
exit
write
exit
Конфигурация для router2
configure terminal
router ospf
passive-interface eth3
network 192.168.1.0/24 area 0.0.0.0
network 192.168.3.0/24 area 0.0.0.0
network 192.168.12.0/24 area 0.0.0.0
exit
exit
write
exit
Конфигурация для router3
configure terminal
router ospf
passive-interface eth3
network 192.168.2.0/24 area 0.0.0.0
network 192.168.3.0/24 area 0.0.0.0
network 192.168.13.0/24 area 0.0.0.0
exit
exit
write
exit
6.2.3.4 Тестирование динамической маршрутизации
Проверим работу аналогичным ping-запросом
```{bash}
sudo docker exec clab-lab1-PC1 ping -c1 192.168.13.2
```Отследим маршрут пакетов
```{bash}
sudo docker exec clab-lab1-PC1 traceroute 192.168.13.2
```Маршрут получается следующим
6.2.4 Имитация неисправности
Чтобы еще раз продемонстрировать правильность конфигурации сети, посмотрим, что произойдет, если связь между Router1 и Router3 выйдет из строя. Если все работает правильно, протокол OSPF обнаружит, что связь вышла из строя, и перенаправит весь трафик, идущий от PC1 к PC3 через Router1 и Router3 через Router2. Но в Containerlab нет функции, которая позволяет пользователю управлять сетевыми соединениями между узлами. Поэтому вы не можете отключить связь или внести ошибки в связь с помощью команд Containerlab. Кроме того, Docker не управляет ссылками Containerlab между узлами, поэтому мы не можем использовать сетевые команды Docker для отключения связи Связи Containerlab состоят из пар интерфейсов veth, которые управляются в сетевых пространствах имен каждого узла. Нам нужно использовать Docker для запуска сетевых команд на каждом контейнере или использовать собственные сетевые команды Linux для управления ссылками в сетевом пространстве имен каждого узла. Один из простых способов прервать сетевое соединение — запустить команду ip на узле, чтобы отключить соединение на узле. Например, чтобы отключить eth2 на Router1:
```{bash}
sudo docker exec -d clab-lab1-router1 ip link set dev eth2 down
```Нарисуйте схему маршрута пакета от PC1 к PC3, проверьте себя с помощью команды traceroute.
6.2.5 Завершение работы
Для завершения работы и освобождения работы выполните следующую команду
```{bash}
sudo clab destroy --topo lab1.yml
```6.3 Заключение
Containerlab — это новый инструмент эмуляции сети, который может создавать большие, сложные сценарии эмуляции сети с использованием простого файла топологии. Он использует сильные стороны сетей Docker и Linux для создания легкой инфраструктуры, в которой работают эмулируемые узлы. Разработчики Containerlab включают сильные интеграции для сетевой операционной системы SR Linux, а также встроенную базовую поддержку для других коммерческих сетевых операционных систем.
6.4 Вопросы
- Что такое компьютерная сеть?
- Чем такое виртуальная машина? Что такое контейнер? В чем их отличие друг от друга?
- Какую топологию имеет построенная в этой работе сеть?
- Что такое YAML? Какой имеет синтаксис?
- Какое строение имеет файл топологии?
- Объясните содержимое конфигурационных команд
- Что такое OSPF?