![如何通过 Raspberry Pi 上的 Docker 容器路由来自 WiFi AP 的流量](https://linux22.com/image/209858/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20Raspberry%20Pi%20%E4%B8%8A%E7%9A%84%20Docker%20%E5%AE%B9%E5%99%A8%E8%B7%AF%E7%94%B1%E6%9D%A5%E8%87%AA%20WiFi%20AP%20%E7%9A%84%E6%B5%81%E9%87%8F.png)
我有一个容器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 = 0
为net.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