# Лабораторная работа 3. Работа с сетью в Linux. Виртуальный коммутатор Linux Bridge.

Цель<br>
Получить представления о работе сетевой подсистемы в операционной системе Linux (CentOS
7), и научиться выполнять базовые действия с ней. Научиться работать с виртуальным
коммутатором Linux Bridge.<br><br>
Задачи<br>

  1) Задать статический IP адрес на интерфейс.
  0) Настроить объединение интерфейсов.
  0) Настроить сетевой мост.
  0) Настроить VxLAN(виртуальные сети).
  0) Ознакомиться с возможностями сетевых утилит.
 
Схема виртуального лабораторного стенда

<div drawio-diagram="125"><img src="https://docs.resds.ru/uploads/images/drawio/2022-02/gkfz34KViD1Ik9Pc-drawing-3-1645724535.png"></div>

#### Задание 1. Установка статического IP адреса физическому интерфейсу
Переключиться на проект [GROUP]:[team]-lab:3.
Подключиться к `labnode-1`. логин - `labuser`, пароль - `labpass1!`
Подключение должно быть выполнено по следующей схеме (рис. 1).

<div drawio-diagram="126"><img src="https://docs.resds.ru/uploads/images/drawio/2022-02/xEETbFvowiqiYe9P-drawing-3-1645724604.png"></div>

Воспользоваться утилитой ip. Для того, чтобы увидеть существующие в системе интерфейсы,
набрать команду:
```sh
ip address
```
Там же будут отображены основные параметры этих сетевых интерфейсов.<br>
Команда ip позволяет использовать короткие имена команд. в данном случае, вместо `ip
address` можно использовать команду 
```sh
ip a
```
<i>В случае правильного выполнения команд (для всех команд кроме ip address) утилита `ip` не будет
возвращать никакого значения. В случае, если команда выполнена неправильно, будет
возвращена соответствующая ошибка.</i>

Задать интерфейсу `eth1` IP адрес:
```sh
sudo ip address add 10.0.12.20/24 dev eth1
```
Изменить состояние на `up`.
```bash
sudo ip link set up dev eth1
```
Посмотреть изменения (состояние устройства eth1 должно измениться на UP):
```sh
ip address
```
Подключиться к <b>labnode-2</b>. Установить интерфейсу <b>eth1</b> IP адрес:
```sh
sudo ip address add 10.0.12.30/24 dev eth1
```
Изменить состояние на `up`:
```sh
sudo ip link set up dev eth1
```
С <b>labnode-1</b> проверить доступность <b>labnode-2</b>:
```sh
ping -c 4 10.0.12.30
```

После перезагрузки сервера, или сервиса сети все изменения отменяются. Перезагрузить <b>оба</b>
сервера, и посмотреть на состояние интерфейсов (необходимо проверить, сохранились ли на
интерфейсе адреса, заданные предыдущими командами):
```sh
reboot
ip address
```

#### Задание 2. Настройка статического адреса через конфигурационные файлы
Подключение должно быть выполнено по следующей схеме (рис. 1).
Для того, чтобы изменения оставались в силе, нужно настроить интерфейс через
конфигурационный файл. Тогда настройки будут загружаться при старте системы.
Создать конфигурацию интерфейса eth1 на <b>labnode-1</b>:
```sh
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth1
```
И привести его к следующему виду:

```text
TYPE=Ethernet
DEVICE=eth1
BOOTPROTO=static
IPADDR=10.0.12.20
PREFIX=24
ONBOOT=yes
```
Основные параметры:
  1. TYPE - Тип сетевого интерфейса
  2. NAME - Имя интерфейса
  3. DEVICE - Устройство, которое интерфейс использует
  4. BOOTPROTO - если этот параметр static, то интерфейс не будет автоматически получать адрес от сети, маску и другие параметры подключения. В случае необходимости автоматического получения адреса – необходимо указать значение этого параметра -dhcp.
  5. ONBOOT - включать ли интерфейс при загрузке.
  6. IPADDR - IP-адрес
  7. DNS1 - DNS, через который обращаться к доменам. Можно указать несколько параметров: DNS1, DNS2...
  8. PREFIX - префикс, другой способ задания маски сети. Для префикса 24 маска будет 255.255.255.0
  9. GATEWAY - шлюз
  
