Вопрос или проблема
Я пытаюсь настроить DHCP для моих lxконтейнеров без использования lxc-net. Причина этого решения в том, что я хотел бы разместить мои контейнеры в разных сетях, чтобы они не могли общаться друг с другом по умолчанию. Я успешно создал и запустил контейнеры, используя статические IP-адреса, назначенные в конфигурационном файле контейнеров ранее, но на этот раз я хотел бы использовать DHCP-сервер на хосте.
Я установил dnsmasq на свой хост и настроил его следующим образом:
# /etc/dnsmasq.d/dnsmasq.lxcbr.conf
domain=local.lxc,10.10.10.0/24
interface=lxcbr
dhcp-range=lxcbr,10.10.10.1,10.10.10.200,24h
dhcp-option=option:router,10.10.10.254
Судя по всему, файл загружается корректно:
root@host:~# service dnsmasq status
● dnsmasq.service - dnsmasq - легковесный DHCP и кэширующий DNS сервер
Загрузка: загружен (/lib/systemd/system/dnsmasq.service; включен)
[...]
Feb 03 19:06:39 host dnsmasq[4228]: dnsmasq: проверка синтаксиса прошла успешно.
Feb 03 19:06:39 host dnsmasq[4237]: запущен, версия 2.72, размер кэша 150
Feb 03 19:06:39 host dnsmasq[4237]: опции компиляции: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect
Feb 03 19:06:39 host dnsmasq-dhcp[4237]: DHCP, диапазон IP адресов 10.10.10.1 — 10.10.10.200, время аренды 1 день
Feb 03 19:06:39 host dnsmasq[4237]: чтение /etc/resolv.conf
Feb 03 19:06:39 host dnsmasq[4237]: использование nameserver upstream.nameserver.ip.here#53
Feb 03 19:06:39 host dnsmasq[4237]: использование nameserver upstream.nameserver.ip.here#53
Feb 03 19:06:39 host dnsmasq[4237]: чтение /etc/hosts - 5 адресов
lxcbr – это интерфейс хоста в сети контейнера:
root@host:~# ifconfig
[...]
lxcbrBind Link encap:Ethernet HWaddr fe:60:7a:cc:56:64
inet addr:10.10.10.254 Bcast:10.10.10.255 Mask:255.255.255.0
inet6 addr: fe80::7a:56ff:fe82:921f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:92 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5688 (5.5 KiB) TX bytes:928 (928.0 B)
veth0 Link encap:Ethernet HWaddr fe:60:7a:cc:56:64
inet6 addr: fe80::fc60:7aff:fecc:5664/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:648 (648.0 B) TX bytes:648 (648.0 B)
veth0 – это veth интерфейс контейнера:
# /var/lib/lxc/container
lxc.network.type = veth
lxc.network.name = veth0
lxc.network.flags = up
lxc.network.link = lxcbr
lxc.network.veth.pair = veth0
Я предполагаю, что делаю что-то очень глупое, но у меня закончились идеи.
Буду признателен за вашу помощь,
Кристофер
-
Убедитесь, что UDP пакеты имеют контрольные суммы
В виртуальных сетях контрольные суммы UDP не вычисляются. Это приводит к тому, что dhclient отвергает предложения. Вы можете исправить это, указав хосту восстановить отсутствующие контрольные суммы:iptables -t mangle -A POSTROUTING -p udp -j CHECKSUM –checksum-fill
-
Выполните dhclient в контейнере
Так как файлы /etc/network/interfaces контейнеров не используются LXC, вы должны выполнить dhclient вручную.
Заполнение контрольной суммы решило ту же проблему для меня.
Вы можете быть более точными, указав интерфейс моста, к которому прикреплен ваш LXC:
iptables -t mangle -A POSTROUTING -p udp -j CHECKSUM -i bridge --checksum-fill
Что касается автоматического dhclient
Настройте ваш интерфейс на использование dhcp в /etc/network/interfaces :
auto eth0
iface eth0 inet dhcp
затем включите сетевой сервис в вашем контейнере :
systemctl enable networking
systemctl start networking
Ответ или решение
Чтобы настроить выделение IP-адресов для контейнеров LXC с использованием DHCP без использования lxc-net, вы можете следовать нижеприведенным инструкциям. Вашей целью является распределение контейнеров по различным сетям, чтобы по умолчанию они не могли общаться друг с другом.
Настройка DHCP с помощью dnsmasq
Вы уже установили dnsmasq на вашем хосте и правильно сконфигурировали его в файле /etc/dnsmasq.d/dnsmasq.lxcbr.conf
. Однако, чтобы убедиться, что все работает, необходимо учесть несколько важных шагов и проверок.
-
Проверка конфигурации интерфейсов:
- Убедитесь, что интерфейс
lxcbr
правильно сконфигурирован. В вашем случае, он настроен для работы в сети10.10.10.0/24
с шлюзом10.10.10.254
.
- Убедитесь, что интерфейс
-
Проверка чек-сумм UDP:
- Проблема с чексуммами UDP пакетов может приводить к отказу в принятии DHCP предложений. Используйте следующую команду для заполнения чексумм на уровне хоста:
iptables -t mangle -A POSTROUTING -p udp -j CHECKSUM --checksum-fill
- Если вы хотите применять правило только к специфическому мостовому интерфейсу:
iptables -t mangle -A POSTROUTING -p udp -j CHECKSUM -i lxcbr --checksum-fill
- Проблема с чексуммами UDP пакетов может приводить к отказу в принятии DHCP предложений. Используйте следующую команду для заполнения чексумм на уровне хоста:
-
Запуск DHCP клиента в контейнере:
- Поскольку
lxc.network.interfaces
в LXC не используется по умолчанию, вам нужно вручную запускатьdhclient
на контейнере. Убедитесь, что в/etc/network/interfaces
контейнера указаны следующие строки для автоматического получения IP через DHCP:auto eth0 iface eth0 inet dhcp
- Не забудьте включить и запустить сетевой сервис в контейнере для активации изменений:
systemctl enable networking systemctl start networking
- Поскольку
Заключение
Следуя вышеописанным шагам, вы сможете настроить контейнеры LXC для использования DHCP без необходимости в lxc-net, обеспечивая при этом раздельные сетевые сегменты для каждого контейнера.
Пожалуйста, убедитесь, что ваш dnsmasq правильно загружается и применяет конфигурационные файлы. Проверяйте логи dnsmasq
для диагностики возможных проблем с помощью команды:
journalctl -u dnsmasq
Эти шаги помогут эффективно управлять IP-адресами контейнеров и строить безопасную и изолированную сетевую инфраструктуру.