はじめに
リモートワークの普及に伴いVPNを利用したいがコストが気になる、という方は多いのではないでしょうか。
今回は無償のVPNソフトウェアを利用し、簡単かつ低コストでVPN環境を構築する方法について紹介します。
使用するソフトウェア、サービス等
- SoftEther VPN(Server、Client)
- AWS(EC2)
- Docker(イメージ)
やりたいこと
パブリックIPを持たないプライベートサブネットに存在するサーバに外部からアクセスすることを目的とします。
シンプルな構成として、既に構築済みのプライベートサーバと同じVPC内にVPNサーバを構築していきます。
VPNサーバの構築
AWSコンソールからVPNサーバ用のEC2インスタンスをパブリックサブネットに作成します。
個人や少人数で利用する場合、さらに低スペックでも問題無いと思います。
要求スペックは公式サイトを参照。
AMI:Amazon Linux 2023
アーキテクチャ:64ビット(Arm)
インスタンスタイプ:t4g.micro
ストレージ:EBS(gp3) 10GB
ネットワーク設定(インバウンド):
HTTP、HTTPS、SSH以外にカスタムTCPをセキュリティグループから設定
プロトコル仕様については公式サイトを参照
SoftEther VPN Serverのインストール
作成したEC2インスタンスにログインし、VPNソフトウェアをインストールします。
筆者は時短のためdockerを利用しました。dockerの情報はインターネットに溢れていますので、詳細は割愛します。
イメージのバージョンやオプションについてはREADMEを参照。
下記ymlファイルを配置し、同一ディレクトリでコマンドを実行
$ docker compose up -d
docker-compose.yml
services:
softether-server:
image: siomiz/softethervpn:9799
restart: always
cap_add:
- NET_ADMIN
ports:
- 5555:5555/tcp
- 992:992/tcp
container_name: softether-server
environment:
- USERS=${ユーザID}:${ユーザパスワード}
- SPW=${管理パスワード}
- HPW=${仮想ハブパスワード}
- PSK=vpnsecret
- VPNCMD_HUB=SecureNatDisable
SoftEther VPN Server Managerのインストール
VPNサーバの操作のため管理ソフトを自分の端末にインストールします。
取得はダウンロードページを参照。
管理ソフトを起動し「新しい接続設定」をクリックし、必要な情報を入力して「OK」をクリックします。
接続設定:最初の画面で一覧に表示される名前
ホスト名:AWSコンソールから構築したEC2インスタンスのパブリックを確認し入力
ポート番号:5555
管理パスワード:インストール時に設定した管理パスワード
接続設定が完了後、一覧から作成した接続設定を選択し、「接続」をクリックします。
ダイナミックDNSの設定
この機能を利用することでIPアドレスを隠すことができる。Elastic IPなどでパブリックIPを固定していない場合に有効です。
注意点として、ダイナミックDNS名は1つのサーバにつき1つとなります。
詳細は公式サイトを参照。
管理ソフトの「ダイナミックDNS設定をクリックします。
割り当てられているダイナミックDNS名を確認します。
このDNS名を利用して接続することでEC2のパブリックIPが変更されても問題無く接続できます。
SoftEther VPN Clientのインストール
端末からVPNサーバを介した通信を行うため、クライアントソフトのインストールを行います。
取得はダウンロードページを参照。
クライアントソフトを起動し、メニューの「仮想LAN」-「新規仮想LANカードの作成」をクリックします。
任意の名前(今回は「VPN」)を入力し、「OK」をクリックします。
メニューの「接続」-「接続設定の新規作成」をクリックします。
接続設定名:最初の画面で一覧に表示される名前
ホスト名:確認したダイナミックDNS名(~.softether.net) or EC2のパブリックIP
ポート番号:5555
使用する仮想LANカード:上記で作成したもの
ユーザー認証:Softether VPN Serverをインストール時に設定したもの
設定完了後、一覧の接続名を右クリックし「接続」クリックするとVPNサーバに接続できます。
接続の確認
クライントソフトでVPNサーバに接続した状態で、接続したいサーバのプライベートIPでアクセスしてみてください。
SSHでのログイン、WebサーバへのHTTPリクエスト等でアクセスできれば成功です。
接続できない場合、接続したいサーバのネットワーク設定(インバウンド)等を見直してみてください。VPNサーバからのアクセスを許可しないと接続できません。
[おまけ]スプリットトンネリングの設定
特定の接続先以外はVPNサーバを介さずにインターネットへ接続したい場合に有効な機能です。
特にAWSのような通信量に応じた従量課金制の場合、料金を抑えることができます。
管理ソフトの「仮想HUBの管理」をクリックします。
「仮想NATおよび仮想DHCPサーバー機能」をクリックします。
「SecureNATの設定」クリックします。
IPアドレス、サブネットマスク等はネットワークの設計に関わる部分なので、わからない方は一旦同じ設定にしてみてください。
重要なのは「クライアントに割り当てるオプションの設定」を全て空欄に設定することです。
入力が完了したら「プッシュする静的ルーティングテーブルの編集」をクリックします。
この設定でアクセス先のIPごとにゲートウェイを設定できます。
説明にもある通り、記述形式は
「IPネットワークアドレス/サブネットマスク/ゲートウェイアドレス」
となります。
IPネットワークアドレス/サブネットマスクに接続したいプライベートサブネットを設定することで、このサブネットの範囲のIPへアクセスする場合はVPNサーバ経由となります。
ゲートウェイアドレスは前画面で設定したIPアドレスになります。
[おまけ]サーバの可用性について
VPNサーバを1台で運用する場合、VPNサーバのEC2をAuto Scalingグループにしておくことがオススメです。(Auto Scalingグループ自体は無料で作成できます)
希望台数を1台にしておくことで、インスタンスが落ちた場合に自動で1台起動してくれます。
また、ダイナミックDNS機能が有効であれば、インスタンスが入れ替わったことでパブリックIPが変更されてもクライアントには影響ありません。
最後に
最後まで読んでいただいてありがとうございます。
今回は最低限の設定でVPNサーバを構築しましたが、本来はネットワークやセキュリティの知識が必要となります。
個人で利用する場合は自己責任となりますが、企業等で利用する場合は公式サイト等を熟読することをおすすめします。
それではまた。