Raspberry Pi 5のWebサーバーをインターネットに公開する。ポートは開けない、WireCanalのトンネルで

受信ポートを閉じたまま、Raspberry Pi 5のWebサーバーをインターネットに公開します。WireCanalのAgentをワンライナーで入れ、canalを作り、systemdで常駐化。ポート開放もルーター設定も不要で、操作はおよそ5分。再起動後の自動復活まで実測で検収しました。

Raspberry Pi 5のWebサーバーをインターネットに公開する。ポートは開けない、WireCanalのトンネルで

こんにちは!Qualitegプロダクト開発部です!

Raspberry Pi 5の連載も3回目です。

第1話でモニターなしのセットアップ、第2話で堅牢化をやりました。第2話ではUFWで受信を原則拒否し、自宅LANからのSSHだけを明示的に許可しました。

ラズパイの上ではWebサーバーが動いているのに、外からはもちろん、LAN内からすら8080には繋がらない状態です。

今回はこのラズパイのWebサーバーを、インターネット側から使えるようにします。ただし、

Web公開のために受信ポートを追加で開くことはしません。ルーターのポート開放もしません。使うのは、当社のトンネルサービスWireCanalです.今回の用途なら無料です。

先に結果を言うと、Agentのインストールから公開URLで表示できるところまで実測およそ5分、systemdでの常駐化まで含めて約10分でした。

この記事では、その手順を実際の画面と実測値つきで最初から最後まで書きます。再起動しても公開が自動で復活するところまで検収します。

対象はRaspberry Pi OS(64-bit・Debian 13 trixieベース)です。WireCanalは当社が開発・運営している自社サービスで、クレジットカード登録なしのフリープラン(0円)から使えます。記事中の数値は2026年8月14日時点の実測値です。

図1 Raspberry Pi 5 連載の全体像(今回は③)
図1 連載の全体像。今回は③で、Web公開用の受信ポートを開けないまま外に出す

ポートを開けずに、どうやって公開するのか

普通、自宅のサーバーを公開しようとすると、ルーターのポート開放(ポートフォワーディング)が要ります。ただ、これは外からの入口を自宅に作る行為なので、第2話でせっかく受信を固めたのに、今度はルーターに穴を開けるのかという話になります。さらに、グローバルIPが変動する環境で同じ名前から継続的にアクセスしたいなら、DDNSなどの仕組みも必要になります。集合住宅の回線だと、そもそもポート開放ができないこともあります。

トンネル方式は逆向きです。ラズパイの中のAgentが、WireCanalの中継サーバーへ外向きに接続します。外からのアクセスは中継サーバーが受け、その確立済みの接続を通ってラズパイに届きます。自宅側に入口を作らないので、ポート開放もルーター設定も要りません。UFWの「受信は原則拒否」もそのままです。

図2 ポートを開けずに公開できる仕組み
図2 ポートを開けずに公開できる仕組み。家からの外向き接続だけで成立する

第2話の「受信を原則拒否する」と今回の「Web公開用の受信ポートを追加しない」は、この仕組みで両立します。

材料

ラズパイ側は前回までの状態そのままです。状態表示の小さなWebサーバー(Python標準ライブラリ製・ポート8080)がsystemdで常駐しています。

WireCanal側はアカウントだけ用意してください。フリープラン(0円・カード登録不要)で今回の手順はすべて試せます。なお、フリーは転送量が月10GB目安で、超過後は減速する場合があります。もうひとつ、フリープランのおまかせサブドメインは、Agentを使っている限り有効ですが、Agentの最終接続から72時間で失効します。長期間止めても同じURLを維持したい場合は、永続URLのあるライト以上が対象です。今回のように常駐で動かし続けるなら、フリーでもURLは維持されます。

手順1: ラズパイにAgentをインストールする

SSHでラズパイに入り、置きたいディレクトリでワンライナーを実行します。

mkdir -p ~/wirecanal && cd ~/wirecanal
curl -fsSL https://download.wirecanal.com/install.sh | sh

実行結果がこれです。CPUアーキテクチャ(ラズパイ5はarm64)は自動判定されます。

WireCanal Agent v.0.18.1 をダウンロードしています...
wirecanal v.0.18.1 powered by Qualiteg Inc. https://qualiteg.com

