Как направить трафик от точки доступа Wi-Fi через контейнер Docker на Raspberry Pi

Вопрос или проблема

У меня есть контейнер 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:

  1. Редактируйте файл /etc/sysctl.conf, установите net.ipv4.ip_forward = 1, затем выполните команду:

    sudo sysctl -p
  2. Настройте правила 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.

Оцените материал
Добавить комментарий

Капча загружается...