LXC Linux Containers часть №6. Сетевое взаимодействие

Оглавление

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

empty — без сети. В контейнере будет создан только интерфейс обратной связи (lo, 127.0.0.1).
veth — использование сетевого стека хост системы. Эта схема используется по умолчанию. На хосте создается мост который подключается к одному из физических интерфейсов. При запуске контейнера с таким типом сети, на хосте создается специальный виртуальный интерфейс коммутируемый к мосту. Этот виртуальный интерфейс (хост системы) фактически и использует контейнер для взаимодействия с внешней средой.
macvlan — этот тип виртуализации сети предоставляет более сложные механизмы, позволяя изолировать контейнеры друг от друга или от хост-системы.
phys
— в этом режиме, физический сетевой интерфейс хоста может быть отдан одному из контейнеров. При этом, для самого хоста или других контейнеров, этот интерфейс станет не доступным.

По умолчанию, доступ контейнеров во внешний мир осуществляется по механизму veth, через NAT. Для производственной среды, а так же для нужд хостинга, это не очень хорошо. Правильнее, что бы у каждого экземпляра ОС был свой собственный IP и прямой доступ во внешний мир и из него. Для этого необходимо установить в базовую систему пакет bridge-utils, если он еще не установлен.

Далее нужно настроить сетевой мост, через который контейнеры будут выходить во внешний мир. В идеале, для этих целей нужно завести отдельный физический интерфейс для сетевого трафика контейнеров. Ему не надо присваивать какие-либо адреса. Он будет исполнять роль сквозной трубы.

Вот примерные параметры моста:

# vi /etc/network/interfaces

# bridge для lxc
auto br0 #имя моста и режим запуска
iface br0 inet static
bridge_ports eth0 # имя физического интерфейса «трубы»
bridge_fd 0
address 192.168.5.10
netmask 255.255.255.0
gateway 192.168.5.1
dns-nameservers 192.168.5.11

Теперь когда мост создан, можем к нему подключать контейнеры. Делается это в конфигурационном файле каждого экземпляра.

# sudo vi /var/lib/lxc/<имяКонтейнера>/config

Ниже приведены основные параметры отвечающие за сетевую подсистему.

# Тип сети
lxc.network.type = veth
# Сеть активна (up) или нет (down)
lxc.network.link = br0
# Имя сетевого адаптера внутри контейнера
lxc.network.name = eth0
# Имя сетевого адаптера для этого контейнера на хостовой машине
lxc.network.veth.pair = veth-u001
# IP-адрес контейнера
lxc.network.ipv4 = 192.168.5.15/24
# Шлюз контейнера
lxc.network.ipv4.gateway = 192.168.5.1
# mac-адрес адаптера
lxc.network.hwaddr = 00:16:3e:81:27:8e

Теперь, контейнер с такими параметрами сможет взаимодействовать с внешним миром напрямую, как отдельно стоящая машина.

Конечно, по хорошему, мост нужно настроить еще до создания контейнеров, а параметр lxc.network.link = br0 прописать в конфигурационном файле по умолчанию. А для того, чтобы не настраивать IP-для каждого контейнера в ручную, можно настроить DHCP-сервер в хост системе, на интерфейсе br0.