Вопрос или проблема
Я пытаюсь настроить контейнер, который имеет доступ к интернету, но пока не преуспел.
# 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, обеспечив доступ к интернету. Убедитесь, что дорожки конфигурации являются корректными, и соблюдайте рекомендации по активации интерфейсов и служб. Таким образом, вы сможете избежать распространенных ошибок и обеспечить надежное сетевое подключение для вашего контейнера.