Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

前回の記事の続きです。 NextcloudにWireguardを追加して、スマホからVPNを張った状態でNextcloudとやりとりをします。スマホはiPhoneで試しています。Andoridでも同じです。ノートパソコンの4G回線は未確認です。 ネットワークで飯を食っているわけではない素人同然ですから、間違いや勘違いが含まれていると、確信しています!! どうぞお気を付けてお読みください。一応、動作しています。 追記(2023/02/14):networks:を見直し修正。ALLOWEDIPSを修正。 Wireguard部分 wireguardの部分のみは次のように記述しました。LinuxServer.ioのサンプル例を元にしています。 Routing Docker Host And Container Traffic Through WireGuard | LinuxServer.io wireguard: container_name: wireguard image: linuxserver/wireguard:latest restart: always environment:

  • PUID=1000
  • PGID=1000
  • TZ=Asia/Tokyo
  • SERVERURL=xxxx.xxx #DDNSサービスで取得したURLアドレス
  • SERVERPORT=51820
  • PEERS=laptop,phone,tablet,pc #4つのペアキーを生成
  • PEERDNS=auto #オプション
  • INTERNAL_SUBNET=10.13.13.0 #オプション #- ALLOWEDIPS=0.0.0.0/0 #オプション

前回の記事の続きです。

NextcloudにWireguardを追加して、スマホからVPNを張った状態でNextcloudとやりとりをします。スマホはiPhoneで試しています。Andoridでも同じです。ノートパソコンの4G回線は未確認です。

ネットワークで飯を食っているわけではない素人同然ですから、間違いや勘違いが含まれていると、確信しています!! どうぞお気を付けてお読みください。一応、動作しています。

追記(2023/02/14):networks:を見直し修正。ALLOWEDIPSを修正。

Wireguard部分

wireguardの部分のみは次のように記述しました。LinuxServer.ioのサンプル例を元にしています。

Routing Docker Host And Container Traffic Through WireGuard | LinuxServer.io

  wireguard:
    container_name: wireguard
    image: linuxserver/wireguard:latest
    restart: always
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
      - SERVERURL=xxxx.xxx #DDNSサービスで取得したURLアドレス
      - SERVERPORT=51820
      - PEERS=laptop,phone,tablet,pc #4つのペアキーを生成
      - PEERDNS=auto #オプション
      - INTERNAL_SUBNET=10.13.13.0 #オプション
      #- ALLOWEDIPS=0.0.0.0/0 #オプション
      - ALLOWEDIPS=10.13.13.1/32,192.168.x.x/24 #ローカルLANを追加
      #- LOG_CONFS=true #オプション
    ports:
      - "51820:51820/udp" #51820 UDPプロトコルを指定、これをルーターでポートマップする
    volumes:
      - ./wireguard/config:/config
      - ./wireguard/custom-cont-init.d:/custom-cont-init.d
      - ./wireguard/custom-services.d:/custom-services.d
      - /lib/modules:/lib/modules:ro
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    networks:
      - default

networks:
  default:
    driver: bridge
    ipam:
      driver: default

SERVERURLにDDNSサービスで取得したアドレスを指定しています。今回はDDNSサービスとして無料の「DDNS NOW」を利用しました。

ここで取得したURLアドレスを、cronで1日1回更新することによってグローバルIPが変更になっても使えるようにしていきます。

実際に外部からwireguardでVPNを張るなら、ルーター管理画面にてポートマッピングを追加する必要があります。

DDNSサービスで取得したURL

DDNSサービスで取得したアドレスを入れます。DDNS NOWで取得したなら、「***.f5.si」です。

  - SERVERURL= #DDNSサービスで取得したURLアドレス

DDNSサービスの取得

DDNS NOWは国内サーバで、料金は永久無料、利用期間 無期限なし、登録にメールアドレスや個人情報は不要となっています。試すにはちょうど良いかも知れません。

DDNS Now - 無料ダイナミックDNSサービス

作成後、ログインしている状態で詳細情報にAPIトークンが表示されています。これを使い、crontabへ追記します。

curl -X GET https://f5.si/update.php?domain=ユーザー名\&password=API用トークン

