Вопрос или проблема
Я пробую LXC впервые. Мне нужна виртуальная машина 22.04, которая могла бы получить доступ к интернету. Мой хост – новая установка Ubuntu Server 24.04. Моя локальная физическая сеть – eno33.
Сначала я использовал neplan для настройки моста:
network:
version: 2
renderer: networkd
ethernets:
eno33:
dhcp4: false
dhcp6: false
# addresses:
# - 172.16.56.26/23
# routes:
# - to: default
# via: 172.16.57.253
# nameservers:
# addresses: [172.16.99.7,172.16.99.8]
bridges:
br0:
interfaces: [eno33]
addresses: [172.16.56.26/23]
routes:
- to: default
via: 172.16.57.253
nameservers:
addresses: [172.16.99.7,172.16.99.8]
parameters:
stp: true
forward-delay: 4
apetros@host:~$ ip r
default via 172.16.57.253 dev br0 proto static
172.16.56.0/23 dev br0 proto kernel scope link src 172.16.56.26
apetros@host:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eno33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
link/ether e4:3d:1a:62:13:16 brd ff:ff:ff:ff:ff:ff
altname enp99s0f0
8: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ae:f4:ec:9a:d1:c1 brd ff:ff:ff:ff:ff:ff
inet 172.16.56.26/23 brd 172.16.57.255 scope global br0
valid_lft forever preferred_lft forever
inet6 fe80::acf4:ecff:fe9a:d1c1/64 scope link
valid_lft forever preferred_lft forever
Затем я создаю виртуальную машину:
apetros@host:~$ lxc init ubuntu:22.04 u1 --vm
apetros@host:~$ lxc config device add u1 eth0 nic nictype=bridged parent=br0 name=eth0
apetros@host:~$ lxc restart u1
apetros@host:~$ lxc list
+----------+---------+------+------+-----------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+----------+---------+------+------+-----------------+-----------+
| u1 | RUNNING | | | VIRTUAL-MACHINE | 0 |
+----------+---------+------+------+-----------------+-----------+
Как видите, u1 не получил IP. Показав больше деталей:
apetros@spslab:~$ lxc config show --expanded u1
architecture: x86_64
config:
image.architecture: amd64
image.description: ubuntu 22.04 LTS amd64 (release) (20241004)
image.label: release
image.os: ubuntu
image.release: jammy
image.serial: "20241004"
image.type: disk-kvm.img
image.version: "22.04"
volatile.base_image: ab8380e088c0e3e2d88b7a32224de91723c2fe455f151db61c36eb23900f69cd
volatile.cloud-init.instance-id: 758bffe1-74e5-4ab9-a74c-e7da29a93696
volatile.eth0.host_name: tap3add331f
volatile.eth0.hwaddr: 00:16:3e:17:fb:e6
volatile.last_state.power: RUNNING
volatile.uuid: 9c04c042-b026-44da-a081-06ecbe91f1f5
volatile.uuid.generation: 9c04c042-b026-44da-a081-06ecbe91f1f5
volatile.vsock_id: "1271446946"
devices:
eth0:
name: eth0
nictype: bridged
parent: br0
type: nic
root:
path: /
pool: default
type: disk
ephemeral: false
profiles:
- default
stateful: false
description: ""
Простая команда:
lxc exec u1 -- apt update
Показывает, что у виртуальной машины нет доступа к интернету. Выполнив:
apetros@host:~$ lxc exec u1 -- bash
root@u1:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:17:fb:e6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::216:3eff:fe17:fbe6/64 scope link
valid_lft forever preferred_lft forever
Таким образом, eth0 недоступен внутри u1, и только enp5s0 доступен.
Есть идеи, что делать?
Ответ или решение
Для настройки виртуальной машины (VM) с использованием LXC без доступа к интернету необходимо выполнить ряд шагов, чтобы убедиться, что сеть настроена корректно и ваша виртуальная машина может получить IP-адрес из вашего локального окружения. Рассмотрим ваши настройки и выявим, как можно устранить проблему.
1. Проверка настроек моста
Ваши настройки для br0
выглядят в целом правильно. Вы создали мост, который объединяет сетевой интерфейс eno33
и присвоили ему статический IP-адрес. Это позволяет вашему хосту взаимодействовать с локальной сетью. Однако, важно убедиться, что DHCP-сервер в вашей сети может присваивать IP-адреса, чтобы ваша виртуальная машина могла получить один из них.
2. Настройка LXC для использования NAT
Если вы хотите, чтобы ваша виртуальная машина имела доступ к Интернету, необходимо правильно настроить NAT (Network Address Translation). Вместо того чтобы полагаться на вам установленный статический IP-адрес, вы можете настроить IP-адресацию и маршрутизацию. Вам нужно выполнить следующие шаги:
-
Настройка DHCP в LXC: Измените настройки вашего интерфейса в конфигурации LXC, чтобы он получал IP из DHCP. Для этого выполните команду:
lxc config device set u1 eth0 ipv4.address auto
-
Настройка iptables для NAT: Убедитесь, что ваш хост настроен для маршрутизации трафика от вашей виртуальной машины к Интернету. Используйте следующие команды, чтобы настроить NAT:
sudo iptables -t nat -A POSTROUTING -o eno33 -j MASQUERADE sudo iptables -A FORWARD -i br0 -o eno33 -j ACCEPT sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-
Сохранение правил iptables: Чтобы сохранить настройки iptables при перезагрузке сервера, вы можете использовать
iptables-save
или установить специальный пакет, такой какiptables-persistent
.
3. Проверка сетевой конфигурации виртуальной машины
После того как вы настроили NAT и DHCP, перезапустите виртуальную машину:
lxc restart u1
Проверьте, получил ли интерфейс eth0 IP-адрес, выполнив команду:
lxc exec u1 -- ip a
Если eth0 все еще отсутствует или не имеет IP-адреса, проверьте, работает ли ваш DHCP-сервер и настроен ли он на выдачу IP-адресов диапазона, который может включать вашу виртуальную машину.
4. Проверка доступа к Интернету
Теперь выполните команду внутри виртуальной машины:
lxc exec u1 -- apt update
Если проблема сохраняется, проверьте, существуют ли DNS-настройки. Если ваша виртуальная машина не может разрешать DNS-запросы, вам нужно будет вручную настроить /etc/resolv.conf на виртуальной машине, добавив серверы DNS, такие как:
nameserver 8.8.8.8
nameserver 8.8.4.4
Заключение
Настройка LXC с доступом к Интернету может потребовать внимания к деталям конфигурации сети и обеспечения ее корректности. Обязательно проверяйте результат на каждом этапе и не забудьте о необходимости взаимодействия с вашими локальными сетевыми настройками. Воспользуйтесь шагами, описанными выше, и ваша виртуальная машина на базе Ubuntu 22.04 должна получить доступ к Интернету без проблем.