Raspberry Pi 5のWebサーバーをインターネットに公開する。ポートは開けない、WireCanalのトンネルで
受信ポートを閉じたまま、Raspberry Pi 5のWebサーバーをインターネットに公開します。WireCanalのAgentをワンライナーで入れ、canalを作り、systemdで常駐化。ポート開放もルーター設定も不要で、操作はおよそ5分。再起動後の自動復活まで実測で検収しました。
こんにちは!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日時点の実測値です。

ポートを開けずに、どうやって公開するのか
普通、自宅のサーバーを公開しようとすると、ルーターのポート開放(ポートフォワーディング)が要ります。ただ、これは外からの入口を自宅に作る行為なので、第2話でせっかく受信を固めたのに、今度はルーターに穴を開けるのかという話になります。さらに、グローバルIPが変動する環境で同じ名前から継続的にアクセスしたいなら、DDNSなどの仕組みも必要になります。集合住宅の回線だと、そもそもポート開放ができないこともあります。
トンネル方式は逆向きです。ラズパイの中のAgentが、WireCanalの中継サーバーへ外向きに接続します。外からのアクセスは中継サーバーが受け、その確立済みの接続を通ってラズパイに届きます。自宅側に入口を作らないので、ポート開放もルーター設定も要りません。UFWの「受信は原則拒否」もそのままです。

第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 で公開するモードです。

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

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

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

この連載は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.jsonwirecanal 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この時点でダッシュボードの接続状態が「● 接続中」に変わり、トンネルが開通しています。

手順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-pagerRestart=always なので、Agentのプロセスが終了した場合は5秒後に自動で再起動します(systemctl stop のような明示的な停止は除きます)。ログは journalctl -u wirecanal -f で追えます。
インターネット側から見てみる
公開URLをブラウザで開きます。

ラズパイの状態表示ページが、そのまま出ました。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話の恒久対策が効いている) |
| 公開URL | HTTP 200で自動復活 |
面白かったのは、再起動直後に公開URLへアクセスしたら、ページの稼働時間表示が「0時間0分」だったことです。再起動したばかりの実物が、そのままインターネット側から見えている証拠になりました。
まとめ
3話かけて、ヘッドレスセットアップから堅牢化、そしてWeb公開まで到達しました。ラズパイは、Web公開用の受信ポートを1つも開けないまま、インターネット側から使えるサーバーになりました!
インターネットから使えるということはスマホからも使えますし、ラズパイですので、スマホで外出先から、家庭内機器を操作したり。もちろんLEDチカチカさせたり、カメラをつけて、みたり、とできることは無限大ではないでしょうか。
ということで、このラズパイはこれから、家の中の小さな常設サーバーとして育てていきます。
載せるものが増えたら、また記事にしたいとおもいます。
それでは、また次回お楽しみに!