<i>Все остальные параметры являются необязательными в данной лабораторной работе, и могут быть удалены.</i>

Скопировать файл <b>ifcfg-eth1</b> с именем <b>ifcfg-eth2</b>:
```sh
sudo cp /etc/sysconfig/network-scripts/ifcfg-eth1 /etc/sysconfig/network-scripts/ifcfg-eth2
```
Отредактировать его с помощью редактора <b>vi</b>:
```sh
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth2
```
И привести его содержимое к следующему виду:
```text
TYPE=Ethernet
DEVICE=eth2
BOOTPROTO=static
IPADDR=10.0.12.21
PREFIX=24
ONBOOT=yes
```
Перезагрузить сеть и посмотреть интерфейсы:
```sh
sudo systemctl restart network
ip address
```
Далее необходимо настроить интерфейсы на узле <b>labnode-2</b>, по такому же принципу, как и <b>labnode-1</b>. Создать конфигурацию интерфейса <b>eth1</b>:
```sh
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth1
```
И привести его к следующему виду:
```
TYPE=Ethernet
DEVICE=eth1
BOOTPROTO=static
IPADDR=10.0.12.30
PREFIX=24
ONBOOT=yes
```
Скопировать файл <b>ifcfg-eth1</b> с именем <b>ifcfg-eth2</b>:
```sh
sudo cp /etc/sysconfig/network-scripts/ifcfg-eth1 /etc/sysconfig/network-scripts/ifcfg-eth2
```
В оболочке <b>bash</b> (и во многих других оболочках) для упрощения ввода текста выше можно использовать упрощенную форму ввода текста выше:
```sh
sudo cp /etc/sysconfig/network-scripts/ifcfg-eth{1,2}
```
Отредактировать его через vi:
```sh
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth2
```
И привести к следующему виду:
```text
TYPE=Ethernet
DEVICE=eth2
BOOTPROTO=static
IPADDR=10.0.12.31
PREFIX=24
ONBOOT=yes
```
Перезагрузить сеть и посмотреть интерфейсы:
```sh
sudo systemctl restart network
ip address
```
Проверить доступность интерфейсов:
```
(labnode-1) ping -c 4 10.0.12.30
(labnode-1) ping -c 4 10.0.12.31
(labnode-2) ping -c 4 10.0.12.20
(labnode-2) ping -c 4 10.0.12.21
```

#### Задание 3. Настройка объединения интерфейсов.
"Объединение" (bonding) сетевых интерфейсов - позволяет совокупно собрать несколько портов
в одну группу, эффективно объединяя пропускную способность в одном направлении.
Например, вы можете объединить два порта по 100 мегабит в 200 мегабитный магистральный
порт.

<I>В некоторых случаях интерфейсы после перезапуска сетевой службы не удаляют ip адреса,
что связано с особенностью работы up/down скриптов. В таком случае в системе на разных
интерфейсах может присутствовать одинаковый ip адрес (проверить можно командой `ip
address`). Для решения этой проблемы необходимо отчистить все адреса на интерфейсе.
Сделать это можно как просто удалив конкретный адрес с интерфейса, так и
воспользоваться специальной командой, которая очистит все имеющиеся на нём адреса:</i>
```sh
sudo ip address flush dev eth1
sudo ip address flush dev eth2
```
Подключение должно быть выполнено по следующей схеме (рис. 2).
<div drawio-diagram="441"><img src="https://docs.resds.ru/uploads/images/drawio/2023-11/psPv79C2cMCGPzrf-drawing-3-1700487082.png"></div>

