メインコンテンツへスキップ

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を安全に使いたい方の参考になれば幸いです!


    参考リンク

     
     

    nagii

     
     
    ゲームクライアントエンジニア 日々隙間時間で実践したことなど、備忘録的に発信予定 ここ最近のこと ・スキルアップのため、絶賛バックエンド・サーバーサイド勉強中 ・Claude Codeにハマり活用を模索中

    あなたへのおすすめ