LXD сеть. Тип подключения routed

Тип подключения routed один из самых простых в настройке. Позволяет выделять статические IP адреса с защитой от подмены. Полезно, если вы отдаёте контейнер третьим лицам.

При первоначальной настройке (lxd init) я пропустил настройку сети и добавил только хранилище. Профиль default выглядит следующим образом

lxc profile show default
config: {}
description: Default LXD profile
devices:
  root:
    path: /
    pool: default
    type: disk
name: default

Добавлю в профиль сетевое устройство. При условии, что имя интерфейса на хост-машине enp0s3

lxc profile device add default eth0 nic name=eth0 nictype=routed parent=enp0s3

Проверяю профиль

lxc profile show default
config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    nictype: routed
    parent: enp0s3
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: default

Вносим изменения в параметры ядра Linux на хост-машине

echo "net.ipv4.conf.enp0s3.forwarding = 1" >> /etc/sysctl.conf
sysctl -p

Для удобства я сделаю новый профиль на базе default и добавлю IP адрес. Этого адреса не должно быть на интерфейсе хоста

lxc profile cp default demo-103
lxc profile device set demo-103 eth0 ipv4.address=192.168.1.103

Создаём новый контейнер

lxc launch images:ubuntu/22.04/cloud demo-103 -p demo-103

Сейчас в сетевых настройках контейнера тип подключения DHCP. Как правило этого достаточно. Осталось поправить настройки DNS

lxc exec demo-103 bash
echo "nameserver 192.168.1.1" > /etc/resolv.conf

Если сеть не поднялась, попробуйте настроить вручную. Конфигурация Netplan должна выглядеть примерно так

network:
  version: 2
  ethernets:
    eth0:
      dhcp4: false
      addresses:
        - 192.168.1.103/32
      routes:
        - to: 0.0.0.0/0
          via: 169.254.0.1
          on-link: true
      nameservers:
        addresses:
          - 192.168.1.1

Для конфигурации контейнера можно использовать Cloud-init.