Raspberry PiのDockerコンテナを介してWiFi APのトラフィックをルーティングする方法

Raspberry PiのDockerコンテナを介してWiFi APのトラフィックをルーティングする方法

コンテナがあります。VPNクライアントを実行してから別のコンテナを転送します。第二そして) コンテナを通るトラフィック

コンテナを作成する方法はありますか?D、次のように実行しています。ホストAPまたはラズベリーパイたとえば、インターフェイスで Wi-Fi ネットワークを作成するために使用され、wlan0すべてのトラフィックはコンテナを経由してルーティングされます。

私のアーキテクチャについて上記のクライアントと一緒にドッカーハブでいくつかのドッカーイメージを見つけました。

以前のオプションが利用できない場合は、ホストオペレーティングシステム(Raspbian)でファイルを直接変更してこれを達成するにはどうすればよいですか?ホストはeth0ルータを介して接続されます。

まず、インターフェイスから直接コンテナを実行してから、eth0コンテナに接続してみました。。それらのどれも仕事がありません。

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

その後、Raspberry Pi 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.


設定:

  • Raspberry Pi 4のRaspbian上で動作するDocker

確認するDockerイメージ:

よろしくお願いします。

答え1

説明する最初のエラーは、dockerハブのイメージがRPiのCPUアーキテクチャ用に構築されていないために発生します。イメージアーキテクチャはですlinux/amd64。必要なアーキテクチャはですlinux/arm/v7。私は個人的にコンテナでHostapを実行することはあまり有益ではないと思います。評判を築くあなた自身。

まず、WLAN インターフェイスに IP を割り当て、DNS および DHCP サーバー (例: dnsmasq) を作成する必要があります。これに関する多くのチュートリアルをオンラインで見つけることができます。

VPNコンテナを介してトラフィックをルーティングするには、コンテナとホストでIP転送を有効にし、VPNコンテナブリッジインターフェイスのiptables偽装ルールを作成し、次を使用してWLANインターフェイスからトラフィックをルーティングするIPルールを追加する必要があります。カスタムルーティングテーブルと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

関連情報