Для того, чтобы создать интерфейс <b>bond0</b>, нужно создать файл конфигурации:
```sh
sudo vi /etc/sysconfig/network-scripts/ifcfg-bond0
```
Конфигурация <b>bond0</b> интерфейса на <b>labnode-1</b> будет следующей:
```
TYPE=Bond
DEVICE=bond0
BOOTPROTO=static
IPADDR=10.0.12.20
PREFIX=24
BONDING_MASTER=yes
BONDING_OPTS="mode=0 miimon=100"
ONBOOT=yes
```
Это создаст сам <b>bond0</b> интерфейс. Но нужно также назначить физические интерфейсы <b>eth1</b> и
<b>eth2</b>, как подчиненные ему. Необходимо изменить конфигурационный файл <b>eth1</b>:
```sh
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth1
```
И привести его к следующему виду:
```
TYPE=Ethernet
DEVICE=eth1
MASTER=bond0
SLAVE=yes
```
То же самое сделать и с <b>eth2</b>:
```sh
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth2
```
```text
TYPE=Ethernet
DEVICE=eth2
MASTER=bond0
SLAVE=yes
```
Перезагрузить сеть.
```sh
sudo systemctl restart network
```
Посмотреть, что получилось:
```sh
ip address
```
В полученном выводе интерфейсы <b>eth1</b> и <b>eth2</b> должны быть в подчиненном режиме (SLAVE), а
интерфейс <b>bond0</b> должен иметь ip адрес и находиться в состоянии <b>UP</b>. Также необходимо
проверить, что на интерфейсах <b>eth1</b> и <b>eth2</b> нет никаких ip адресов.
Теперь необходимо проделать тоже самое на labnode-2.
```sh
sudo vi /etc/sysconfig/network-scripts/ifcfg-bond0
```
Конфигурация <b>bond0</b> интерфейса будет следующей:
```text
TYPE=Bond
DEVICE=bond0
BOOTPROTO=static
IPADDR=10.0.12.30
PREFIX=24
BONDING_MASTER=yes
BONDING_OPTS="mode=0 miimon=100"
ONBOOT=yes
```
Конфиг <b>eth1</b>:
```
TYPE=Ethernet
DEVICE=eth1
MASTER=bond0
SLAVE=yes
```
Конфиг <b>eth2</b>:
```
TYPE=Ethernet
DEVICE=eth2
MASTER=bond0
SLAVE=yes
```
Перечитать конфигурационные файлы сетевых устройств и проверить после этого настройки сетевых интерфейсов:
```sh
sudo systemctl restart network
```
С <b>labnode-1</b> необходимо проверить доступность <b>labnode-2</b>:
```sh
ping -c 4 10.0.12.30
```
Теперь на <b>labnode-1</b> необходимо отключить <b>eth1</b> и посмотреть его состояние:
```sh
sudo ip link set down eth1
ip address
```
И с <b>labnode-2</b> проверить его доступность:
```sh
ping 10.0.12.20 -c 4
```
Если объединение интерфейсов настроено правильно, то узел будет доступен, даже после
выключения одного из интерфейсов.
#### Задание 4. Настройка bridge интерфейса.
Ядро Linux имеет встроенный механизм коммутации пакетов между интерфейсами, и может
функционировать как обычный сетевой коммутатор. Интерфейс Bridge представляет собой как
сам виртуальный сетевой коммутатор, так и сетевой интерфейс с ip адресом, назначенным на
порт этого коммутатора.
Подключение должно быть выполнено по следующей схеме (рис. 3).

<div drawio-diagram="442"><img src="https://docs.resds.ru/uploads/images/drawio/2023-11/5TDRYFyFR2nN1pNy-drawing-3-1700487097.png"></div>

На <b>labnode-1</b> требуется создать конфиг <b>ifcfg-br0</b>:

```sh
sudo vi /etc/sysconfig/network-scripts/ifcfg-br0
```
Мост будет иметь следующую конфигурацию:
```
TYPE=Bridge
DEVICE=br0
BOOTPROTO=static
IPADDR=10.0.12.20
PREFIX=24
STP=on
ONBOOT=yes
```

Spanning Tree Protocol (STP) нужен, чтобы избежать петель коммутации.

