はじめに
前回の記事では、Amazon Linux 2023上にSoftEther VPN Serverをインストールし、systemdサービスとして起動するところまで構築しました。
今回はその続きとして、SoftEther VPN Serverに、
- Virtual Hub
- L2TP/IPsec
- VPNユーザー
- SecureNAT
- 仮想DHCP
を設定し、Windows 11標準のVPN機能からL2TP/IPsecで接続できるところまで進めます。
最終的な目的は、VPN接続後に同一VPC内のWindows Serverへアクセスできるようにすることです。
Windows 11
│
│ L2TP/IPsec
▼
┌─────────────────────────┐
│ EC2 │
│ Amazon Linux 2023 │
│ SoftEther VPN Server │
│ │
│ Virtual Hub │
│ SecureNAT │
│ 仮想DHCP │
└────────────┬────────────┘
│
│ VPC内通信
▼
┌─────────────────────────┐
│ EC2 │
│ Windows Server 2019 │
│ SMBファイルサーバー │
└─────────────────────────┘
※記事内のIPアドレス、Virtual Hub名、ユーザー名、事前共有キーなどは、実環境とは異なる説明用の値に置き換えています。
前提環境
前回の記事で、次の状態まで構築済みとします。
| 項目 | 内容 |
|---|---|
| VPNサーバー | Amazon EC2 |
| OS | Amazon Linux 2023(arm64) |
| VPNソフトウェア | SoftEther VPN Server |
| VPN方式 | L2TP/IPsec |
| クライアント | Windows 11 |
| ファイルサーバー | Windows Server 2019 |
| VPN内IP払い出し | SecureNATの仮想DHCP |
SoftEther VPN Serverは起動済みで、vpncmdからServer Admin Modeで管理接続できる状態です。
AWS Security Groupでは、前回の記事でL2TP/IPsecに必要なUDP 500/4500を許可しています。
今回設定するもの
SoftEther VPN Serverをインストールしただけでは、まだWindowsクライアントからVPNへ接続できません。
今回、大きく次の設定を行います。
SoftEther VPN Server
│
├─ Virtual Hub
│ └─ VPNユーザー
│
├─ L2TP/IPsec
│ └─ 事前共有キー
│
└─ SecureNAT
└─ 仮想DHCP
└─ VPNクライアントへIPアドレスを払い出す
それぞれが何をしているのか確認しながら設定します。
Virtual Hubを作成する
まずvpncmdを起動します。
cd /usr/local/vpnserver
sudo ./vpncmd
メニューでは、
1. Management of VPN Server or VPN Bridge
を選択します。
接続先には、
localhost
を指定します。
Server Admin Modeで接続するため、Virtual Hub名は入力せずEnterを押します。
次のプロンプトになれば、VPN Serverの管理モードへ接続できています。
VPN Server>
Virtual Hubとは
SoftEtherでは、VPN Serverの中に**Virtual Hub(仮想HUB)**を作成し、その中にVPNユーザーやネットワーク関連の設定を持たせます。
物理ネットワークのスイッチそのものと完全に同じものではありませんが、今回の構成では、
「VPN接続してきたクライアントを収容する仮想的なネットワーク」
と考えると分かりやすいです。
今回は例としてVPN-HUBという名前で作成します。
VPN Server>HubCreate VPN-HUB
実行すると、Virtual Hubの管理パスワードを設定するよう求められるため、任意のパスワードを設定します。
作成したVirtual Hubは、次のコマンドで確認できます。
VPN Server>HubList
【HubListの実行結果を挿入】
L2TP/IPsecを有効にする
続いて、Windows標準VPNクライアントから接続できるようにL2TP/IPsecを有効化します。
Server Admin Modeのまま、次のコマンドを実行します。
VPN Server>IPsecEnable /L2TP:yes /L2TPRAW:no /ETHERIP:no /DEFAULTHUB:VPN-HUB
それぞれの指定は次の意味です。
| 設定 | 内容 |
|---|---|
/L2TP:yes |
L2TP over IPsecを有効化 |
/L2TPRAW:no |
IPsecを使用しないRaw L2TPは無効 |
/ETHERIP:no |
EtherIP / L2TPv3 over IPsecは使用しない |
/DEFAULTHUB:VPN-HUB |
接続先となるデフォルトVirtual Hubを指定 |
今回使用したいのはL2TP over IPsecなので、それ以外の方式は無効にしています。
コマンド実行後、IPsecの事前共有キー(Pre-Shared Key)を入力します。
Pre Shared Key for IPsec: <事前共有キー>
この事前共有キーは、後ほどWindows 11側のVPN設定にも同じ値を設定します。
L2TP/IPsecの設定を確認する
設定後、次のコマンドを実行します。
VPN Server>IPsecGet
確認するポイントは主に、
L2TP over IPsec Server Function Enabled
がYesになっていることと、
Name of Default Virtual Hub
が先ほど作成したVirtual Hubになっていることです。
VPN Server>IPsecGet
IPsecGet command - Get the Current IPsec VPN Server Settings
Item |Value
---------------------------------------------------+--------
L2TP over IPsec Server Function Enabled |Yes
Raw L2TP Server Function Enabled |No
EtherIP / L2TPv3 over IPsec Server Function Enabled|No
IPsec Pre-Shared Key String |<事前共有キー>
Name of Default Virtual Hub |VPN-HUB
The command completed successfully.
VPN接続用のユーザーを作成する
次に、Windows 11からVPNへ接続するときに使用するVPNユーザーを作成します。
まず、作成したVirtual Hubの管理モードへ移動します。
VPN Server>Hub VPN-HUB
プロンプトが、
VPN Server/VPN-HUB>
となります。
VPNユーザーを作成します。
VPN Server/VPN-HUB>UserCreate vpn-user01 /Group:none /REALNAME:none /NOTE:none
今回はグループ、実名、備考などを設定せず、VPN接続用ユーザーのみ作成しています。
続いて、作成したユーザーへパスワードを設定します。
VPN Server/VPN-HUB>UserPasswordSet vpn-user01
実行後、対話形式でパスワードを入力します。
VPN認証とWindows Serverの認証は別物
今回の構成では、ここで作成したVPNユーザーと、Windows Serverの共有フォルダへアクセスするためのWindowsローカルユーザーを分けています。
流れとしては、
① VPNへ接続
↓
SoftEtherのVPNユーザーで認証
② Windows Serverへアクセス
↓
Windowsのローカルユーザーで認証
となります。
つまり、
「VPNへ接続する権限」と「共有フォルダへアクセスする権限」は別
です。
VPNへ正常に接続できても、Windows Server側のユーザーやアクセス権が正しくなければ共有フォルダは利用できません。
逆に、Windows Serverのユーザー情報を知っていても、VPNへ接続できなければAWS内部のファイルサーバーまで到達できません。
この2段階を分けて考えておくと、接続トラブル時の切り分けもしやすくなります。
SecureNATを有効にする
続いてSecureNATを有効にします。
VPN Server/VPN-HUB>SecureNatEnable
SecureNATとは
ここは最初、少し分かりにくかったポイントです。
SoftEtherのSecureNATには、VPNクライアントをネットワークへ接続するための仮想的なNAT機能やDHCPサーバー機能が含まれています。
今回特に重要なのが仮想DHCPサーバーです。
Windows PCがVPNへ接続したとき、そのPCがVPN内で通信するためにはVPN側のIPアドレスが必要です。
今回の構成では、SecureNATの仮想DHCPを使ってVPNクライアントへIPアドレスを払い出します。
Windows 11
│
│ VPN接続
▼
Virtual Hub
│
▼
SecureNAT
│
└─ 仮想DHCP
│
└─ VPN用IPアドレスを払い出す
仮想DHCPを設定する
SecureNATを有効にしたら、VPNクライアントへ払い出すIPアドレス範囲を設定します。
実環境の値は公開せず、ここでは説明用として次のネットワークを使用します。
192.0.2.0/24
設定はDhcpSetで行います。
VPN Server/VPN-HUB>DhcpSet \
/Start:192.0.2.10 \
/End:192.0.2.200 \
/Mask:255.255.255.0 \
/Expire:7200 \
/GW:None \
/DNS:192.0.2.1 \
/DNS2:none \
/Domain:none \
/Log:yes
主な項目は次のとおりです。
| 項目 | 意味 |
|---|---|
Start |
DHCPで払い出す最初のIPアドレス |
End |
DHCPで払い出す最後のIPアドレス |
Mask |
VPN内ネットワークのサブネットマスク |
Expire |
DHCPリース期間(秒) |
GW |
VPNクライアントへ通知するデフォルトゲートウェイ |
DNS |
VPNクライアントへ通知するDNSサーバー |
DNS2 |
セカンダリDNS |
Domain |
DHCPで通知するドメイン名 |
Log |
DHCPログを記録するか |
今回の設定では、
/GW:None
としている点が重要です。
今回は/GW:Noneとし、仮想DHCPからVPN側のデフォルトゲートウェイを通知しない設定としています。
実際に必要なAWS内通信だけをVPNへ流すためには、後述するPushRouteに加えてWindows側のVPN設定も関係します。詳しくは第3回で扱います。
実際の設定ではPushRouteも使用している
今回の実環境では、仮想DHCPの設定時にPushRouteも使用しています。
PushRouteは、VPN接続したクライアントへ特定の宛先ネットワークへのルートを配布するための設定です。
イメージとしては、
AWS内の特定ネットワーク
↓
VPN経由
その他のInternet通信
↓
通常のネットワーク
という通信経路を作るために使用します。
ただし、PushRouteだけではなくWindows側のVPN設定も関係するため、第3回でroute printの結果と合わせて詳しく説明します。
DHCP設定を確認する
設定した内容は次のコマンドで確認できます。
VPN Server/VPN-HUB>DhcpGet
払い出し範囲やサブネットマスクなど、設定した内容が反映されていることを確認します。
VPN Server/VPN-HUB>DhcpGet
DhcpGet command - Get Virtual DHCP Server Function Setting of SecureNAT Function
Item |Value
-------------------------------+---------------------------------------------
Use Virtual DHCP Function |Yes
Start Distribution Address Band|192.0.2.10
End Distribution Address Band |192.0.2.200
Subnet Mask |255.255.255.0
Lease Limit (Seconds) |7200
Default Gateway Address |None
DNS Server Address 1 |192.0.2.1
DNS Server Address 2 |None
Domain Name |
Save NAT and DHCP Operation Log|Yes
Static Routing Table to Push |<説明用の値へ置換>
The command completed successfully.
Windows 11にVPN接続を追加する
SoftEther側の準備ができたら、Windows 11側にVPN接続を追加します。
Windows 11の「設定」からVPN設定を開き、新しいVPN接続を追加します。
設定する内容は次のとおりです。
| 項目 | 設定 |
|---|---|
| VPNプロバイダー | Windows(ビルトイン) |
| 接続名 | 任意 |
| サーバー名またはアドレス | VPNサーバーの接続先 |
| VPNの種類 | 事前共有キーを使ったL2TP/IPsec |
| 事前共有キー | SoftEther側で設定した値 |
| サインイン情報の種類 | ユーザー名とパスワード |
ユーザー名とパスワードには、先ほどSoftEtherで作成したVPNユーザーの認証情報を使用します。
VPNへ接続する
設定を保存したら、Windows 11から作成したVPNへ接続します。
正常に接続できれば、WindowsのVPN設定画面に、
接続済み
と表示されます。
VPN用IPアドレスを確認する
VPN接続後、コマンドプロンプトまたはPowerShellから次のコマンドを実行します。
ipconfig
VPN接続に対応するアダプターを確認し、SecureNATの仮想DHCPで設定した範囲のIPアドレスが割り当てられていることを確認します。
今回の記事の説明用ネットワークであれば、
192.0.2.10 ~ 192.0.2.200
の範囲です。
PPP アダプター VPN-HUB:
接続固有の DNS サフィックス . . . . .:
IPv4 アドレス . . . . . . . . . . . .: 192.0.2.10
サブネット マスク . . . . . . . . . .: 255.255.255.255
デフォルト ゲートウェイ . . . . . . .:
ここまで確認できれば、
Windows 11 → L2TP/IPsec → SoftEther VPN Server → Virtual Hub
までのVPN接続と、仮想DHCPによるIPアドレス払い出しが動作していることを確認できます。
Windows Serverへアクセスする
VPN接続後、エクスプローラーのアドレスバーからAWS上のWindows Serverへアクセスします。
例えばWindows ServerのプライベートIPアドレスを指定する場合は、
\\10.0.16.10
のように入力します。
Windowsの資格情報を求められた場合は、VPNユーザーではなく、Windows Server側に作成したローカルユーザーの認証情報を使用します。
正常に共有フォルダを開ければ、
Windows 11
↓
L2TP/IPsec
↓
SoftEther VPN Server
↓
AWS VPC
↓
Windows Server
↓
SMB共有フォルダ
まで一連の通信が成立しています。
今回の動作確認
今回の記事では、次の順番で確認しました。
-
IPsecGetでL2TP/IPsecが有効になっている - VPNユーザーを作成し、パスワードを設定
- SecureNATを有効化
-
DhcpGetで仮想DHCP設定を確認 - Windows 11からL2TP/IPsecでVPN接続
-
ipconfigでVPN用IPアドレスが払い出されていることを確認 - Windows Serverの共有フォルダへアクセス
VPNに接続できない場合と、VPNには接続できるもののWindows Serverへアクセスできない場合では、確認するポイントが異なります。
この切り分けについては、実運用で発生した事象も含めて別記事としてまとめる予定です。
構築後に発生した課題
これでVPN経由でWindows Serverへアクセスできるようになりました。
しかし、実際に利用してみると別の問題が発生しました。
VPNへ接続すると、Windows Server宛ての通信だけでなく、通常のインターネット通信までVPN側へ流れてしまいました。
その結果、VPNを必要としないWebアクセスまでVPN経由となり、通信の遅延などが発生しました。
今回必要なのは、
AWS内の必要なネットワーク
↓
VPN経由
通常のWebアクセス
↓
クライアント側の通常回線
という構成です。
そこで、Windowsのルーティングテーブルやデフォルトゲートウェイについて調べ、スプリットトンネリングを構成しました。
まとめ
今回は、前回構築したSoftEther VPN ServerへL2TP/IPsecとSecureNATを設定し、Windows 11標準のVPNクライアントから接続できるようにしました。
今回行った内容は次のとおりです。
- Virtual Hubを作成
- L2TP/IPsecを有効化
- IPsec事前共有キーを設定
- VPN接続用ユーザーを作成
- SecureNATを有効化
- 仮想DHCPでVPNクライアントへIPアドレスを払い出し
- Windows 11標準VPNクライアントから接続
- Windows Serverの共有フォルダへアクセス
これで、
外部のWindows PC → VPN → AWS → Windowsファイルサーバー
という接続経路を作ることができました。
ただし、この状態ではVPN接続時のルーティングに問題がありました。
次回は、この構成で実際に発生した、
「VPNへ接続すると通常のインターネット通信までVPNへ流れてしまう」
という問題について、route printで何を確認したのか、デフォルトルートとは何なのか、そして必要なAWS内通信だけをVPNへ流すためにどのようにスプリットトンネリングを構成したのかをまとめます。
