14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

マンション共有回線でも諦めない!Tailscaleで自宅IoT環境を構築した話

14
Last updated at Posted at 2025-12-14

はじめに

この記事は DENSO アドベントカレンダー 2025 の14日目の記事です。

この記事は、マンション共有回線などでVPN構築に困っている方、自宅IoT環境を整えたい方向けです。

電子工作が趣味で、日常のちょっとした不便を解決するIoTデバイスをESP32で作っています。

例えば以下のようなものを作っています。

  • 猫の餌やり記録デバイス: 餌の蓋が開くと自動で記録され、餌のやり忘れや二重給餌を防止

  • 3Dプリンター監視システム: 印刷の様子をストリーミング&タイムラプス動画を作成できる

    餌やり記録デバイス うちの猫、よく餌をくれと鳴く

便利に使っているのですが、ローカルネットワーク内で動かすことしか考えていなかったため、いくつか不満が出てきました。

  • データやログが保存・活用できていない
  • 外出先から3Dプリンターの様子を確認できない
  • デバイス同士の連携がやりづらい

そこで、自宅のサーバーやIoTデバイスに対して、外出先からも安全にアクセスできる環境が欲しくなりました。

やりたいこと

  • Raspberry PiやIoT端末に外出先からも安全にアクセスしたい
  • ただし、サーバーを直接インターネットに公開するのは怖い
  • スマホやESP32からも簡単に接続できるようにしたい

サーバーを直接公開せずに外部からアクセスする方法として、VPNを使うことにしました。
早速、自宅でVPN環境を構築してみることにしました。

最初の挑戦:ルーターのVPN機能

メインで使っているルーターを確認したところ、OpenVPNサーバー機能が搭載されていました。
「これを使えば簡単にVPN環境が作れる!」
早速設定してみました。

  1. ルーターの管理画面でOpenVPNサーバーを有効化
  2. 証明書ファイルをエクスポート
  3. スマホにOpenVPNクライアントをインストール
  4. 外のネットワークから接続テスト

結果:つながらない

何度試しても、外のネットワークからVPNに接続できませんでした。
設定を見直しても原因がわからず、AIとトラブルシューティングを行ったところ、問題が判明しました。

原因:マンション共有回線の壁

まず、自分のグローバルIPを確認しました。

  1. ブラウザで https://ifconfig.me にアクセス
  2. ルーターの管理画面でWAN側IPを確認

すると、ルーターのWAN側IPがプライベートIPアドレス(192.168.x.x)になっていることがわかりました。

二重NAT環境だったことが判明

私の住んでいるマンションは、インターネット回線を共有契約しています。そのため、各部屋にはプライベートIPしか割り当てられません。

つまり:

  • ポート開放ができない:上位ルーターの管理権限がない
  • グローバルIPがない:外部から直接アクセスする手段がない
  • ルーターのVPN機能が使えない:外部から自宅ルーターに到達できない

せっかくルーターにVPNサーバー機能があっても、二重NAT環境では意味がありませんでした。

インターネット
     |
[マンション共有ルーター] ← グローバルIPはここ
     |
   192.168.x.x(プライベートIP)
     |
[自宅ルーター] ← ここにはグローバルIPが来ない
     |
[Raspberry Pi / ESP32]

Tailscaleとの出会い

インターネットの契約を変えたり、専用回線を引くことは避けたかったので、他の方法を探しました。

調べていくうちに、Tailscaleというサービスを見つけました。公式サイトを見てみると、まさに私が求めていたものでした。

Tailscaleとは

WireGuardベースのVPNサービスで、最大の特徴はNAT越えを自動で行ってくれること。

  • ポート開放が不要
  • 二重NAT環境でも動作
  • 設定が簡単
  • 無料枠で100台まで接続可能(個人利用には十分)

なぜ二重NAT環境でも動くのか

Tailscaleは**DERP(Designated Encrypted Relay for Packets)**という中継サーバーを使用します。

[Raspberry Pi] ----> [Tailscale DERP] <---- [外出先のスマホ]
      ↑                    ↑                      ↑
  内側から外へ         クラウド上の中継        内側から外へ

両方のデバイスが「内側から外へ」接続するため、NAT環境でも問題なく通信できます。

詳しい仕組みは理解しきれていませんが、「これなら動きそう」と思い、実際に試してみることにしました。

【2025/12/20 追記】UDPホールパンチングについて

コメントでご指摘いただき、改めて調べてみました。

上の図ではすべての通信がDERPサーバーを経由するように見えますが、実際にはUDPホールパンチングという技術でP2P接続を確立し、デバイス同士が直接通信します。

P2P接続確立の流れ:

  1. 両方のデバイスがTailscaleのサーバーに「内側から外へ」接続
  2. サーバーが仲介役となり、お互いのNAT情報(外部IP・ポート)を交換
  3. その情報を使って、NAT越えのP2P通信を確立