インストール完了: /home/pi/wirecanal/wirecanal
次の手順:
  1. ダッシュボード(https://app.wirecanal.com)の canal 詳細から wirecanal.json を
     ダウンロードして、wirecanal と同じフォルダに置く
  2. 起動: ./wirecanal -config wirecanal.json

バージョン表示まで自動で確認されて終わります。Agentは単一バイナリで、これ以外に入れるものはありません。

手順2: canalを作る(4ステップのウィザード)

WireCanalでは、公開URLと転送先の組をcanalと呼びます。ダッシュボードの「新しい canal を作成」から、ウィザードで作ります。種類は「HTTP」を選びます。Webサーバーを HTTPS で公開するモードです。

canal作成ウィザード step1 種類選択
canal の種類は HTTP を選ぶ

公開アドレスは「おまかせサブドメイン」にしました。ランダムな名前で今すぐ発行され、全プランで使えます。次の設定画面で、転送先に localhost:8080 を入れます。ラズパイの中でWebサーバーが待っているポートです。メモは任意ですが、あとで一覧を見たときに分かるように書いておくのがおすすめです。

canal作成ウィザード step3 転送先の設定
転送先に localhost:8080 を指定する

確認画面で「作成する」を押すと、公開URLと接続キー(access_key)が発行されます。今回発行されたのは https://5m0kjyxw.ja100.wirecanal.com でした。

canal作成ウィザード step4 確認画面
この内容で作成。公開アドレスはおまかせで発行された

手順3: wirecanal.jsonを置いて起動する

canal詳細画面に、接続ファイル(wirecanal.json)が表示されます。ダウンロードして、ラズパイのAgentと同じフォルダに置きます。画面にはセットアップ手順もLinux用のタブでそのまま出ています。

canal詳細のセットアップ画面(Linuxタブ)
canal 詳細のセットアップ画面。wirecanal.json をダウンロードして置くだけ

この連載はWindowsからのヘッドレス操作なので、ダウンロードしたファイルはscpでラズパイへ送ります(第2話で仕込んだSSH鍵がそのまま使えます)。

# Windows側(PowerShell)
scp "$env:USERPROFILE\Downloads\wirecanal.json" pi@192.168.12.17:/home/pi/wirecanal/

wirecanal.jsonにはcanal専用の接続キー(access_key)が入っています。ラズパイ側で権限を絞ってから起動します。

cd ~/wirecanal
chmod 600 wirecanal.json
./wirecanal -config wirecanal.json
wirecanal v.0.18.1 powered by Qualiteg Inc. https://qualiteg.com
wirecanal: canal t5zd: https://5m0kjyxw.ja100.wirecanal.com へのアクセスをローカルの転送先 localhost:8080 に届けます
wirecanal 0.18.1: connecting tenant=t5zd mode=http forward_target=localhost:8080

この時点でダッシュボードの接続状態が「● 接続中」に変わり、トンネルが開通しています。

ダッシュボードで接続中になった状態
接続状態が「● 接続中」に。転送先 localhost:8080 へのトンネルが開通した

手順4: systemdで常駐させる

手順3の起動は、ターミナルを閉じると止まります。サーバーとして使うので、Webサーバーと同じくsystemdで常駐させます。Linuxセットアップガイドの常駐手順の雛形どおり、/opt/wirecanal に置いて専用ユーザーで動かします。

sudo mkdir -p /opt/wirecanal
sudo cp ~/wirecanal/wirecanal ~/wirecanal/wirecanal.json /opt/wirecanal/

sudo tee /etc/systemd/system/wirecanal.service > /dev/null <<'EOF'
[Unit]
Description=WireCanal Agent
After=network-online.target
Wants=network-online.target

[Service]
User=wirecanal
WorkingDirectory=/opt/wirecanal
ExecStart=/opt/wirecanal/wirecanal -config /opt/wirecanal/wirecanal.json
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo useradd --system --home /opt/wirecanal --shell /usr/sbin/nologin wirecanal
sudo chown -R wirecanal: /opt/wirecanal
sudo chmod 600 /opt/wirecanal/wirecanal.json
sudo systemctl daemon-reload
sudo systemctl enable --now wirecanal
systemctl status wirecanal --no-pager

Restart=always なので、Agentのプロセスが終了した場合は5秒後に自動で再起動します(systemctl stop のような明示的な停止は除きます)。ログは journalctl -u wirecanal -f で追えます。

インターネット側から見てみる

公開URLをブラウザで開きます。

公開URLでラズパイの状態表示ページが表示された画面
公開URLを開くと、ラズパイの状態表示ページがそのまま出た(CPU温度・稼働時間は生きた値)

ラズパイの状態表示ページが、そのまま出ました。CPU温度も稼働時間も生きた値です。curlでの実測はこうでした。

$ curl -s -o /dev/null -w "HTTP %{http_code} / %{time_total}s" https://5m0kjyxw.ja100.wirecanal.com/
HTTP 200 / 0.18s

このときラズパイ側の受信ポートは、第2話のUFW設定(受信は原則拒否・SSHのみLAN限定許可)のままです。8080は外からもLANからも閉じたままで、公開はAgentの外向き接続だけで成立しています。

なお、URLを知っている人は誰でも見られる状態なので、見せたい相手を絞る場合はcanalのアクセス保護(IP制限・認証など)を設定してください。今回は無害な状態表示ページなので、そのまま公開しています。

再起動しても、公開は自動で復活するか

第2話で「設定を入れて確認しただけでは、永続性は保証されない」という教訓を得ました。今回も実際に再起動して検収します。

検収項目実測結果
SSH復帰再起動をかけてから16秒で無人復帰(鍵のみ)
Webサーバー(raspi-web)自動起動
Agent(wirecanal)自動起動
UFW・fail2ban自動起動
IPv6グローバルアドレス0件を維持(第2話の恒久対策が効いている)
公開URLHTTP 200で自動復活

面白かったのは、再起動直後に公開URLへアクセスしたら、ページの稼働時間表示が「0時間0分」だったことです。再起動したばかりの実物が、そのままインターネット側から見えている証拠になりました。

まとめ

3話かけて、ヘッドレスセットアップから堅牢化、そしてWeb公開まで到達しました。ラズパイは、Web公開用の受信ポートを1つも開けないまま、インターネット側から使えるサーバーになりました!

インターネットから使えるということはスマホからも使えますし、ラズパイですので、スマホで外出先から、家庭内機器を操作したり。もちろんLEDチカチカさせたり、カメラをつけて、みたり、とできることは無限大ではないでしょうか。

ということで、このラズパイはこれから、家の中の小さな常設サーバーとして育てていきます。

載せるものが増えたら、また記事にしたいとおもいます。

それでは、また次回お楽しみに!

出典・参考

関連記事

Read more

Raspberry Pi 5を堅牢化する。SSH鍵認証・UFW・fail2banと、再起動でIPv6が復活する罠

Raspberry Pi 5を堅牢化する。SSH鍵認証・UFW・fail2banと、再起動でIPv6が復活する罠

セットアップ直後のRaspberry Pi 5は、パスワード認証が有効なまま、ファイアウォールなし、更新可能なパッケージ172件と無防備です。SSHの鍵認証化・UFW・fail2ban・自動更新・IPv6無効化を実コマンドと実測検収で解説します。sysctlのIPv6無効化が再起動で復活する現象と恒久対策も実機で確認しました。

By Qualiteg プロダクト開発部
LINE Botをローカルで開発する。WebhookのURLが毎回変わる問題を固定URLで解決する

LINE Botをローカルで開発する。WebhookのURLが毎回変わる問題を固定URLで解決する

こんにちは! LINE Botを作ろうとして最初にぶつかる壁は、コードではなくWebhookです。 LINEのMessaging APIは、ユーザーがBotに送ったメッセージを、LINEのサーバーからこちらのサーバーへHTTPSのPOSTで通知してきます。 この受け口(Webhook URL)にはインターネットから届くHTTPSのURLしか指定できず、開発中の http://localhost:5000 をそのまま書くことはできません。 トンネルツールで一時URLを発行して回避する方法が定番ですが、今度は別の問題が待っています。トンネルの方式によっては、起動のたびにランダムなURLが発行されます。その場合、開発を再開するたびにLINE Developersコンソールを開いてWebhook URLを書き換えることになります。コードを直すたび、翌日再開するたび、まずURLの貼り直しから。これが地味に堪えます。 結論から言うと、 ローカルPCの開発サーバーに「変わらない公開URL」を1本付けてしまえば、Webhook URLの設定は最初の1回だけで終わります。 この記事では、L

By Qualiteg プロダクト開発部