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は国内サーバで、料金は永久無料、利用期間 無期限なし、登録にメールアドレスや個人情報は不要となっています。試すにはちょうど良いかも知れません。
作成後、ログインしている状態で詳細情報に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グリーン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サービスで取得したドメインです。

ピアのIPとルーター、実際のローカルIP
ポートマッピング
ルーターのポートマッピングは済んでいますか?
設定方法は、お使いのルーターによって異なります。一例としてこんな感じになっていればOKです。

ポートマッピングの例
いわゆるポート開放というヤツです。
もしも使わなくなったら削除しておきましょう。
スマホの4GでVPNをオンにしてアプリを使う
早速使ってみてください。スマホでは問題なく4Gで外部からファイルのやり取りが行えると思います。

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

VPVに接続

接続していないとずっとこの画面のまま
4Gや5Gの表記なら外部と同じです。VPNマークが出ていないと転送できないと思います。
VPN接続が確立していなくても(間違っていても)マーク自体は出てしまうようです。
今度は先ほど作ったVPN接続を有効にしてみてください。有効になると先ほどの転送待ちがすぐに転送されるのが分かります。
Wi-Fi内にあるPCのWebブラウザからファイルの一覧を更新すれば、そちらでも送ったファイルが表示されるハズです。
最後に
ここまでの設定で、スマホで自宅のNextcloudへは接続できるようになりました。DNSの名前解決にdnsmasqといったDNSサーバを追加すると良いでしょう。今回は省いています。
VPNを張った後、自宅のローカルネットワークにも入るようになっているため、Webブラウザから確認できる以外に、何かしらのサーバ(メディアサーバ等)も専用ソフトなりで接続することができます。
つまり、自宅のWi-Fi内に居るときと同じように使えるというわけです。
Rレッド
Rブラック
Rグリーンほとんどがネットの集合知ですが、なるべくデフォルトに近い状態を意識して、僅かに手を加えるだけで実現できるように考えました。ラズパイが余っていたらぜひ試してください。
こういう実用的なの好き。
Docker、DDNSサービスを使い、外部からラズパイのNextcloudを使う方法でした。ペケポン。
前回の記事をみる
Dockerをもっと知りたくなった。
8章仕立てのうち、7章までDockerの基本になってる書籍を見つけた!
Links





