Включение сетевого взаимодействия в контейнере systemd-nspawn

Вопрос или проблема

Я пытаюсь настроить контейнер, который имеет доступ к интернету, но пока не преуспел.

# sudo systemd-nspawn -nb -M debian-tree
# systemctl enable --now systemd-networkd systemd-resolved
# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: host0@if8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
    link/ether 42:ca:d5:8c:af:60 brd ff:ff:ff:ff:ff:ff link-netnsid 0
# ping google.com
ping: google.com: Временная ошибка разрешения имени

На хосте

# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether 7c:7a:91:ae:7d:47 brd ff:ff:ff:ff:ff:ff
8: ve-debian-tree@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 92:f7:e1:4b:c6:6f brd ff:ff:ff:ff:ff:ff link-netnsid 0

Есть идеи, почему это не работает?

На моем опыте, и контейнер, и хост должны использовать systemd-networkd и systemd-resolved. Это работает в Ubuntu Bionic, но не в Xenial, потому что последний использует /etc/network/interfaces (networking.service) вместо systemd-networkd.

Это также не работает на Debian stretch по той же причине.

Ваша проблема, вероятно, связана с тем, что у вас неправильно настроен DNS-резольвер.

Из вашего вывода мы действительно видим, что у контейнера есть собственное сетевое пространство имен (сетевой стек), и этот стек отключен от основной машины, а у вас есть виртуальный сетевой кабель host0@if8, идущий в основную машину link-netnsid 0 (netns 0 = стек сети хоста):

2: host0@if8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
    link/ether 42:ca:d5:8c:af:60 brd ff:ff:ff:ff:ff:ff link-netnsid 0

Мы также видим, что другая часть этого виртуального сетевого кабеля подключена к пространству имен сетевой инфраструктуры хоста (основной сетевой стек):

8: ve-debian-tree@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 92:f7:e1:4b:c6:6f brd ff:ff:ff:ff:ff:ff link-netnsid 0

Я не совсем уверен, но состояние на хосте должно быть state UP, а не state DOWN, как это указано.

Тем не менее, вы должны получить IP-адреса данных ссылок с помощью ip addr, и вы должны иметь возможность пинговать соответствующие интерфейсы (как локальный, так и хостовый) из контейнера.

Как только это будет работать, вы должны иметь возможность пинговать интерфейс, на котором работает ваш DNS-сервер. Если этот DNS-сервер недоступен, вам нужно его исправить.

Как только вы это настроите, вы должны иметь возможность разрешать внешние DNS-имена.

Ответ или решение

Включение сетевого соединения в контейнере systemd-nspawn: пошаговое руководство

При настройке сетевого взаимодействия внутри контейнера systemd-nspawn для обеспечения доступа в интернет важно выполнить несколько ключевых шагов. Данная инструкция поможет вам решить имеющиеся проблемы и успешно настроить сетевую конфигурацию.

1. Проверка конфигурации сетевых служб

Для начала, вам необходимо убедиться, что как контейнер, так и хост-система используют systemd-networkd и systemd-resolved для управления сетевыми соединениями. Это наиболее актуально для дистрибутивов, поддерживающих подобную архитектуру, таких как Ubuntu и современные версии Debian.

Шаги:

  • Убедитесь, что на хосте активированы обе службы:
sudo systemctl enable --now systemd-networkd systemd-resolved
  • Проверьте, что службы работают корректно:
systemctl status systemd-networkd
systemctl status systemd-resolved

2. Настройка файла resolv.conf

Для обеспечения правильного разрешения DNS-запросов, создайте символическую ссылку на файл resolv.conf внутри контейнера. Это позволит контейнеру использовать DNS-серверы, настроенные на уровне хоста:

sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

3. Проверка сетевых интерфейсов

После запуска контейнера и настройки служб, нужно убедиться, что сетевые интерфейсы настроены правильно. Внутри контейнера, выполните команду:

ip link

Вы должны увидеть интерфейс host0@if8, который указывает на виртуальную сеть между контейнером и хостом.

Если статус интерфейса, соединяющего контейнер и хост, отображается как NO-CARRIER, это сигнализирует о том, что соединение не установлено.

Также, проверьте интерфейсы на хосте:

ip link

Убедитесь, что соответствующий интерфейс (например, ve-debian-tree@if2) имеет статус UP. Если статус DOWN, необходимо активировать его:

sudo ip link set ve-debian-tree@if2 up

4. Настройка IP-адресов

Убедитесь, что интерфейсы имеют назначенные IP-адреса. Для этого внутри контейнера выполните команду:

ip addr

Если IP-адрес не назначен, нужно вручную добавить его с помощью следующей команды:

sudo ip addr add <ваш_IP_адрес> dev host0

5. Тестирование соединения

После выполнения всех вышеперечисленных шагов, попробуйте выполнить ping на DNS-сервер или непосредственно на внешний адрес:

ping 8.8.8.8

Если пинг проходит успешно, вероятно, проблема заключается в конфигурации DNS. Попробуйте выполнить ping на доменное имя:

ping google.com

Если возникает ошибка «Temporary failure in name resolution», проверьте настройки DNS, настроенные на хосте, и убедитесь, что они корректно перенаправляются в контейнер.

Заключение

Следуя приведенной инструкции, вы можете успешно настроить сетевое соединение в контейнере systemd-nspawn, обеспечив доступ к интернету. Убедитесь, что дорожки конфигурации являются корректными, и соблюдайте рекомендации по активации интерфейсов и служб. Таким образом, вы сможете избежать распространенных ошибок и обеспечить надежное сетевое подключение для вашего контейнера.

Оцените материал
Добавить комментарий

Капча загружается...