onareのBlog

自宅サーバーを安全に公開!Raspberry Pi と Docker で手軽に OpenVPN サーバーを構築する方法

はじめに

自宅でサーバーを運用していると、「外出先から自宅の NAS に保存したファイルにアクセスしたい」「開発中の Web アプリケーションを安全な経路で確認したい」といったニーズが生まれてきますよね。私もその一人で、これまでは都度 SSH トンネルを掘って対応していましたが、もう少しスマートな方法はないかと常々考えていました。

そこで今回は、勉強も兼ねて自宅に VPN (Virtual Private Network) サーバーを構築してみることにしました。

この記事では、省電力でコンパクトな Raspberry Pi 4 と、環境構築が簡単な Docker を利用して、OpenVPN Access Server (OpenVPN AS) を手軽に導入する手順を解説します。同じような構成で自宅サーバーを運用している方の参考になれば幸いです。

今回構築するネットワーク構成

実現したい構成は至ってシンプルです。

  • 外部クライアント(スマートフォンやノート PC) → インターネット → 自宅ルーター(ポートフォワーディング)Raspberry Pi 4(Docker 上の OpenVPN AS)

この VPN 接続が確立されると、あたかも自宅の LAN 内にいるかのように、NAS や他のサーバーに安全にアクセスできるようになります。

構築の前に:前提条件

本格的な作業に入る前に、いくつか準備が必要です。

  • ルーターのポートフォワーディング設定:
    ルーター側で、特定のポートへのアクセスを Raspberry Pi に転送する設定です。以下の 3 つのポートを転送してください。

    • TCP 943: 管理画面やクライアント用 Web UI へのアクセスに使います。
    • TCP 443: VPN 接続そのものに使われるポートの一つです。(他のサービスで利用している場合は変更も可能です)
    • UDP 1194: こちらも VPN 接続で使われる主要なポートです。
  • DDNS (Dynamic DNS) の設定:
    自宅のインターネット環境は、プロバイダから動的に IP アドレスが割り当てられることがほとんどです。DDNS は、この変動する IP アドレスに対して固定のドメイン名(例: my-home.ddns.net)を紐づけてくれるサービスです。これにより、IP アドレスが変わっても常に同じドメイン名で自宅サーバーにアクセスできます。

  • OS のアップデートとファイアウォール設定:

    • Raspberry Pi OS は、作業前に最新の状態にしておきましょう。
    • ファイアウォール (ufw など) を有効にし、必要なポート以外は閉じておくことを強く推奨します。ufw は Uncomplicated Firewall の略で、比較的簡単にファイアウォールのルールを設定できるツールです。

Docker で OpenVPN AS をインストールする手順

準備が整ったら、いよいよ OpenVPN AS をインストールしていきます。

1. Docker と Docker Compose のインストール

まずは、コンテナを動かすための土台となる Docker と、複数のコンテナ構成を管理しやすくする Docker Compose をインストールします。

# パッケージリストを更新し、システムを最新の状態にします
sudo apt update && sudo apt upgrade -y

# Docker の公式サイトが提供する便利なスクリプトを使って Docker をインストールします
curl -fsSL https://get.docker.com | sh

# Docker Compose をインストールします
sudo apt install docker-compose -y

2. 作業ディレクトリの作成

設定ファイルを管理しやすくするために、専用のディレクトリを作成して移動します。

mkdir ~/openvpn-as && cd ~/openvpn-as

3. docker-compose.yml の作成

docker-compose.yml というファイルに、どのような設定で OpenVPN AS のコンテナを起動するかを記述します。

services:
  openvpn-as:
    # 公式の OpenVPN AS イメージを指定
    image: openvpn/openvpn-as
    container_name: openvpn-as
    # コンテナにネットワーク管理関連の権限を付与
    cap_add:
      - NET_ADMIN
      - MKNOD
    # VPN に必要なデバイスをコンテナにマウント
    devices:
      - /dev/net/tun
    # コンテナが停止した場合、自動的に再起動する
    restart: unless-stopped
    # ホスト(ラズパイ)とコンテナのポートを接続
    ports:
      - "943:943" # 管理画面・Web UI
      - "443:443" # VPN 接続 (TCP)
      - "1194:1194/udp" # VPN 接続 (UDP)
    # 設定ファイルやログを永続化するためにホストのディレクトリをマウント
    volumes:
      - ./data:/openvpn
    # タイムゾーンやネットワークインターフェースなどの環境変数を設定
    environment:
      - TZ=Asia/Tokyo
      - INTERFACE=eth0

4. OpenVPN AS の起動

