如何通过 Raspberry Pi 上的 Docker 容器路由来自 WiFi AP 的流量

如何通过 Raspberry Pi 上的 Docker 容器路由来自 WiFi AP 的流量

我有一个容器A运行 VPN 客户端,然后我传输其他容器'(C) 通过容器的流量A

有没有办法创建容器D,其内部正在运行类似的东西主机AP或者树莓派用于在eg接口中创建wifi网络wlan0,然后所有流量都通过容器路由A

我在 docker hub 中找到了一些 docker 镜像以及上述客户端,用于我的架构,虽然它们的少数描述似乎与我想要实现的目的相似,但没有一个能正常工作。

如果前面的选项不可行,如何通过直接更改主机操作系统(Raspbian)中的文件来实现这一点?主机通过eth0路由器连接。

首先,我尝试直接从界面运行容器eth0,然后尝试将其附加到容器A。他们都没有工作。

Hostap 的 Docker 组合:

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 安装崩溃(无法访问任何其他容器)。我必须杀死容器并消除才能重新获得访问权限。

** 使用 raspap 进行 Docker 组合:**

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 在 Raspberry Pi 4 中的 Raspbian 上运行

检查的 Docker 镜像:

提前致谢。

答案1

发生您描述的第一个错误是因为 docker hub 上的映像不是针对 RPi 的 cpu 架构构建的。图像架构是linux/amd64,您所需的架构是linux/arm/v7。我个人认为在容器中运行 hostap 并不是很有好处,而且 rpi-hostap 的基础镜像以及镜像本身似乎很旧并且没有维护,但如果你真的想要,你可以尝试建立形象你自己。

首先,您需要为 WLAN 接口分配 IP 并创建 DNS 和 DHCP 服务器(如 dnsmasq)。为此,您可以在网上找到大量教程。

对于通过 VPN 容器路由流量,您需要在容器中以及主机上启用 IP 转发,为 VPN 容器桥接口创建 iptables 伪装规则,并添加一条 ip 规则以使用以下命令路由来自 WLAN 接口的流量:自定义路由表,并通过 VPN 容器 IP 地址将默认路由添加到此路由表。这可能类似于以下内容:

在主机上启用IP转发:使用
编辑/etc/sysctl.conf、更改net.ipv4.ip_forward = 0net.ipv4.ip_forward = 1、保存和加载更改sysctl -p

VPN-撰写:

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 cause wlan1 net has no route in vpn containers and default route changed to 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

# Change default route for traffic from wlan1 to vpn container
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

# Use main routing table first but don't match 0.0.0.0/0 ("default")
ip rule add from all lookup main suppress_prefixlength 0

相关内容