6  Лабораторная работа №1 по информатике ‘Построение и настройка простой сети’

6.1 Введение

Подготовлено на основе материала Брайана Линка (https://brianlinkletter.com/2021/05/use-containerlab-to-emulate-open-source-routers/) и является его переводом.

Цель работы: подготовить виртуальную сеть из контейнеров и сымитировать возможные неполадки в ней.

Important

Документируйте свои действия и их результатыв простом вордовском файле. Это будет ваш отчет! Можно в простом формате файл-скриншот с результатами.

6.2 Практическая часть

6.2.1 Подготовка

Минимальные требования для выполнения: 2 ядра ЦПУ и 2 Гб ОЗУ.

Для выполнениим данной лабораторной работы вам потребуется:

  1. Компьютер с операционной системой Linux (сборки Debian или Ubuntu)
  2. Docker - контейнеризатор приложений
  3. 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 и др.) и вставьте следующий текст.

Tip

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
```
Tip

Конфигурационный файл 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
```

Маршрут получается следующим

flowchart LR
    A["PC1"] --> B["Router1"]
    B --> C["Router3"]
    C --> D["PC3"]

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 Вопросы

  1. Что такое компьютерная сеть?
  2. Чем такое виртуальная машина? Что такое контейнер? В чем их отличие друг от друга?
  3. Какую топологию имеет построенная в этой работе сеть?
  4. Что такое YAML? Какой имеет синтаксис?
  5. Какое строение имеет файл топологии?
  6. Объясните содержимое конфигурационных команд
  7. Что такое OSPF?