Raspberry Piを安全に外部接続する方法|WireGuardで挫折してTailscaleに辿り着いた話
はじめに
Raspberry Piをインターネット経由で外からアクセスできるようにしたい。そう思ったことはありませんか?
ただ、何も考えずに外部公開すると非常に危険です。インターネットに接続した瞬間から、世界中のボットが自動的にスキャンを始め、SSHへのログイン試行が1日数千〜数万回来ることも珍しくありません。
この記事では、実際につまずきながらも安全なRaspberry Piの外部接続環境を構築した体験をまとめます。

なぜセキュリティが必要なのか?
まず「攻撃なんて自分には関係ない」と思っている方に現実をお伝えします。
インターネットに公開したサーバーへの
最初のスキャンは数分以内に来る
攻撃者はランダムにIPをスキャンし、SSHポートが開いていると自動でパスワードを総当たりします。これは特定の誰かを狙っているのではなく、全自動で行われています。
MacなどのPCが比較的安全なのは「ルーターのNATが壁になっているから」です。Raspberry Piを外部公開するということは、その壁をなくすことを意味します。

まずセキュリティチェックから始めよう
設定を変更する前に、現在の状態を確認しましょう。以下のコマンドを一発で実行できます。
echo "=== SSH設定 ===" && \
sudo sshd -T | grep -E "passwordauthentication|permitrootlogin|pubkeyauthentication" && \
echo "=== ファイアウォール ===" && \
sudo ufw status verbose && \
echo "=== 開放ポート ===" && \
sudo ss -tlnpu
チェックポイント
項目安全な状態PasswordAuthenticationnoPermitRootLoginnoPubkeyAuthenticationyesUFWactive
SSH強化:パスワード認証を無効にする
デフォルトではパスワードでSSHログインできる状態になっています。これを公開鍵認証のみに変更します。
⚠️ 必ず公開鍵認証で入れることを確認してから行うこと!失敗すると締め出される可能性があります。
sudo nano /etc/ssh/sshd_config
以下を変更します。
PasswordAuthentication no
PermitRootLogin no
sudo systemctl restart ssh
2段階認証との組み合わせ
1Passwordなどで2段階認証を設定している場合、UsePAM yesの設定が必要です。
UsePAM yes # 2段階認証に必要
KbdInteractiveAuthentication no # 認証方式に応じて設定
SSH鍵認証 + 2段階認証の組み合わせは非常に強固です。
UFW(ファイアウォール)の設定
必要なポート以外はすべて閉じます。基本方針は「全部閉じて必要なものだけ開ける」です。
# デフォルト設定
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 必要なポートのみ開ける
sudo ufw allow 22 # SSH(後でVPN経由のみに制限)
sudo ufw enable
sudo ufw status verbose
WireGuardに挑戦→つまずいた話
最初はWireGuardでVPN環境を構築しようとしました。
WireGuardとは
WireGuardは無料・オープンソースのVPNプロトコルです。NordVPNなどの商用VPNサービスも採用しているほど信頼性が高く、非常に高速です。

インストールと鍵生成
sudo apt install wireguard -y
# 鍵の生成
wg genkey | sudo tee /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
sudo chmod 600 /etc/wireguard/private.key
設定ファイル(Pi側)
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <Piの秘密鍵>
[Peer]
PublicKey = <Macの公開鍵>
AllowedIPs = 10.0.0.2/32
つまずいたポイント😅
WireGuardの設定で一番ハマったのが鍵の不一致でした。
症状:
pingがタイムアウトし続ける
wg showでhandshakeが表示されない
原因:
WireGuardアプリの秘密鍵と
生成した鍵ファイルが別物だった!
App Store版のWireGuardは独自に鍵を管理するため、ターミナルで生成した鍵と別になっていました。WireGuardアプリの設定画面でPrivateKeyを直接確認して一致させることが重要です。
最終的にはLAN内でのpingも通り、SSH接続も成功しました。しかし外部接続のためにはDDNSやポート転送など、まだ多くの設定が必要でした。
Tailscaleへ移行→圧倒的に簡単だった
WireGuardで苦労した後、Tailscaleを試したところ設定の手軽さに驚きました。
TailscaleとWireGuardの比較
WireGuardTailscale鍵の管理自分で管理自動IP管理自分で設定自動(100.x.x.x)ポート転送必要不要DDNS必要不要料金無料個人無料難易度高め非常に簡単
裏側はWireGuardと同じ技術を使っているので、セキュリティレベルは同等です。
Tailscaleのインストール手順
① アカウント作成
https://tailscale.com にアクセスしてGitHubアカウントでログインするだけです。
📷 【画像】Tailscaleのログイン画面
② Pi側のインストール
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
表示されたURLをブラウザで開いてGitHubアカウントで認証するだけです。
③ Mac側のインストール
App StoreからTailscaleをインストールして同じアカウントでログイン。VPN構成の追加許可を求められたら「許可」をクリック。
接続確認
# PiのTailscale IPを確認
tailscale ip
# → 100.xxx.xxx.xxx
# MacからPing
ping 100.xxx.xxx.xxx
# SSH接続
ssh ユーザー名@100.xxx.xxx.xxx
テザリング(外部回線)からでもそのまま接続できました!
ポート転送もDDNSも一切不要。これには本当に驚きました。
最終的なセキュリティ構成
外部からの接続
✅ Tailscale VPN経由のみ
✅ SSH鍵認証 + 2段階認証
✅ rootログイン禁止
内部のセキュリティ
✅ UFWで不要ポートを閉鎖
✅ OS自動アップデート
✅ GitHub Webhook署名検証済み
緊急時の保険
✅ LAN内からの直接SSH接続
定期メンテナンス用コマンド集
設定後も定期的に以下のコマンドで状態を確認することをお勧めします。
# 不審なログイン履歴
last -a | head -20
sudo lastb | head -20
# 外部への不審な通信
sudo ss -tnpu | grep ESTAB
# 知らないユーザーが追加されていないか
cat /etc/passwd | grep -v nologin | grep -v false
# rootkitチェック
sudo apt install chkrootkit -y && sudo chkrootkit
まとめ
やったこと効果SSH鍵認証のみに変更パスワード総当たり攻撃を無効化UFW設定不要なポートを全閉鎖Tailscale導入外部からの安全なアクセスOS自動アップデート既知の脆弱性を自動修正
最初はWireGuardで苦労しましたが、最終的にTailscaleで非常にシンプルで強固な構成が完成しました。
特に個人用途であればTailscaleが圧倒的におすすめです。インストールとログインだけで外部接続が完成するのは本当に感動的でした。
Raspberry Piを安全に使いたい方の参考になれば幸いです!