Появилась цель предоставить пользователям изолированную среду для выполнения задач в сегменте локальной сети. Поднимать гипервизор для виртуализации машин и выделять каждому пользователю ВМ — это слишком расточительный подход, требующий определенных ресурсов. С увеличением числа виртуальных машин, разница в расходах ресурсов становится очевидной.

Контейнеризация — эффективный способ виртуализации на уровне ядра ОС. В системах контейнеризации гипервизора нет, но есть Container Engine, который создаё�� контейнеры и управляет ими. В качестве движка контейнеризации мы будем использовать Podman.

Почему не Docker?

Основная причина — это запуск системы инициализации systemd в контейнерах, чтобы пользователи могли подключаться по SSH и устанавливать необходимые службы обычным способом, как в случае с виртуальными машинами. Podman знает, что надо делать, чтобы systemd нормально работал в контейнере. Также поговорим о том, как пробросить контейнер в локальную сеть.

Большинство традиционных сетей контейнеров обрабатываются мостами bridge, преобразованием сетевых адресов (NAT) или путем привязки к сети хоста. Если вы хотите, чтобы ваши контейнеры выглядели как физические хосты в вашей сети и каждый с уникальным MAC-адресом, то самый простой способ — это использовать плагины macvlan и dhcp, которые поставляются с пакетом containernetworking-plugins.

Macvlan похож на коммутатор, который подключен к сетевому интерфейсу хоста. Используя виртуальные интерфейсы в сочетании с интерфейсом хоста, каждое устройство может иметь отдельный MAC-адрес. Этот факт позволяет существующим DHCP-серверам в существующей сети взаимодействовать с устройствами и назначать адреса.

Итак, приступим

Для начала установим движок контейнеризации Podman:

dnf install podman -y

Создание файла конфигурации CNI

Теперь необходимо создать новый файл конфигурации сетевого интерфейса контейнера (CNI). Перед созданием файла вы должны знать, какой интерфейс хоста будет использоваться для привязки. Эту информацию можно н��йти с помощью инструментов ip или ifconfig.

vi /etc/cni/net.d/90-infranet.conflist
{
    "cniVersion": "0.4.0",
    "name": "infranet",
    "plugins": [
        {
            "type": "macvlan",
            "master": "ens33",
            "ipam": {
                "type": "dhcp"
            }
        }
    ]
}

Запуск DHCP плагина

Плагин dhcp является прокси-клиентом DHCP для контейнера, поскольку в большинстве образов контейнеров отсутствует DHCP-клиент для взаимодействия с DHCP-сервером.

Чтобы запустить плагин dhcp, введите:

/usr/libexec/cni/dhcp daemon &

Собираем образ

Наш кастомный образ для пользователей будет на основе AlmaLinux версии 8.4, также назначим пароль суперпользователю “toor”, установим необходимые пакеты для работы с сетью и службу SSH для подключения пользователей:

cat Dockerfile
FROM almalinux:8.4
 
RUN echo 'root:toor' | chpasswd; dnf -y install bind-utils iproute net-tools nmap-ncat openssh-server; dnf clean all; systemctl enable sshd
 
CMD [ "/sbin/init" ]

Собираем кастомный образ:

podman build -t almalinux:custom .

Запускаем контейнер:

podman run -d --name test --network infranet almalinux:custom

Проверяем получение IP-адреса:

podman exec -it test ifconfig

Источники:

https://developers.redhat.com/blog/2018/10/22/introduction-to-linux-interfaces-for-virtual-networking

https://www.redhat.com/sysadmin/leasing-ips-podman

https://habr.com/ru/company/redhatrussia/blog/468931/

Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud - в нашем Telegram-канале

Жамкнуть