VPNとは何か?
VPN(Virtual Private Network、仮想プライベートネットワーク)は、インターネット上での通信を暗号化し、プライバシーを保護するための技術です。通常、インターネットを利用する際には、あなたのデータは公開されたネットワークを通過しますが、VPNを使用することで、あたかもプライベートネットワークを使っているかのように通信が保護されます。
VPNの主な目的
- プライバシー保護: VPNを使用すると、インターネット上での活動が第三者に見られるリスクが減ります。たとえば、カフェなどの公共Wi-Fiを利用している場合でも、VPNがあれば安全にインターネットを使うことができます。
- 地域制限の回避: 一部のWebサービスやコンテンツは、特定の地域でしか利用できない場合があります。VPNを使うことで、他の地域からでもこれらのサービスにアクセスできることがあります。
- セキュリティ強化: 企業や組織は、リモートで働く従業員が安全に社内ネットワークにアクセスできるよう、VPNを利用することがあります。これにより、重要なデータが安全に保護されます。
+-----------------+ +--------------------+
| Your Device | ---- Internet (Public) ----| VPN Server |
| (PC, Smartphone)| | (Google Cloud, etc.)|
+-----------------+ +--------------------+
| |
| |
Public Wi-Fi Encrypted
Network Tunnel
| |
v v
+-----------------------------------------------------------+
| Internet (Secure) |
| Your data is protected and private |
+-----------------------------------------------------------+
この図では、左側に読者のデバイス(PCやスマートフォン)があり、公衆Wi-Fiネットワークを介してインターネットに接続していますが、VPNを使用することで、その通信がVPNサーバーを経由して暗号化され、安全に保たれる様子を表現しています。
VPNを様々な環境で立ち上げる
今回紹介する方法は、Google Cloudだけでなく、以下のような他の環境でも使用することができます。
- WSL (Windows Subsystem for Linux): Windows上でLinuxを実行するための機能です。DockerをWSL上にインストールすることで、Windowsマシン上でも同じ手順でVPNサーバーを構築できます。
- 実機のLinux: UbuntuやCentOSなど、直接インストールされたLinux環境でも、この手順を使用してVPNサーバーを立ち上げることが可能です。
Dockerを使用してVPN Serverを立ち上げる手順(間違いの紹介)
ここでは、Dockerを使ってSoftEther VPNサーバーを立ち上げる手順を説明します。最初に、一般的な方法でセットアップを進めますが、後ほどこの手順に含まれるミスについて解説し、修正方法を紹介します。
使用する環境について
今回の設定は、Google Cloudの無料プランのインスタンスを利用して行います。具体的には、e2-micro
プランで、インストールするOSはUbuntu
です。Google Cloud以外の環境、例えばWSLや実機のLinuxでも同様の手順で進めることが可能です。
VPN ServerのDockerイメージ
SoftEther VPNを簡単にインストールするために、Dockerイメージを使用します。Docker Hubにはさまざまなイメージが公開されていますが、今回は以下のGitHubリポジトリにリンクされているイメージを使用します。
コマンドの実行
まずは、以下のコマンドを実行して、VPNサーバーをDockerで起動します。このコマンドでは、ポート番号5555
を使用するように設定しています。
docker run -d --name vpn --cap-add NET_ADMIN -p 5555:5555/tcp siomiz/softethervpn
-d
: コンテナをバックグラウンドで実行します。--name vpn
: このコンテナに「vpn」という名前を付けます。--cap-add NET_ADMIN
: ネットワーク管理権限をコンテナに追加します。-p 5555:5555/tcp
: ホストのポート5555
をコンテナのポート5555
にマッピングします。
注意点
上記のコマンドを実行した後、docker ps
コマンドを使用して実行中のコンテナを確認します。この時、設定していないポート番号が表示されることがありますが、ホストには影響しないため、気にしないことにします。
ファイアウォールの設定について
VPNサーバーを正しく動作させるために、Ubuntu自体のファイアウォール設定を確認する必要があります。もしファイアウォールが有効になっている場合は、VPNで使用するポート5555
を開放するか、必要に応じて一時的にファイアウォールを無効にしておく必要があります。
具体的には、以下のコマンドを使用して、ファイアウォールが有効かどうかを確認し、必要な場合はポートを開放します。
sudo ufw status
ファイアウォールが有効になっている場合、ポート5555
を開放するために以下のコマンドを実行します。
sudo ufw allow 5555/tcp
もしファイアウォールを一時的に無効にしたい場合は、以下のコマンドを使用します。
sudo ufw disable
これで、VPNサーバーが適切に動作し、外部からの接続が許可されます。
コンテナの確認と接続設定
以前、VPN ServerをDocker無しで設定した際に、Ubuntuで接続に失敗した経験があります。そのため、今回も念のためコンテナ内のOSを確認してみます。
docker exec -it vpn bash
コンテナに入ってみると、apt
は使用できず、代わりにyum
やdnf
が使えることがわかりました。これは、VPN ServerがUbuntuではなく、Red Hat系のOS上で動作しているためです。調査によると、Ubuntuにはネットワーク関連のバグがあるため、公式には他のOSが推奨されています。
Windowsでの管理ツールの使用
コンテナが正常に起動したので、次に接続設定を行います。Linux上での設定が難しい場合、自宅のWindowsにSoftEtherの管理ツールをインストールして設定を進める方法もあります。これは公式のドキュメントには記載されていませんが、以前私が設定した際に使用した方法です。
以下の公式サイトから、SoftEther VPN Manager for Windowsをダウンロードします。
ダウンロードしたファイルを実行し、インストールする際に「サーバー管理マネージャ」を選択します。これで、VPNサーバーの設定が簡単になります。
追加情報としてのアップデート
この記事は2022年に最初に投稿したものですが、今回の記事更新にあたっていくつか新しい情報がわかりました。
まず、コンテナ内のディストリビューションを再確認したところ、現在ではAlpine Linuxが使用されていることが判明しました。これは重要な変更点であり、コンテナがより軽量で効率的になっていることを示しています。
さらに、公式のSoftEtherでは推奨するオペレーティングシステムがUbuntu 22.04に更新されていました。これは、以前のネットワーク関連のバグは解消された可能性があることを示しています。
ファイアウォール設定とサーバー管理マネージャの設定
SoftEther VPNサーバーのインストールが完了したら、次にGoogle CloudのVPCネットワークにおけるファイアウォール設定を確認する必要があります。ここで、ポート番号5555
のトラフィックを許可する設定を行います。
重要: この設定を行わないと、外部からの接続がブロックされ、VPNサーバーが正しく動作しません。
スクリーンショットでの手順説明
スクリーンショットを参考に、Google CloudのVPCネットワークの設定画面に移動し、ポート5555
を許可する手順を確認してください。
ログの確認とトラブルシューティング
接続に失敗した場合は、次にGitHubのドキュメントに従い、コンテナのログを確認します。ログには、接続に必要なユーザー名とパスワードが表示されている可能性があります。以下のコマンドを使用してログを確認します。
docker logs vpn
この手順により、接続に失敗した場合でも原因を特定し、適切な対策を取ることができます。
ログの確認と管理者パスワードの問題
VPNサーバーに接続しようとした際、ユーザー名とパスワードがログに表示されることがあります。上のスクリーンショットにあるように、確かにユーザー名とパスワードが表示されていますが、これらはVPNに接続するためのものであり、サーバー管理ツールで使用する管理者パスワードとは異なります。
重要: 管理者パスワードが不明な場合、サーバー管理ツールにログインできません。そのため、Dockerの設定時にこのパスワードを明示的に設定する必要があります。
Dockerコンテナの再設定
管理者パスワードを設定するためには、まず現在のVPNコンテナを停止して削除する必要があります。以下のコマンドを実行して、コンテナを停止し、削除します。
docker stop vpn
docker rm vpn
上のコマンドで、コンテナが完全に停止し、再度設定し直す準備が整います。
管理者パスワードの設定と再接続
先ほどの問題を解決するために、今回は管理者パスワードをDockerコマンドで設定してからVPNサーバーを起動します。これにより、サーバー管理ツールでのログインが可能になります。
以下のコマンドを実行して、管理者パスワードを設定しながらVPNコンテナを再作成します。
docker run \
--name vpn \
--cap-add NET_ADMIN \
-p 5555:5555/tcp \
-e SPW=test \
-e HPW=test \
-d siomiz/softethervpn
-e SPW=test
:SPW
はサーバーパスワードを設定するオプションで、ここでtest
というパスワードを設定しています。これがサーバー管理ツールで使用するパスワードとなります。-e HPW=test
:HPW
はハブパスワードを設定するオプションで、こちらもtest
というパスワードを設定します。
これで管理者パスワードが設定され、コンテナが再び起動します。
サーバー管理ツールでの再接続
次に、サーバー管理マネージャを使用して再度接続を試みます。先ほど設定したパスワード(test
)を使用して接続を行います。今回は問題なく接続することができました。
不要な機能の無効化
VPNサーバーへの接続が成功した後、次に行うべきステップは、使用しない機能を無効にすることです。今回は、セキュリティとパフォーマンスを考慮し、docker run
コマンドで指定したポート5555
以外のポートや不要な機能を無効にします。
サーバー機能の無効化
VPNサーバーにはさまざまな機能が組み込まれていますが、すべての機能が必要なわけではありません。以下の手順で、不要なサーバー機能を無効にします。
- 管理ツールを開く: SoftEther VPN Server Managerを開き、接続します。
- サーバー機能設定の確認: メニューから「サーバー機能の設定」を選択します。
- 無効にする機能の選択:
IPsec/L2TP
、EtherIP
、L2TPv3
など、今回の環境では使用しない機能について、それぞれのチェックを外します。
スマートフォンでの接続を考慮した設定
もしスマートフォンや他のデバイスを使用して接続する場合は、使用するポートや機能を適切に調整する必要があります。その場合、接続に必要な機能やポートは無効にせず、設定を読み替えて進めてください。
不要な機能の無効化と機能の説明
接続が成功した後、使用しない機能を無効にして、VPNサーバーをより安全かつ効率的に運用することが重要です。ここでは、いくつかの主要な機能について、その役割を説明しつつ、無効にする理由を解説します。
ダイナミックDNS機能
ダイナミックDNSは、サーバーに特定のドメイン名を割り当てる機能です。この機能を使うと、サーバーのIPアドレスが変わっても、常に同じドメイン名でアクセスできるようになります。例えば、インターネット接続のたびにIPアドレスが変わる環境でも、一定のドメイン名を使用してアクセスすることが可能になります。
しかし、今回の設定では固定IPアドレスを使用するため、ダイナミックDNS機能は必要ありません。セキュリティを強化するためにこの機能を無効にします。
OpenVPNとMS-SSTP
OpenVPNやMS-SSTPは、VPN接続を確立するためのプロトコルです。これらのプロトコルを使用すると、多様な環境やデバイスでVPN接続が可能になります。
ただし、今回は特定のポート5555
のみを使用し、他のプロトコルは使用しない設定を選びました。そのため、これらのプロトコルも無効にしておきます。
VPN Azure
VPN Azureは、SoftEther VPNが提供するクラウド経由での接続を可能にする機能です。これにより、NATやファイアウォールを越えてVPN接続を確立することができます。
ただし、VPN Azureは外部のクラウドサービスを利用するため、プライバシーやセキュリティに配慮が必要です。今回はVPN Azureを使用せず、サーバーを直接管理する設定とするため、この機能も無効にします。
VPN接続用ユーザーの作成
次に、VPN接続用のユーザーを作成します。仮想HUBの管理からユーザー管理の設定を行いますが、ここでは手順を詳しく説明します。
- 仮想HUBの管理を開く: SoftEther VPN Server Managerを使用して、仮想HUBの管理画面を開きます。
- 既存ユーザーの確認と削除: 初期設定では、既に1つのユーザーが作成されています。このユーザーは、
docker logs vpn
コマンドで表示された一般ユーザーである可能性があります。セキュリティ上、デフォルトで作成されているユーザーは削除し、新たに独自のユーザーを作成することをお勧めします。 - 新しいユーザーの作成: 「新規ユーザーの作成」をクリックし、接続に使用するユーザー名とパスワードを設定します。このユーザーがVPN接続に使用されることになります。
注意点
デフォルトで作成されているユーザーをそのまま使用すると、セキュリティリスクが高まる可能性があります。必ず新しいユーザーを作成し、強力なパスワードを設定するようにしましょう。
VPN接続の最終準備と接続確認
ここまでで、VPNサーバーの設定が完了し、接続の準備が整いました。次に、SoftEther VPN Clientを使用して実際に接続を行います。ここでは、必要な項目の入力方法と接続の確認手順を詳しく説明します。
SoftEther VPN Clientの起動と設定
- SoftEther VPN Clientの起動: まず、インストールしたSoftEther VPN Clientを起動します。以下のスクリーンショットを参考に、メイン画面に移動してください。
- 新しい接続の設定: 「新しいVPN接続設定」をクリックし、必要な情報を入力します。これには、ホスト名(サーバーのIPアドレス)、ポート番号、ユーザー名、パスワードなどが含まれます。
- 接続の確認: 設定が完了したら、「接続」ボタンをクリックして、VPNサーバーに接続を試みます。以下のスクリーンショットにあるように、接続が成功した場合は、接続ステータスが「接続中」と表示されます。
接続が成功した場合
接続が成功すると、インターネット通信がVPN経由で行われるようになります。これで、プライバシー保護や安全な通信が確保されます。
VPN接続の確認方法
接続が成功したかどうかを確認するためには、ブラウザを使用して自分のIPアドレスを確認することが有効です。ここでは、その手順を詳しく説明します。
IPアドレスの確認手順
- ブラウザを開く: 任意のブラウザを開きます。Google ChromeやFirefoxなど、普段使っているブラウザで問題ありません。
- IPアドレス確認サイトにアクセス: ブラウザのアドレスバーに「what is my IP address」などと入力し、IPアドレスを表示するサイトにアクセスします。以下のスクリーンショットを参考にしてください。
- IPアドレスの確認: サイトにアクセスすると、現在のIPアドレスが表示されます。ここで、表示されているIPアドレスがGoogle Cloudの外部IPアドレスと一致していれば、VPN接続が成功していることを確認できます。
確認のポイント
- 表示されるIPアドレスが、VPNサーバーがホストされているGoogle Cloudの外部IPアドレスと一致していることが重要です。
- 一致していない場合は、接続に問題がある可能性があるため、再度設定を確認してください。
コンフィグファイルへの設定反映の確認
最後に、サーバー管理マネージャで行った設定がコンフィグファイルに正しく反映されているかを確認します。これにより、設定が確実に適用されていることを確認でき、トラブルを未然に防ぐことができます。
コンテナにアクセスして vpn_server.config
を確認する手順
- コンテナに入る: まず、以下のコマンドを使用してVPNサーバーのコンテナにアクセスします。
docker exec -it vpn bash
このコマンドで、VPNサーバーが動作しているコンテナ内に入ることができます。 vpn_server.config
ファイルの確認: 次に、サーバー管理マネージャで設定した内容がvpn_server.config
ファイルに反映されているかを確認します。特に、VPNで使用するポート番号やその他の設定が正しく反映されているかどうかをチェックします。ファイルはコンテナに入った場所にあるので以下のコマンドで確認できるはずです。cat vpn_server.config
このコマンドを実行すると、vpn_server.config
ファイルの内容が表示されます。- 設定内容の確認: GUIで行った操作が
vpn_server.config
ファイルに正しく反映されていることを確認します。例えば、VPNで使用するポート番号が期待通りの設定になっているかどうかを見てください。以下のスクリーンショットを参考に、設定内容が正しく反映されているか確認しましょう。
確認のポイント
vpn_server.config
ファイル内の設定が、サーバー管理マネージャで行った設定と一致していることが重要です。- 設定が反映されていない場合は、再度設定を確認し、必要に応じて修正を行ってください。