はじめに
AWS上のWindows Serverに共有フォルダを作成し、複数の場所からファイルをアップロード・管理できる環境を運用しています。
当初、外部のWindows PCから共有フォルダへアクセスする方法を検討していましたが、接続元のネットワークによってはSMB(TCP 445)が制限されており、共有フォルダへアクセスできないことがありました。
そこで、AWS上にSoftEther VPN Serverを構築し、
Windows PC → VPN → AWS内のWindowsファイルサーバー
という経路でアクセスできるようにしました。
本記事では、そのうちAmazon Linux 2023上にSoftEther VPN Serverを構築するところまでをまとめます。
L2TP/IPsec、SecureNAT、Windowsクライアントからの接続については次の記事、スプリットトンネリングについてはさらに別の記事としてまとめます。
※記事内のIPアドレス、ホスト名、ユーザー名などは実環境とは異なる説明用の値に置き換えています。
今回実現すること
最終的には、次のような構成を作ります。
Windows PC
│
│ Internet
│ L2TP/IPsec
▼
┌─────────────────────────┐
│ EC2 │
│ Amazon Linux 2023 │
│ SoftEther VPN Server │
└────────────┬────────────┘
│
│ VPC内通信
▼
┌─────────────────────────┐
│ EC2 │
│ Windows Server 2019 │
│ SMBファイルサーバー │
└─────────────────────────┘
Windows Serverはファイルサーバーとしてのみ使用しており、Active Directoryは使用していません。
VPN ServerとWindows Serverは同一VPC内に配置しています。
今回の記事では、このうちAmazon Linux 2023上のSoftEther VPN Serverを構築します。
前提環境
今回使用した主な環境は次のとおりです。
| 項目 | 内容 |
|---|---|
| クラウド | AWS |
| VPNサーバー | Amazon EC2 |
| OS | Amazon Linux 2023 |
| CPUアーキテクチャ | arm64 |
| VPNソフトウェア | SoftEther VPN Server |
| ファイルサーバー | Windows Server 2019 |
| ファイル共有 | SMB |
| VPN方式 | L2TP/IPsec |
| クライアント | Windows 11 |
VPNサーバーとファイルサーバーは同一VPC内に配置しています。
なお、L2TP/IPsecやSecureNATなどのSoftEther側の詳細設定は第2回で扱います。
なぜVPNを構築したのか
今回VPNを構築した理由の一つが、接続元ネットワークによってSMB通信が利用できないことがあったためです。
Windowsのファイル共有では主にTCP 445を使用します。
しかし、接続するネットワークによってはセキュリティ上の理由からSMB通信が制限されており、外部からWindows Serverの共有フォルダへ直接アクセスする方法では、利用する場所によって接続可否が変わってしまいました。
そこで、
Windows PC
↓
VPN接続
↓
AWS VPC
↓
Windows Server
という経路を用意し、VPN接続後にAWS内部のWindows Serverへアクセスする構成に変更しました。
AWS Security Groupを設定する
まず、VPNサーバーとなるEC2のSecurity Groupを設定します。
今回使用するL2TP/IPsecでは、主に次の通信が必要です。
| 用途 | プロトコル | ポート | 送信元 |
|---|---|---|---|
| SSH管理 | TCP | 22 | 管理端末のグローバルIP /32
|
| IKE | UDP | 500 | VPN利用者の接続元 |
| IPsec NAT Traversal | UDP | 4500 | VPN利用者の接続元 |
UDP 500はIPsecの接続確立に使用されます。
UDP 4500はNAT Traversal(NAT-T)で使用されます。クライアントがルーターなどのNAT配下に存在する場合でもIPsec通信を行えるようにするために必要です。
今回の環境では接続元が固定されていなかったため、VPN利用者が接続できる範囲からUDP 500/4500を受け付けるように設定しました。
今回は複数のネットワークからVPNへ接続する必要があり、接続元IPアドレスを固定できなかったため、UDP 500/4500の送信元を0.0.0.0/0としています。
接続元を限定できる環境では、必要なIPアドレス範囲のみに制限する方が安全です。
SoftEther VPN Serverをインストールする
今回VPNサーバーとして使用したEC2は、arm64版のAmazon Linux 2023です。
SoftEther VPN ServerもCPUアーキテクチャに合わせてLinux ARM64版を使用しました。
タイムゾーンを設定する
まず、タイムゾーンを日本時間へ変更しました。
sudo timedatectl set-timezone Asia/Tokyo
設定後は、必要に応じて次のコマンドで確認できます。
timedatectl
ログなどを確認するときに時刻がずれていると調査しづらいため、先に設定しています。
必要なパッケージをインストールする
パッケージを更新します。
sudo dnf update -y
続いて、SoftEther VPN Serverのビルドに必要なパッケージをインストールします。
sudo dnf install -y gcc make ncurses-devel readline-devel openssl-devel zlib-devel
今回SoftEther VPN Serverは、ダウンロードしたソースをEC2上でビルドして使用しました。
そのため、gccやmakeなどのビルド用ツールをあらかじめインストールしています。
SoftEther VPN Serverをダウンロードする
SoftEther公式のダウンロードページから、使用するOS・CPUアーキテクチャに対応したVPN Serverを確認します。
今回使用するのはLinux ARM64版です。
ダウンロードURLを確認したら、EC2上で取得します。
curl -L -O '<SOFTETHER_VPN_SERVERのダウンロードURL>'
続いて展開します。
tar xvzf '<ダウンロードしたtar.gzファイル>'
展開したディレクトリへ移動します。
cd vpnserver
SoftEther VPN Serverをビルドする
展開したディレクトリ内でmakeを実行します。
make
makeは、ソースコードから実際に実行できるプログラムを作成する処理です。
実行途中でSoftEtherの使用許諾に関する確認が表示されるため、内容を確認して進めます。
ビルドが正常に完了したら、SoftEther VPN Serverを/usr/local配下へ配置します。
cd ..
sudo mv vpnserver /usr/local/
所有者をrootへ変更します。
sudo chown -R root:root /usr/local/vpnserver
SoftEtherのディレクトリへ移動します。
cd /usr/local/vpnserver
ファイルのアクセス権を設定します。
sudo chmod 600 *
sudo chmod 700 vpncmd vpnserver
ここでは基本的なファイルを所有者のみ読み書き可能な600とし、実行する必要があるvpncmdとvpnserverについては所有者に実行権限を追加した700としています。
systemdサービスとして登録する
このままでもSoftEther VPN Serverを起動できますが、サーバー再起動後にも起動できるよう、systemdサービスとして登録しました。
/etc/systemd/system/vpnserver.serviceを作成し、次の内容を記述します。
[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target
[Service]
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Type=forking
RestartSec=3s
[Install]
WantedBy=multi-user.target
設定の意味
ExecStartでは、systemdからSoftEther VPN Serverを起動するときに実行するコマンドを指定しています。
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStopは停止時のコマンドです。
ExecStop=/usr/local/vpnserver/vpnserver stop
また、
Type=forking
とすることで、起動時にバックグラウンドプロセスとして動作するサービスとしてsystemdに扱わせています。
最後の、
WantedBy=multi-user.target
は、通常のマルチユーザー環境でサービスを自動起動させるための設定です。
SoftEther VPN Serverを起動する
作成したサービス定義をsystemdへ読み込みます。
sudo systemctl daemon-reload
SoftEther VPN Serverを起動します。
sudo systemctl start vpnserver
続いて、EC2再起動後にも自動的に起動するよう設定します。
sudo systemctl enable vpnserver
状態を確認します。
sudo systemctl status vpnserver
次のようにactive (running)となっていれば、SoftEther VPN Server自体は起動できています。
Active: active (running)
【systemctl status vpnserverの実行結果を挿入】
スクリーンショットを使用する場合は、ホスト名や実環境を特定できる情報が表示されていないか確認してから掲載します。
vpncmdからVPN Serverへ接続する
SoftEther VPN Serverには、設定・管理用のvpncmdというコマンドラインツールがあります。
次のように起動します。
cd /usr/local/vpnserver
sudo ./vpncmd
メニューが表示されたら、
1. Management of VPN Server or VPN Bridge
を選択します。
接続先には、
localhost
を指定します。
Server Admin Modeで接続する場合は、Virtual Hub名を入力せずEnterを押します。
VPN Serverのプロンプトが表示されれば、SoftEther VPN Serverへ管理接続できています。
VPN Server>
ここまでで、
Amazon Linux 2023上へのSoftEther VPN Serverのインストール・サービス登録・起動
まで完了です。
構築後に発生した課題
今回の構成で重要だったのは、SoftEther VPN Serverをインストールすること自体よりも、
「VPNを使ってどの通信をAWS側へ通すのか」
という点でした。
VPNを構築する前は、接続元ネットワークによってSMB通信が制限され、Windows Serverへアクセスできないことがありました。
一方、VPN構築後、すべての通信をVPN経由にする構成では、VPNを経由する必要のない通常のWebアクセスまでVPN側へ流れてしまい、通信の遅延などが発生しました。
そのため最終的には、
- AWS上の必要なネットワーク宛て → VPN経由
- 通常のインターネット通信 → クライアント側の通常回線
とするスプリットトンネリングを構成しています。
この部分はルーティングの理解も必要になったため、第3回で詳しくまとめます。
今回の動作確認
今回の記事の範囲では、次の状態まで確認します。
sudo systemctl status vpnserver
で、
active (running)
になっていること。
さらに、
sudo /usr/local/vpnserver/vpncmd
からlocalhostのVPN Serverへ管理接続できることを確認します。
この時点では、まだWindowsクライアントからVPN接続できる状態にはなっていません。
次の記事でVirtual Hub、L2TP/IPsec、VPNユーザー、SecureNATなどを設定します。
まとめ
今回は、外部のWindows PCからAWS上のWindowsファイルサーバーへアクセスするためのVPN環境として、Amazon Linux 2023上にSoftEther VPN Serverを構築しました。
今回行った内容は次のとおりです。
- VPNサーバー用EC2をAmazon Linux 2023で構築
- L2TP/IPsecで使用するSecurity Groupを設定
- SoftEther VPN Serverをダウンロード・ビルド
-
/usr/local/vpnserverへ配置 - systemdサービスとして登録
- サービスの起動・自動起動を設定
-
vpncmdからVPN Serverへ管理接続
これでVPN Server自体の準備ができました。
次回は、SoftEther VPN ServerにVirtual Hub、L2TP/IPsec、VPNユーザー、SecureNAT、仮想DHCPを設定し、Windows標準のVPNクライアントから接続できるところまで進めます。
その後、実際の運用で問題になった「VPN接続中に通常のインターネット通信までVPNへ流れてしまう」問題と、その対策として構成したスプリットトンネリングについてまとめます。
