Вопрос или проблема
Я пытаюсь настроить контейнер Docker, который будет доступен в сети с MAC-адресом и статическим IP-адресом. Для этого я использую macvlan.
Сначала я создал сеть в Docker:
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
--ip-range=192.168.1.64/26 \ # Чтобы избежать пересечения с текущими устройствами
-o parent=wlp0s20f3 \ # Мое wifi-соединение
macvlan
Затем я настроил маршруты на своем хосте (с установленным ubuntu) с помощью:
sudo ip link set wlp0s20f3 promisc on
sudo ip link add dockerrouteif link wlp0s20f3 type macvlan mode bridge
sudo ip addr add 192.168.1.249/32 dev dockerrouteif
sudo ip link set dockerrouteif2 up
sudo ip route add 192.168.1.64/26 dev dockerrouteif
И запустил контейнер, используя docker compose:
services:
app:
...
networks:
macvlan:
ipv4_address: 192.168.1.100
aliases:
- app.external
...
networks:
macvlan:
external: true
name: macvlan
Это работает, контейнер может получать доступ к моим сетевым устройствам, мой хост может получать доступ к IP 192.168.1.100, но я не могу пинговать эту машину извне хоста.
Я отключил брандмауэры, проверил iptables, чтобы увидеть, блокирует ли что-то доступ, и после долгих поисков я получил это от arp -n
, и не знаю, как дальше действовать:
? (192.168.1.100) at <incomplete> on wlp0s20f3
Во всех документациях, статьях, уроках, руководствах и видео macvlan “просто работает”, и я не могу понять, что делаю не так.
Ответ или решение
Проблема с доступом к контейнеру Docker через Macvlan
Настройка доступа к контейнеру Docker с использованием Macvlan может вызвать трудности, особенно если контейнер не доступен с внешних устройств. В данной статье мы разберемся, с чем может быть связана ваша проблема, и предложим варианты решения.
1. Проверка конфигурации сети
Первым делом стоит обратить внимание на настройки Macvlan, которые вы использовали. Убедитесь, что вы правильно задали все параметры при создании сети:
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
--ip-range=192.168.1.64/26 \
-o parent=wlp0s20f3 \
macvlan
Проверьте, что wlp0s20f3
является корректным интерфейсом, и он действительно подключен к нужной сети.
2. Настройка маршрутизации
Вы также упомянули, что на хосте вы добавили несколько маршрутов:
sudo ip link set wlp0s20f3 promisc on
sudo ip link add dockerrouteif link wlp0s20f3 type macvlan mode bridge
sudo ip addr add 192.168.1.249/32 dev dockerrouteif
sudo ip link set dockerrouteif2 up
sudo ip route add 192.168.1.64/26 dev dockerrouteif
Обратите внимание на следующее:
-
Режим promiscuous: Включение режима promiscuous на интерфейсе
wlp0s20f3
важно для правильной работы Macvlan. Это позволяет интерфейсу «слушать» всю проходящую мимо трафик, а не только тот, который адресован ему. -
Маршрут и адресация: Вы добавили адрес 192.168.1.249/32. Это значит, что хост настроен на точечное обращение, что может быть недостаточно для работы с диапазоном IP-адресов 192.168.1.64/26. Убедитесь, что маршруты настроены корректно, чтобы весь трафик для соответствующих диапазонов проходил через интерфейс
dockerrouteif
.
3. Выявление проблемы с ARP
Вы привели вывод команды arp -n
, который указывает, что для IP-адреса 192.168.1.100 получен статус <incomplete>
. Это говорит о том, что запрашивающее устройство не получило ARP-ответа от контейнера. Причинами могут быть:
-
ARP-сигналы: Убедитесь, что контейнер действительно отвечает на ARP-запросы. Это может быть связано с конфигурационными настройками внутри контейнера или самой сетью.
-
MAC-адрес контейнера: Попробуйте явно указать MAC-адрес для вашего контейнера при его создании, чтобы исключить возможность конфликтов:
app:
...
networks:
macvlan:
ipv4_address: 192.168.1.100
mac_address: "00:00:00:00:00:01" # Замените на уникальный MAC-адрес
4. Проверка сетевой изоляции
Некоторые конфигурации сети могут блокировать доступ с внешних устройств. Проверьте настройки вашего маршрутизатора (или коммутатора), чтобы убедиться, что фильтры и правила не препятствуют подключению к контейнерам.
5. Мониторинг и диагностика
Если все вышеперечисленное не помогло, используйте такие инструменты, как tcpdump
на интерфейсах, чтобы проанализировать проходящий трафик:
sudo tcpdump -i wlp0s20f3
sudo tcpdump -i dockerrouteif
Это даст вам понимание того, видите ли вы ARP-запросы и ответы, и поможет определить, где именно происходит потеря пакетов.
Заключение
Настройка Macvlan в Docker может быть сложной задачей, и доступ извне — это одна из самых распространенных проблем. Проверьте конфигурацию сети, маршрутизации и правила ARP. Убедитесь, что все параметры соответствуют требованиям вашей инфраструктуры. Если после всех проверок проблема остается нерешенной, рассмотрите возможность обращения за помощью к сообществу Docker или специалистам в области сетевых технологий.