docker-compose.yml が作成できたら、以下のコマンドでコンテナを起動します。-d オプションはバックグラウンドで起動するという意味です。

sudo docker-compose up -d

OpenVPN AS の初期設定

コンテナが起動したら、Web ブラウザから管理画面にアクセスして初期設定を行います。

  1. 管理画面へのアクセス:
    ブラウザで https://<ラズパイのIPアドレス>:943/admin を開きます。自己署名証明書のため、ブラウザに警告が表示されますが、そのまま進んでください。

  2. 初回ログイン:
    デフォルトの管理ユーザーは openvpn です。初回パスワードはコンテナのログに出力されているので、以下のコマンドで確認し、コピーしてログインします。

    # ログの中からパスワードが記載されている行を抽出します
    sudo docker logs openvpn-as | grep "Auto-generated pass"
    

    ログイン後、速やかにこのパスワードは変更しておきましょう。

  3. VPN ユーザーの作成:
    管理画面の User Management > User Permissions で、VPN を利用する新しいユーザーを作成します。

  4. ネットワーク設定の更新:
    Configuration > Network Settings を開き、Hostname or IP Address の項目に、前提条件で設定した DDNS のドメイン名 を入力して保存します。これにより、クライアント用の設定ファイルに正しい接続先アドレスが埋め込まれます。

  5. ルーティング設定の更新:
    Configuration > VPN Settings を開きます。Routing のセクションにある Specify the private subnets to which all clients should be given access (one per line): の項目に、自宅のサブネットマスク を設定します。
    例えば、自宅のネットワークが 192.168.1.X であれば 192.168.1.0/24 のように指定します。これにより、VPN 経由で自宅の LAN 全体にアクセスできるようになります。

  6. クライアント用プロファイルのダウンロード:
    設定は以上です。VPN を利用するクライアント(PC やスマートフォン)は、https://<DDNSのドメイン名>:943 にアクセスし、作成したユーザーでログインすると、接続用のプロファイル(.ovpn ファイル)やクライアントアプリをダウンロードできます。

よりセキュアにするための設定

デフォルトの状態でも利用できますが、セキュリティを向上させるための設定をいくつか紹介します。

  • Let's Encrypt で SSL 証明書を導入する:
    ブラウザの警告をなくし、通信をより安全にするために、信頼された SSL 証明書を導入することを強く推奨します。Nginx などのリバースプロキシを前段に設置し、そこで SSL 証明書を管理する方法が一般的です。

  • ファイアウォールの再確認:
    ufw などのファイアウォールで、OpenVPN に必要なポート (943, 443, 1194) 以外が外部に公開されていないか、再度確認しましょう。

動作確認

設定が完了したら、実際に外部のネットワークから接続できるか試してみましょう。

  • スマートフォンの Wi-Fi をオフにし、モバイルデータ通信経由で VPN 接続を試します。
  • 接続後、ping 192.168.1.1 のように自宅 LAN 内のデバイスに ping が通るか確認します。
  • ブラウザから、自宅の NAS や Web サーバーの管理画面にアクセスできるか確認します。

運用とメンテナンス

一度構築したら終わりではなく、安定して運用するためのメンテナンスも重要です。

  • 定期的なコンテナイメージの更新:
    以下のコマンドで、OpenVPN AS のイメージを最新版に更新できます。セキュリティの観点からも、定期的に実行しましょう。

    sudo docker-compose pull && sudo docker-compose up -d
    
  • 設定ファイルのバックアップ:
    docker-compose.ymlvolumes に指定した data ディレクトリに、すべての設定が保存されています。このディレクトリを丸ごとバックアップしておけば、万が一の時もすぐに復元できます。
    こちらの記事で rclone を使った定期的なバックアップ方法を解説しているので、よろしければ参考にしてください。

  • ログの監視:
    sudo docker logs openvpn-as でコンテナのログを確認できます。不審なアクセスがないか、時々チェックする習慣をつけると良いでしょう。

まとめ

この記事では、Raspberry Pi と Docker を利用して、手軽に自宅 VPN サーバーを構築する手順を解説しました。

実際に構築してみて、Docker のおかげでホスト OS を汚すことなく、非常に簡単かつクリーンに環境を立ち上げられる点に大きなメリットを感じました。設定も docker-compose.ymldata ディレクトリに集約されるため、管理や移行が非常に楽です。

外出先から自宅のリソースに安全にアクセスできる環境は、一度作ってしまうと手放せないほど便利です。ぜひ、この記事を参考にご自身の "最強の自宅サーバー" を構築してみてください!

関連記事