更新頻度は1時間に1回までOKです。wgetでの記載がDDNS Now公式です。

crontab -e
0-59 * * * * wget -O DDNSNow_update.log "https://f5.si/update.php?domain=ユーザ名&password=API用トークン"
(0 0 * * * curl -X GET https://f5.si/update.php?domain=ユーザー名\&password=API用トークン)

指定したlogファイルにOK:SUCCESS (good)とあれば更新成功です。

crontabの記述が分かりやすいジェネレーター。非エンジニアには重宝しますね。

Crontab.guru - The cron schedule expression generator

cron自体の実行ログは以下で探せます。

journalctl -u cron | grep curl

PEERS

  - PEERS=laptop,phone,tablet,pc #4つのペアキーを生成

ここで4つ生成しています。(laptop、phone、tablet、pc)数字でもOKです。PEERS=4

数字より使うクライアント(ピア)の名前の方が分かりやすいですよね。

これがwireguardディレクトリの中に保存されます。後ほど、これを使ってスマホで登録します。QRコードで取り込むので簡単です。

DNS関連

      - PEERDNS=auto #オプション
      - INTERNAL_SUBNET=10.13.13.0 #オプション
      #- ALLOWEDIPS=0.0.0.0/0 #オプション
      - ALLOWEDIPS=10.13.13.1/32,192.168.0.0/24

ここはキリがないくらい調べました。正直、よく分かりません。

networksとも関係するので、今回のnextcloud+wireguardだと、ご紹介した状態で動作しました。同じdockerコンテナにpi-holeなど別のアプリやサーバを入れた場合はまた変わってきます。

デフォルト例の0.0.0.0/0だと全てなので、SUBSETで指定したアドレスと、ローカルLANで使用しているアドレスを指定しておきます。(192.168.1.0/24など)

10.13.13.1/32は内部IPのサーバIPです。

スマホで確認したところ、これで外への通信もできますし、ローカルで使っているサーバなどに到達できました。(openmediavaultの管理画面やその他)

もちろんNextcloudとも通信できます。

Ports

    ports:
      - "51820:51820/udp" #51820 UDPプロトコルを指定、これをルーターでポートマップする

ルーターでポートマッピングする際に指定するUDP:wireguardのポート

もしもポート番号を、55555:51820に変更した場合は、ルーター側を55555で指定します。

ポートマッピングについて記事下部でも案内しています。

networks

    networks:
      - default

networks:
  default:
    driver: bridge
    ipam:
      driver: default

networksを指定しているのは、nextcloudとwireguardの2ヶ所にしました。その他はデフォルトであるbridgeまたは、前回のymlを実行していたならnextcloud_defaultになっていると思います。

wgnetをブリッジとして同ネットワークにしました。

dockerは内部的に勝手にネットワークをバインドしてくれるので、有り難い反面、ややこしい印象です。

このnetwork周りの仮想ブリッジとDNS関係で悩みました。今後、対応するとしたらこの部分の書き換えになると思います。

ネットワーク名(nextcloud_)defaultに各コンテナをすべてまとめ、(nextcloud_)mynetにnextcloudとnextcloud_dbを内部ネットワークにしました。

(nextcloud_)default
   ├─ nextcloud
   ├─ wiregurd
   └─ 他...

(nextcloud_)mynet オプションinternal
    ├─ nextcloud
    └─ nextcloud_db

nextcloud_dbを外部から届かない内部的にしたいけど、nextcloudとは接続したいからになります。

Rグリーン Rグリーン
んー、ここが難しいっス

portainer部分

portainerは本来コマンドで実行することをGUIで済ませられます。私もDockerに慣れていないのでとても助かっています。

特にネットワーク周りなどを調べるのに好都合です。

コンテナに入ってコマンドを実行できるコンソールもあり、ラズパイ側でコマンドを実行しなくてもできるのが有り難い。(docker exec〜)

porainerはなくても目的は果たせるためどちらでも構いません。

一緒に記載して導入しておきましょう。特に変更せずサンプル例のままで使っています。

アクセスするのは9000番ポートでアクセスできます。http://IPアドレス:9000

初回はアカウントを作成する画面になります。

  portainer-ce:
    container_name: portainer-ce
    image: portainer/portainer-ce:linux-arm64
    restart: unless-stopped
    ports:
      - "8000:8000"
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer-ce/data:/data

コンテナを起動してみる

以上のNextcloudとDB(MariaDB)、wireguardとportainerをまとめてymlに書いて実行させれば、Dockerコンテナが立ち上がってサーバとして使えるようになります。

前回と違い、Volumesはそのまま動くように外付けHDDを指定していません。 networksは前回の記事とは変更しています。すみません。 #コメントが入っている部分は自分の環境に書き換えてください。

すべてのdocker-compose.ymlを開く

version: '3.8'

services:
  nextcloud_db:
    image: linuxserver/mariadb:arm64v8-latest
    container_name: nextcloud_db
    volumes:
      - ./db:/config
      - ./db_backup:/backup
    restart: always
    ports:
      - "3306:3306"
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
      - MYSQL_ROOT_PASSWORD=rootpass
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=password
    networks:
      - mynet

  nextcloud:
    image: nextcloud:latest
    container_name: nextcloud
    restart: always
    ports:
      - "50080:80"
    volumes:
      - ./html:/var/www/html
      - ~/1tbhdd:/1tbhdd
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
      - MYSQL_HOST=nextcloud_db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=password
    depends_on:
      - nextcloud_db
    networks:
      - default
      - mynet

  wireguard:
    container_name: wireguard
    image: linuxserver/wireguard:latest
    restart: always
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
      - SERVERURL=xxx.xxx.xxx
      - SERVERPORT=51820
      - PEERS=laptop,phone,tablet,pc
      - PEERDNS=auto
      - INTERNAL_SUBNET=10.13.13.0
      #- ALLOWEDIPS=0.0.0.0/0
      - ALLOWEDIPS=10.13.13.1/32,192.168.x.x/24
      #- LOG_CONFS=true
    ports:
      - "51820:51820/udp"
    volumes:
      - ./wireguard/config:/config
      - ./wireguard/custom-cont-init.d:/custom-cont-init.d
      - ./wireguard/custom-services.d:/custom-services.d
      - /lib/modules:/lib/modules:ro
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    networks:
      - default

  portainer-ce:
    container_name: portainer-ce
    image: portainer/portainer-ce:linux-arm64
    restart: unless-stopped
    ports:
      - "8000:8000"
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer-ce/data:/data

networks:
  default:
    driver: bridge
    ipam:
      driver: default
  mynet:
    driver: bridge
    internal: true
    ipam:
      driver: default

ymlを保存したらコンテナを立ち上げます。エラーが出た場合、親切に教えてくれるので、記述ミスや指定ミスを変更してから再度コマンドを実行しましょう。

docker-compose up -d

止めるにはstopとdownがあります。止めて書き換えてまたUPする感じ。downはコンテナを停止し、 up で作成したコンテナ、ネットワーク、ボリューム、イメージを削除します。

docker-compose down

オプションの–force-recreateを付けると、設定やイメージに変更がなくてもコンテナを再作成できます。( –no-recreate とは同時に使えない)

docker-compose up -d --force-recreate

普段はdocker-compose up -dで構いません。

Webブラウザから管理画面へ

NextcloudへWebブラウザからアクセスしてみます。今回はポート50080です。

http://ラズパイのIPアドレス:50080

最初にNextcloudの管理者アカウントを作成する画面が表示されます。

yml通りなら、インストールボタンのみでしばらく待てばログインしてダッシュボードが表示されるはずです。

もしもサーバやデータベースを選べという画面なら、以下のように設定します。

■Pi 5は8GBモデルがオススメ

スマホと連携するのにQRコード

Dockerが立ち上がったら、次にスマホにNextcloudとWireguardアプリを入れてください。

アプリはそれぞれ公式があります。

Nextcloudアプリ

Webの画面からQRコードを発行してスマホアプリのログイン設定をします。

Nextcloudの右上メニューから管理者設定 –> セキュリティ(個人) –> デバイスとセッション

新しいアプリパスワードを作成から任意でアプリ名を入れて発行してください。

パスワード欄の下に、QRコードで表示するリンクが出ますので、クリックするとQRコードが表示されます。

スマホアプリのQRコードで読み込むからカメラでスキャンすれば、設定の完了です。簡単!バーコードの画像をクリックすればカメラが立ち上がります。

次はwireguardです。

Wireguardアプリ

既にQRコードを含め、認証情報が生成されています。サーバであるRaspberry Pi OS liteの場合、デスクトップ画面がありませんから、コンソール画面に表示させます。

QRコードを表示するコマンドとして、show-peerコマンドで可能です。

今回は作成したpeer_phoneをみてみます。

ラズパイ側で実行します。

docker exec -it wireguard /app/show-peer phone

するとコンソール画面に表示されます。

こちらはpeer_pc

これをスマホのNextcloudアプリで読み込ませれば、それでピア接続が可能になります。簡単!

もしもファイルを取り出したいなら

ファイルを転送するSCPコマンド(例) Mac&WinからラズパイにあるQRコードの画像をWin&Macに取り出す場合

scp raspida@homepi.local:~/nextcloud/wireguard/config/peer_phone/peer_phone.png .

※アプリを使ってもいいかも。WindowsならWinSCPやTeratermでしょうか。

こんな方法もあります。

ラズパイからファイルを取り出すのに便利なpythonコマンド、一時利用に限る

実際の画面だとこうなっていて、エンドポイントはDDNSサービスで取得したドメインです。

Wireguardアプリのピア設定画面

ピアのIPとルーター、実際のローカルIP

ポートマッピング

ルーターのポートマッピングは済んでいますか?

設定方法は、お使いのルーターによって異なります。一例としてこんな感じになっていればOKです。

ポートマッピングの例

いわゆるポート開放というヤツです。

もしも使わなくなったら削除しておきましょう。

スマホの4GでVPNをオンにしてアプリを使う

早速使ってみてください。スマホでは問題なく4Gで外部からファイルのやり取りが行えると思います。

iPhoneのVPN設定画面

Nextcloudの分かりやすい画面に転送があります。右下メニュー「もっとみる」から転送で表示できます。このまま真ん中の+ボタンからファイルをアップロードして、VPN有りと無しを比べてみてください。

vpnマークがあるiPhone

VPVに接続

接続していないとずっとこの画面のまま

4Gや5Gの表記なら外部と同じです。VPNマークが出ていないと転送できないと思います。

VPN接続が確立していなくても(間違っていても)マーク自体は出てしまうようです。

今度は先ほど作ったVPN接続を有効にしてみてください。有効になると先ほどの転送待ちがすぐに転送されるのが分かります。

Wi-Fi内にあるPCのWebブラウザからファイルの一覧を更新すれば、そちらでも送ったファイルが表示されるハズです。

最後に

ここまでの設定で、スマホで自宅のNextcloudへは接続できるようになりました。DNSの名前解決にdnsmasqといったDNSサーバを追加すると良いでしょう。今回は省いています。

VPNを張った後、自宅のローカルネットワークにも入るようになっているため、Webブラウザから確認できる以外に、何かしらのサーバ(メディアサーバ等)も専用ソフトなりで接続することができます。

つまり、自宅のWi-Fi内に居るときと同じように使えるというわけです。

Rレッド Rレッド
Dockerに不慣れなので、もう少し色々と調べて試したいと思います。間違っていたり、より良い方法が分かった場合、この記事を随時更新していきます。
Rブラック Rブラック
Dockerって多少間違っても一見すると無事に動いてくれているように思えるから不思議。
Rグリーン Rグリーン
いや、間違っているから結局ダメなんだけどさ。

ほとんどがネットの集合知ですが、なるべくデフォルトに近い状態を意識して、僅かに手を加えるだけで実現できるように考えました。ラズパイが余っていたらぜひ試してください。

こういう実用的なの好き。

Docker、DDNSサービスを使い、外部からラズパイのNextcloudを使う方法でした。ペケポン。

前回の記事をみる

Dockerをもっと知りたくなった。

8章仕立てのうち、7章までDockerの基本になってる書籍を見つけた!

Links

GitHub - linuxserver/docker-wireguard