MillenVPN Native OpenConnectをWindowsで設定したところ、OpenConnect-GUI上では正常に接続できているように見えるのに、IPアドレス確認サイトを見ると普段使っているプロバイダのIPアドレスのままでした。
最終的には、Windows側でOpenConnectが利用するJavaScriptの実行環境に問題があり、VPN接続後のネットワーク設定が適用されていないことが原因でした。
この記事では、実際に行った切り分けから解決までを順番にまとめます。
※掲載しているログやコマンド結果は、グローバルIPアドレス、ユーザー名、認証情報、接続先ホスト名、ユーザーディレクトリなど、環境を特定できる情報を削除・置換しています。
症状:OpenConnectは接続済みなのにIPアドレスが変わらない
OpenConnect-GUIからMillenVPN Native OpenConnectへ接続すると、画面上ではVPN接続が成立していました。
ログにも、
CSTP connected
Established DTLS connection
と表示されます。
ところが、IPアドレス確認サイトを開いても、表示されるのはVPNサーバーのIPアドレスではなく、普段利用しているインターネット回線のIPアドレスでした。
つまり、
VPNサーバーとの接続自体は成立しているのに、Windowsのインターネット通信がVPNへ流れていない
という状態です。
Windows側のVPN設定を別途行う必要はない
最初に疑ったのが、Windowsの
「設定」→「ネットワークとインターネット」→「VPN」
でも別途VPN接続を作る必要があるのか、という点でした。
しかし、MillenVPN Native OpenConnectをOpenConnect-GUIから利用する場合、Windows標準のVPN接続を別途作成する必要はありません。
OpenConnect-GUI自身がVPN接続を確立し、仮想ネットワークインターフェース、IPアドレス、DNS、ルーティングなどを設定します。
そのため、今回はOpenConnect側の処理を調べることにしました。
route print でVPNに通信が流れているか確認
まずWindowsで次のコマンドを実行しました。
route print -4
見るポイントはIPv4のルーティングテーブルです。
通常のインターネット接続では、次のようなデフォルトルートがあります。
Network Destination Netmask Gateway Interface
0.0.0.0 0.0.0.0 192.168.x.x 192.168.x.x
これは通常のLANルーターへ通信を送る経路です。
VPNによって全通信をトンネルへ流す場合、OpenConnectの実装や設定によっては、これとは別にVPN側のルートが追加されます。
今回の環境ではVPN接続後も通常回線側のルーティングしか確認できず、OpenConnectによるVPN経路が作成されていませんでした。
これで、IP確認サイトだけの問題ではなく、実際にWindowsの通信がVPNを通っていないことが分かりました。
TAPアダプターを確認する
次にPowerShellでネットワークアダプターを確認しました。
Get-NetAdapter
環境には、
TAP-Windows Adapter V9
が存在し、ステータスもUpでした。
つまり、OpenConnectが使用する仮想ネットワークアダプター自体はインストールされています。
続いて対象インターフェースのIP設定を確認します。
Get-NetIPConfiguration -InterfaceIndex <インターフェース番号>
するとIPv4アドレスが、
169.254.x.x
になっていました。
これは重要なポイントでした。
169.254.x.x が割り当てられていた
169.254.x.x は、Windowsが正常なIPv4アドレスを取得できなかった場合などに自動的に割り当てるAPIPAアドレスです。
VPN接続後の仮想インターフェースにこれが付いているのであれば、OpenConnectからVPN用IPアドレスが正常にWindowsへ設定されていない可能性があります。
さらに、
Get-NetRoute -InterfaceIndex <インターフェース番号> -AddressFamily IPv4
を確認しても、VPN通信に必要なルートが作られていませんでした。
ここまでで、
VPNサーバーとの通信
↓
接続成功
↓
仮想アダプターも存在
↓
VPN用IPアドレスがWindowsに設定されていない
↓
VPN用ルートも作成されていない
↓
通常回線からインターネットへ接続
という状態であることが分かりました。
OpenConnectのログではVPN用IPが払い出されていた
ここでOpenConnect-GUIのログを詳しく確認しました。
ログには次のような情報がありました。
Got CONNECT response: HTTP/1.1 200 CONNECTED
X-CSTP-Address: 10.x.x.x
X-CSTP-Netmask: 255.255.255.0
X-CSTP-DNS: xxx.xxx.xxx.xxx
CSTP connected
Established DTLS connection
ここで非常に重要なのが、
X-CSTP-Address: 10.x.x.x
です。
MillenVPN側からはVPN内で利用するIPアドレスが正常に払い出されています。
つまり、
MillenVPNサーバーからIPアドレスを受け取るところまでは正常
でした。
問題は、その情報をWindowsのネットワーク設定へ反映する処理にあります。
OpenConnect-GUI v1.5.3でエラーを確認
当初使用していたOpenConnect-GUIはv1.5.3でした。
ログの最後に次のエラーが出ていました。
Could not open %LOCALAPPDATA%\Temp\vpnc.log: 5
VPNサーバーとの接続そのものは成功しているにもかかわらず、その後のWindows側の処理で問題が発生しています。
そこでOpenConnect-GUIを新しいバージョンへ更新しました。
v1.6.2へ更新したところ原因がさらに明確になった
OpenConnect-GUI v1.6.2へ更新して再接続すると、ログの内容が変わりました。
VPN接続は引き続き正常です。
CSTP connected
Established DTLS connection
一方で、その直後に次のエラーが出ました。
Script 'C:\Program Files\OpenConnect-GUI\vpnc-script.js' returned error 1
Failed to spawn script 'C:\Program Files\OpenConnect-GUI\vpnc-script.js'
さらに、
Could not open %LOCALAPPDATA%\Temp\vpnc.log
も表示されます。
ここでvpnc-script.jsが正常に実行されていないことが分かりました。
vpnc-script.jsとは何か
OpenConnectでは、VPNトンネルを確立するだけでなく、その後Windows側へ、
- VPN用IPアドレス
- サブネットマスク
- DNSサーバー
- ルーティング
などを設定する必要があります。
その処理を担当しているのがvpnc-scriptです。
Windows版OpenConnect-GUIではJavaScript形式の
vpnc-script.js
が利用されています。
今回VPNサーバーとの接続は成功していたにもかかわらずIPアドレスが変わらなかったのは、このスクリプトが正常に動いていなかったためでした。
cscriptで直接実行してみる
そこでコマンドプロンプトからvpnc-script.jsを直接実行してみました。
cd "C:\Program Files\OpenConnect-GUI"
cscript vpnc-script.js
すると次のエラーが表示されました。
入力エラー: ファイル拡張子 ".js" を持つスクリプト エンジンはありません。
ここで原因がほぼ確定しました。
Windowsが.jsファイルをWindows Script HostのJScriptとして実行できない状態になっていました。
.jsの関連付けを確認
Windowsのレジストリで.jsの関連付けを確認します。
管理者権限のコマンドプロンプトで、
reg query HKCR\.js /ve
を実行します。
正常な環境では、.jsに対してJScript用のファイルタイプが関連付けられています。
今回の環境ではこの関連付けが正常ではなく、cscriptがJavaScriptエンジンを見つけられない状態になっていました。
.jsの関連付けを修復
管理者権限のコマンドプロンプトから、.jsの関連付けを修復しました。
reg add HKCR\.js /ve /d JSFile /f
その後、OpenConnect-GUIを完全に終了してから再起動し、MillenVPN Native OpenConnectへ接続します。
すると、それまで通常回線のままだったグローバルIPアドレスがVPN側のIPアドレスへ切り替わりました。
問題は解消しました。
※この操作はWindowsの.jsファイル関連付けを変更します。reg query HKCR\.js /veで現在の状態を確認し、同じ症状・状態であることを確認したうえで実行してください。
今回の原因
今回の原因をまとめると次の通りです。
OpenConnect-GUIはMillenVPNのVPNサーバーには正常に接続できていました。
サーバーからVPN用IPアドレスも正常に払い出されています。
しかしWindows側で、
vpnc-script.js
を実行できませんでした。
そのため、
VPN接続成功
↓
VPN用IPを取得
↓
vpnc-script.jsの実行に失敗
↓
仮想NICへIPを設定できない
↓
VPN用ルートを設定できない
↓
通常回線から通信
という状態になっていました。
.jsの関連付けを修復したことでvpnc-script.jsが実行できるようになり、VPN用IPアドレスとルーティングが正常に設定されるようになりました。
同じ症状が出たときの確認手順
MillenVPN Native OpenConnectで「接続済みなのにIPアドレスが変わらない」という場合は、次の順番で確認すると原因を絞り込みやすいです。
1. グローバルIPを確認
OpenConnect接続前と接続後でIPアドレスを比較します。
コマンドから確認する場合は、IP確認サービスを利用できます。
VPN接続後も同じIPなら、次へ進みます。
2. ルーティングを確認
route print -4
VPN接続後にVPN側へ通信するルートが追加されているか確認します。
3. 仮想ネットワークアダプターを確認
Get-NetAdapter
TAPまたはWintunなど、OpenConnectが使用している仮想インターフェースを確認します。
4. 仮想NICのIPアドレスを確認
Get-NetIPConfiguration -InterfaceIndex <インターフェース番号>
VPN接続中にもかかわらず、
169.254.x.x
になっている場合は、VPN用IPアドレスの設定処理に失敗している可能性があります。
5. OpenConnect-GUIのログを確認
次のような行があるか確認します。
CSTP connected
Established DTLS connection
X-CSTP-Address: 10.x.x.x
これらが出ていれば、VPNサーバーとの接続やIPアドレス払い出しは成功している可能性が高くなります。
その後に、
vpnc-script.js returned error
などが出ていれば、Windows側の設定スクリプトを疑います。
6. JavaScriptエンジンを確認
cd "C:\Program Files\OpenConnect-GUI"
cscript vpnc-script.js
ここで、
ファイル拡張子 ".js" を持つスクリプト エンジンはありません
と表示された場合は、Windowsの.js関連付けを確認します。
reg query HKCR\.js /ve
必要に応じて関連付けを修復します。
reg add HKCR\.js /ve /d JSFile /f
Connected表示だけではVPNが使えているとは限らない
今回、最も分かりにくかったのはOpenConnect-GUIが「接続できている」ように見えたことでした。
実際、
CSTP connected
Established DTLS connection
まで成功しているため、VPNサーバーとのトンネル自体は確立されています。
しかし、VPNを実際のインターネット通信に使うためには、その後WindowsへIPアドレスやルーティングを設定する必要があります。
つまり、
VPNトンネルが接続されたことと、PCの通信がVPNを経由していることは同じではありません。
OpenConnect-GUIが接続済みになっているのにIPアドレスが変わらない場合は、IP確認サイトだけを見るのではなく、
OpenConnectログ
↓
仮想NIC
↓
IPアドレス
↓
ルーティング
↓
vpnc-script
の順番で確認すると原因を切り分けやすくなります。
まとめ
今回の問題はMillenVPNへの認証失敗やVPNサーバーへの接続障害ではありませんでした。
最終的な原因は、
Windowsで.jsのJScript関連付けが正常ではなく、OpenConnect-GUIのvpnc-script.jsを実行できなかったこと
でした。
その結果、VPNサーバーからIPアドレスを受け取っているにもかかわらず、Windowsの仮想ネットワークインターフェースへ設定されず、通常のプロバイダ回線から通信していました。
.jsの関連付けを修復した後はVPN用のネットワーク設定が正常に反映され、グローバルIPアドレスもMillenVPN側へ切り替わりました。
同じように、
「OpenConnect-GUIではConnectedなのにIPアドレスが変わらない」
という症状が出ている場合は、vpnc-script.jsが正常に実行できているかを確認してみる価値があります。