Интерфейс <b>bond0</b>, настроенный до этого, может быть интерфейсом этого сетевого коммутатора,
но в таком случае ip адрес уже будет назначен на интерфейс виртуального сетевого коммутатора,
и все настройки ip с интерфейса <b>bond0</b> можно будет убрать.
Для этого в конфигурационный файл интерфейса bond0 также нужно добавить параметр
BRIDGE=br0. Также удалить из него параметры `BOOTPROTO, IPADDR, PREFIX, ONBOOT`
(можно просто закомментировать с помощью символа #, когда пригодятся, раскомментировать
их, убрав символ #):
```sh
sudo vi /etc/sysconfig/network-scripts/ifcfg-bond0
```
Перезагрузить сеть:
```sh
sudo systemctl restart network
```
Можно проверить результат. Для этого на <b>labnode-2</b> выполнить следующую команду:
```sh
ip address
```
Проверить, что в результате вывода этой команды ip адрес будет назначен только на интерфейс
br0, и он будет в состоянии UP. Если все правильно, то проверить доступность соседнего узла
командой:
```sh
ping -c 4 10.0.12.20
```
<i>Мост может подняться не сразу. Если что, необходимо подождать.</i>

#### Задание 5. Создание VxLAN интерфейсов.
VxLAN является механизмом построения виртуальных сетей на основаниях тоннелей, поверх
реальных сетей, но при этом позволяющим их разграничивать.

Подключение должно быть выполнено по следующей схеме (рис. 4).

<div drawio-diagram="443"><img src="https://docs.resds.ru/uploads/images/drawio/2023-11/vAgGyMrJSUcHhzbP-drawing-3-1700487109.png"></div>

На <b>labnode-1</b> удалить конфигурацию моста <b>br0</b>:
```sh
sudo rm /etc/sysconfig/network-scripts/ifcfg-br0
```
И привести <b>bond0</b> к прежнему виду:
```
TYPE=Bond
DEVICE=bond0
BOOTPROTO=static
IPADDR=10.0.12.20
PREFIX=24
BRIDGE=br0
BONDING_MASTER=yes
BONDING_OPTS="mode=0 miimon=100"
ONBOOT=yes
```
И перезагрузить сервер:
```sh
sudo reboot
```
После загрузки сервера проверить работу сети с узла labnode-2:
```sh
ping -c 4 10.0.12.20
```
На <b>labnode-1</b> добавить интерфейс <b>vxlan10</b>:
```sh
sudo ip link add vxlan10 type vxlan id 10 dstport 0 dev bond0
```
Настроить коммутацию Linux Bridge:
```sh
  sudo bridge fdb append to 00:00:00:00:00:00 dst 10.0.12.30 dev vxlan10
```
Назначить vxlan10 IP адрес и перевести его в состояние up:
```
sudo ip addr add 192.168.1.20/24 dev vxlan10
sudo ip link set up dev vxlan10
```
VxLAN работает как приложение. Пакеты инкапсулируются в udp, и для работы VxLAN
требуется udp порт 8472. Открыть его в фаерволе:
```sh
sudo firewall-cmd --permanent --add-port=8472/udp
sudo firewall-cmd --reload
```
После нужно сделать все то-же самое на <i>labnode-2</i>. Добавить интерфейс vxlan10:
```sh
sudo ip link add vxlan10 type vxlan id 10 dstport 0 dev bond0
```
Настроить коммутацию Linux Bridge:
```sh
sudo bridge fdb append to 00:00:00:00:00:00 dst 10.0.12.20 dev vxlan10
```
Назначить vxlan10 IP адрес и перевести его в состояние up:
```sh
sudo ip addr add 192.168.1.30/24 dev vxlan10
sudo ip link set up dev vxlan10
```
Открыть порт 8472/udp в фаерволе:
```sh
sudo firewall-cmd --permanent --add-port=8472/udp
sudo firewall-cmd --reload
```
Протестировать соединение через vxlan. Для этого на <b>labnode-1</b>:
```sh
ping -c 4 192.168.1.30
```
Посмотреть на arp таблицу. Там можно увидеть соответствие mac адресов с ip адресами.
```sh
sudo arp
```
Нужно убедиться, что появилось приложение, которое слушает порт 8472.
```sh
ss -tulpn | grep 8472
```
Теперь необходимо добавить vxlan с другим тегом (20), и убедиться в том, что из него не будет
доступа к vxlan с тегом 10 (пакеты будут отбрасываться из-за разных тегов).
Перезагрузить <b>labnode-2</b>. Текущая настройка vxlan сбросится.
```sh
sudo reboot
```
На <b>labnode-2</b> добавить интерфейс vxlan20 и настроить его:
```sh
sudo ip link add vxlan20 type vxlan id 20 dstport 0 dev bond0
sudo bridge fdb append to 00:00:00:00:00:00 dst 10.0.12.20 dev vxlan20
sudo ip addr add 192.168.1.30/24 dev vxlan20
sudo ip link set up dev vxlan20
ss -tulpn | grep 8472
```
Протестировать соединение через vxlan. Для этого на <b>labnode-1</b>:
```sh
ping 192.168.1.30 -c 4
```