[Raspberry Pi] <======= P2P通信 =======> [外出先のスマホ]
                 (直接通信・低遅延)

DERPサーバーは主に接続確立時の仲介役であり、UDPホールパンチングが失敗した場合のみフォールバックとして実際の中継を行います。

コメントありがとうございました!

実際に構築してみた

使用環境

項目 内容
サーバー Raspberry Pi 4
サーバーOS Raspberry Pi OS
IoTデバイス ESP32
クライアント Windows / macOS / iOS / Android

1. Tailscaleのアカウント作成

まず、Tailscale公式サイトでアカウントを作成します。

  1. 「Get Started」をクリック
  2. Google、Microsoft、GitHubなどのアカウントでサインアップ
  3. ダッシュボードが表示されれば完了

アカウント作成は無料です。

2. Tailscaleのインストール

Raspberry Piで以下を実行します。

curl -fsSL https://tailscale.com/install.sh | sudo sh

インストール後、認証を行います。

sudo tailscale up

表示されたURLにブラウザでアクセスし、Googleアカウントなどで認証を完了させます。

ヘッドレス環境の場合
ブラウザがない環境では、事前に管理画面でAuth Keyを生成しておくと、以下のコマンドで認証できます。

sudo tailscale up --authkey=tskey-auth-xxxxx

3. ファイアウォール設定(UFW)

セキュリティのため、Tailscaleネットワークからのみアクセスを許可します。

# UFWのインストール
sudo apt update
sudo apt install -y ufw

# Tailscaleネットワーク(100.64.0.0/10)からのみ許可
sudo ufw allow from 100.64.0.0/10 to any port 22    # SSH

# Webサーバーを使う場合(例:ポート3000)
sudo ufw allow from 100.64.0.0/10 to any port 3000

# ファイアウォールを有効化
sudo ufw enable

注意: UFWを有効化する前に、必要なポートの許可ルールを追加してください。後から追加し忘れると、Tailscale経由の通信がブロックされます。

4. クライアント側の設定

各クライアントにTailscaleをインストールし、同じアカウントでログインします。

5. 動作確認

TailscaleのIPアドレスを確認します。

tailscale ip -4
# 例: 100.100.100.100

外出先からSSH接続してみます。

ssh user@100.100.100.100

無事に接続できました!

ハマったポイント

再起動時の自動起動

Raspberry Piを再起動した際にTailscaleが自動で起動するよう、以下を確認しておくと安心です。

sudo systemctl enable tailscaled

DNS設定のミス

Tailscale導入後、外部のインターネット(GoogleやYahooなど)に接続できなくなることがありました。

原因はTailscaleのDNS設定でした。以下の手順で解決できます。

  1. Tailscale管理画面にアクセス
  2. 「DNS」タブを開く
  3. 「Override local DNS」がオンになっている場合:
    • オフにする、または
    • 「Add nameserver」でパブリックDNS(例:8.8.8.81.1.1.1)を追加

設定変更後、デバイス側でTailscaleを再接続すると反映されます。

使ってみての感想

非常に満足しています。

二重NAT環境という制約の中で、ここまで簡単にVPN環境を構築できるとは思いませんでした。

現在の活用方法

  • ファイルサーバー: SambaをインストールしてNASとして利用。スマホで外出先からファイルにアクセスできる
  • Webアプリサーバー: Raspberry Pi上で動かしているWebアプリに、外部から安全に接続

インターネットに直接公開せず、Tailscaleネットワーク経由でのみアクセスできるので、セキュリティ面でも安心です。

良かった点

  • 設定が本当に簡単(数分で完了)
  • 安定して動作する
  • 無料枠で十分実用できる
  • 部屋ごとに異なるWiFiルーターを使っていても、Tailscale経由で統一的にアクセスできる

未解決の課題

スマホで常にTailscaleを有効にしていると、一部のアプリが正常に動作しなくなることがあります。

必要なときだけTailscaleを有効にする運用でカバーしていますが、根本的な解決方法は見つかっていません。同じ問題に遭遇した方がいれば、ぜひ教えてください。

今後の展望

Tailscaleで安全なネットワーク環境が構築できたので、様々な自作デバイスを連携させたり、ログを貯め、解析することでさらなる利便性を追求したいと考えています。

まとめ

マンション共有回線の二重NAT環境で、ルーターのVPN機能が使えず困っていましたが、Tailscaleのおかげで解決できました。

  • ポート開放なしでVPN環境を構築
  • 二重NAT環境でも問題なく動作
  • 設定が簡単で、すぐに使い始められる

同じ環境で困っている方、IoTデバイスのネットワーク環境を整えたい方の参考になれば幸いです。

参考リンク

14
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?