Вопрос или проблема
У меня есть контейнер A, работающий как VPN-клиент, затем я перенаправляю трафик других контейнеров (B и C) через контейнер A.
Есть ли способ создать контейнер D, который внутри работает как HostAP или RaspAP для создания Wi-Fi сети на, например, интерфейсе wlan0
, и чтобы весь трафик направлялся через контейнер A?
Я нашел несколько образов Docker в Docker Hub с вышеупомянутыми клиентами для моей архитектуры, и хотя их описания кажутся похожими на то, что я пытаюсь достигнуть, ни один из них не работал должным образом.
Если предыдущий вариант невозможен, как это можно сделать, напрямую изменив файлы в операционной системе хоста (Raspbian)? Хост подключен через eth0
к роутеру.
Сначала я попытался запустить контейнеры напрямую с интерфейса eth0
, а затем попытался подключить его к контейнеру A. Ничто из этого не сработало.
Docker compose для hostap:
sudo docker run --restart unless-stopped -dit --name hostap \
-e INTERFACE=docker0 \
-e CHANNEL=6 \
-e SSID=runssid \
-e AP_ADDR=192.168.254.1 \
-e SUBNET=192.168.254.0 \
-e WPA_PASSPHRASE=passw0rd \
-e OUTGOINGS=eth0 \
-e HW_MODE=g \
--net host --privileged sdelrio/rpi-hostap:latest
Файл журнала:
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm/v7) and no specific platform was requested
2448abea512bf5207f7692d242804b0a0198b6e076b011c311b06092af1b5d80
Затем он крашит всю установку Docker на Raspberry (нет доступа к другим контейнерам). Мне нужно убить контейнер и удалить его, чтобы восстановить доступ.
** Docker compose с использованием raspap:**
sudo docker run --name raspap -it -d --privileged --network=host -v /sys/fs/cgroup:/sys/fs/cgroup:ro --cap-add SYS_ADMIN jrcichra/raspap-docker
Этот контейнер останавливается после его создания.
Файл журнала:
systemd 241 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid)
Detected virtualization docker.
Detected architecture arm.
Welcome to Debian GNU/Linux 10 (buster)!
Set hostname to <Server-Pi>.
Failed to create /init.scope control group: Read-only file system
Failed to allocate manager object: Read-only file system
[!!!!!!] Failed to allocate manager object.
Настройка:
- Docker работает на Raspbian на Raspberry Pi 4
Проверенные образы Docker:
Спасибо заранее.
Первая ошибка, которую вы описали, возникает потому, что образ на Docker Hub не был создан для архитектуры процессора RPi. Архитектура изображений linux/amd64
, ваша требуемая архитектура – linux/arm/v7
.
Я лично считаю, что запуск hostap в контейнере не очень полезен, и базовый образ rpi-hostap, а также сам образ, похоже, устарели и не поддерживаются, но если вы действительно хотите, вы можете попробовать собрать образ сами.
Сначала вам нужно назначить IP для интерфейса WLAN и создать DNS и DHCP сервер (например, dnsmasq). Для этого вы можете найти множество руководств в интернете.
Что касается маршрутизации трафика через контейнер VPN, вам нужно включить IP-прокси в контейнере, а также на хосте, создать правило маскировки iptables для интерфейса моста контейнера VPN и добавить правило ip для маршрутизации трафика с интерфейса WLAN, используя пользовательскую таблицу маршрутизации, и добавить маршрут по умолчанию в эту таблицу маршрутизации через IP-адрес контейнера VPN.
Это может выглядеть следующим образом:
Включите IP-прокси на хосте:
Отредактируйте /etc/sysctl.conf
, измените net.ipv4.ip_forward = 0
на net.ipv4.ip_forward = 1
, сохраните и загрузите изменения, используя sysctl -p
.
vpn-compose:
version: "3.8"
services:
vpn-01:
build: image
container_name: vpn-01
networks:
net:
ipv4_address: 172.16.239.2
volumes:
- './config/vpn-01/openvpn:/config/openvpn'
restart: unless-stopped
cap_add:
- NET_ADMIN
sysctls:
- net.ipv4.ip_forward=1
networks:
net:
driver: bridge
ipam:
name: vpn_net
driver: default
config:
- subnet: 172.16.239.0/24
gateway: 172.16.239.1
Маршрутизация и NAT (вы можете запустить их при запуске после docker.service и hostapd.service):
# MASQUERADE так как сеть wlan1 не имеет маршрута в контейнерах vpn и маршрут по умолчанию изменен на vpn
docker_if_vpn="br-$(docker network ls | grep vpn_net | cut -d' ' -f1)"
iptables -t nat -I POSTROUTING -o "${docker_if_vpn}" -j MASQUERADE
# Измените маршрут по умолчанию для трафика от wlan1 к контейнеру vpn
vpn_container_name="vpn-01"
docker_ip_vpn="$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "${vpn_container_name}")"
ip route add default via "${docker_ip_vpn}" table 202
ip rule add from all iif wlan0 table 202
# Используйте основную таблицу маршрутизации первой, но не совпадайте с 0.0.0.0/0 ("по умолчанию")
ip rule add from all lookup main suppress_prefixlength 0
Ответ или решение
Как маршрутизировать трафик с точки доступа Wi-Fi через контейнер Docker на Raspberry Pi
Настройка маршрутизации трафика через контейнер Docker на Raspberry Pi может быть сложной задачей, особенно когда речь идет о создании точки доступа Wi-Fi. На основе предоставленного описания проблемы, мы рассмотрим шаги, необходимые для достижения этой цели. Основной задачей является маршрутизация всего трафика с устройства, подключенного к Wi-Fi, через контейнер с VPN.
1. Подготовка окружения
Для начала необходимо убедиться, что на вашем Raspberry Pi установлены Docker и docker-compose. Также убедитесь, что вы используете правильный образ для вашего устройства, поскольку многие образы могут быть несовместимы с архитектурой ARM.
2. Создание контейнера с VPN (контейнер A)
Вам понадобится контейнер с запущенным VPN-клиентом, который будет обрабатывать весь входящий и исходящий трафик. Структура вашего docker-compose.yaml
файла может выглядеть следующим образом:
version: "3.8"
services:
vpn:
image: ваш_vpn_образ
container_name: vpn_container
restart: unless-stopped
cap_add:
- NET_ADMIN
sysctls:
- net.ipv4.ip_forward=1
3. Настройка точки доступа Wi-Fi (контейнер D)
Следующим шагом будет создание контейнера с HostAP или RaspAP. Важно отметить, что использование контейнеров для управления сетевыми интерфейсами может быть затруднительно из-за ограничений прав и доступа. Выбор правильного образа имеет решающее значение. Запустите контейнер с HostAP, используя правильную архитектуру:
sudo docker run --restart unless-stopped -dit --name hostap \
--net=host \
--privileged \
-e INTERFACE=wlan0 \
-e SSID=your_ssid \
-e WPA_PASSPHRASE=your_password \
sdelrio/rpi-hostap:latest
Обратите внимание:
Если контейнеры крашатся или возникают другие ошибки, возможно, стоит рассмотреть возможность использования образов, которые активно поддерживаются сообществом.
4. Настройка маршрутизации
Теперь необходимо настроить маршрутизацию так, чтобы весь трафик с точки доступа направлялся через VPN-контейнер. Вам нужно включить IP-проброс на хосте Raspberry Pi:
-
Редактируйте файл
/etc/sysctl.conf
, установитеnet.ipv4.ip_forward = 1
, затем выполните команду:sudo sysctl -p
-
Настройте правила iptables для маскарадинга и маршрутизации:
# Включение маскарадинга для вашего VPN-контейнера
docker_if_vpn="br-$(docker network ls | grep vpn_net | cut -d' ' -f1)"
iptables -t nat -I POSTROUTING -o "${docker_if_vpn}" -j MASQUERADE
# Изменение маршрута по умолчанию для трафика с wlan0 на VPN-контейнер
vpn_container_name="vpn_container"
docker_ip_vpn="$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "${vpn_container_name}")"
ip route add default via "${docker_ip_vpn}" table 202
ip rule add from all iif wlan0 table 202
# Использование основной таблицы маршрутизации
ip rule add from all lookup main suppress_prefixlength 0
5. Управление DHCP и DNS
Для назначения IP-адресов подключенным клиентам через вашу точку доступа, вам нужен DHCP-сервер, такой как dnsmasq
. Настройте его в контейнере или на хосте, чтобы он выдавал IP-адреса в том диапазоне, который вы указали для точки доступа.
Заключение
Настройка маршрутизации трафика через контейнер Docker на Raspberry Pi с использованием точки доступа Wi-Fi — задача, требующая усилий и тщательной настройки. Убедитесь, что все контейнеры запускаются с использованием правильных архитектур и следуйте всем шагам для обеспечения работоспособности сети. Если у вас возникнут проблемы с контейнерами, возможно, стоит рассмотреть альтернативные варианты, такие как настройка программного обеспечения непосредственно на хосте Raspberry Pi.