NVR500 L2TP/IPsec VPNサーバにWindows 10 VPNアプリから接続してみた。
NVR500は、Rev.11.00.38
Windows 10は、バージョン 1803/OSビルド 17136.619
Windows 10は、NAT Traversalが利用できるようレジストリに設定が必要である情報が多く見受ける。(HKLM¥SYSTEM¥CurrentControlSet¥Services¥PolicyAgent¥AssumeUDPEncapsulationContextOnSendRule=(DWORD)2)
確認してみたが、上記バージョンでは、設定不要である。
「L2TP」を選択し、
「VPNサーバアドレス」「共有鍵」と「ユーザ名」「ユーザパスワード」を設定
![](https://blogimg.goo.ne.jp/user_image/16/4b/db65547c5aa6a29042755598e69299be.png)
接続
![](https://blogimg.goo.ne.jp/user_image/77/f1/86f4bf56968288284e358afbfda20a7d.png)
WiresharkでL2TP/IPsecのパケットを解析するため「ヤマハNVR500のL2TP/IPsec VPNパケットをWiresharkで解析」で作成したLUAスクリプトでISAKMP/ESP復号鍵を抽出してみた。
NVR500の設定は、
(ISAKMP)部 [IKE sa]
ipsec ike encryption gateway_id 3des-cbc (default):[3des-cbc/des-cbc/aes-cbc/aes256-cbc]
ipsec ike group gateway_id mod1024 (default):[mod768/mod1024/mod1536/mod2048]
ipsec ike hash gateway_id sha (default):[sha256/sha/md5]
ipsec ike pfs gateway_id off (default):[on/off]
*応答側で動作する場合は、定義された選択肢内で相手側のproposalに合わせられる。端末側のproposalに従うため設定しない。
(ESP)部 [ESP sa]
ipsec sa policy policy_id gateway_id esp aes-cbc sha-hmac
(iOS/macOSは、sha256-hmacでエラーとなる。nvr500から有効な暗号鍵(first 16bytes に依存)を得るには、aes-cbc)
接続直後のNVR500
「show ipsec sa」
「show ipsec sa gateway 2 detail」
の結果(シリアルコンソール)
(ISAKMP)部 SA[1]で
aes256-cbc
sha-1
modp2048
(ESP)部 SA[2]SA[3]で
aes-cbc
hmac-sha
LUAスクリプトの実行
![](https://blogimg.goo.ne.jp/user_image/45/14/7079356f592aa57815a053e16cee0a21.png)
結果、(ISAKMP)部の鍵が20Bytes(160bits)で抽出された。aes256-cbcなので32Bytes(256bits)のはずだが。。。
ログを確認してみると確かに「SKEY_ID」が20Bytesしか記録されていない
![](https://blogimg.goo.ne.jp/user_image/41/a5/efea654d28c27a6ef7bc032e7c752161.png)
「show ipsec sa gateway 2 detail」で表示されるSA[1]のKEY 8Bytes とSKEY_ID値の先頭8Bytesと一致しない。この20BytesのデータでISAKMPデータを復号できない。
(ESP)部で記録される鍵は、aes-cbcのespデータを復号できる
![](https://blogimg.goo.ne.jp/user_image/43/2e/1f1604174c27941616b837a7b7692947.png)
iPhone6S(iOS)/macOS Sierra(iPhone6SでWiFiテザリング)で接続すると(ISAKMP) aes256-cbc/sha2-256/modp2048 (ESP) aes-cbc/hmac-shaで接続する。Windows10と(ISAKMP)部のIntegrityCheckMethodが異なる。
iOS/macOSと同じように(ISAKMP)部でaes256-cbc/sha2-256/modp2048で接続するようPowershellの「Set-VpnConnectionIPsecConfiguration」で指定してみた。
設定するパラメータは、「AuthenticationTransformConstants」「CipherTransformConstants」「DHGroup」「IntegrityCheckMethod」「PfsGroup」「EncryptionMethod」と「ConnectionName」で、全てを指定しないとエラーになる。
「AuthenticationTransformConstants」で「Accepted Values」に「SHA1」が見当たらない。
![](https://blogimg.goo.ne.jp/user_image/50/71/fced6c6539fa0011a47859b8e3a54699.png)
どうも「SHA1-96」を省略結合した「SHA196」が「SHA1」を示すようだ。指定値とし「SHA1」または「SHA196」。表示は、「SHA196」となる。
「IntegrityCheckMethod」では、「Accepted Values」に「SHA1」記載、解説には「SHA196」
![](https://blogimg.goo.ne.jp/user_image/2d/67/78cc0bdcb309e10bc335d0862e23a751.png)
指定値「SHA1」で表示値「SHA1」となる。
NVR500側の「aes-cbc」「aes256-cbc」「sha-hmac」「sha256-hmac」設定と「Set-VpnConnectionIPsecConfiguration」のパラメータ設定値の組み合わせで、接続結果を下表にまとめた。太字(ボールド)は、iOS/macOSで接続した時。セル背景グリーンは、Win10デフォルトでの接続時。
![](https://blogimg.goo.ne.jp/user_image/5e/11/f13eb5168c2155e3107b649bc4037f77.png)
![](https://blogimg.goo.ne.jp/user_image/0a/a5/c3392b52eb358e54622c8989491e4125.png)
(ISAKMP)部でaes256-cbc/sha2-256/modp2048で接続されたことが確認できる
![](https://blogimg.goo.ne.jp/user_image/3e/c8/2d260967c531d74197ca9bd7c46f2000.png)
LUAスクリプトでログから鍵を抽出する。
![](https://blogimg.goo.ne.jp/user_image/4b/99/4a95c3f5af0bb37caa0092aa25a3c0fd.png)
「SKEYID_e」も32Bytes(256bits長)が記録される。キー値の先頭8Bytesと「show ipsec sa gateway 2 detail」の(ISAKMP)部KEY値が一致することを確認。
![](https://blogimg.goo.ne.jp/user_image/3e/bc/29943aa9631e700818be0b464b8e7f28.png)
生成された「ikev1_decryption_table」「esp_sa」鍵ファイルをWiresharkに取込みパケット解析する。ISAKMP部が復号されているのを確認。
![](https://blogimg.goo.ne.jp/user_image/15/38/69e2f6b8e90a3ea1054f390a114a51ad.png)
結果
NVR500のL2TP/IPsec接続で、ISAKMPフェーズ1で「SHA1」が選択されるとログに記録される復号鍵が壊れている
追記
上記接続表の斜体文字(Italic)で示した条件で接続するとISAKMPのフェーズ1でSA[1]が生成され、フェーズ2でSA[2](send)、SA[3](receive)のSAが生成される。さらにSA[4]なる接続を確立しようとしてタイムアウトで接続に失敗する。NVR500には、SA[1]-SA[3]が削除されSA[4]だけ残っているのが確認された。Win10側の挙動としては、接続失敗までに長い時間がかかる。その間に「show ipsec sa gateway 2 detail」でSAの状態が確認できる。下記例では、SA[4]が生成されていないが、接続失敗後にSA[3]が残っている。条件により異なるのだと思う。何れにしても「ヤマハ」さんが解決する事と思う。
(追記):SA[1],SA[2],SA[3]が生成され、接続失敗で、SA[1],SA[2]が削除され、SA[3]が残る。SA[3]が生存中に再度接続が行われるとSA[1],SA[2],SA[4]が生成され、再度接続失敗でSA[1],SA[2],SA[3]が削除され、SA[4]が残る。というような状況。
Powershellで条件を設定
![](https://blogimg.goo.ne.jp/user_image/6b/32/164f22a64a3a50a94d5f8ca91c74be0c.png)
Win10のVPN接続で「長い接続中表示」の後の接続失敗表示
![](https://blogimg.goo.ne.jp/user_image/30/87/e63ae02f0f6409577953e15173a4672b.png)
接続中の「show ipsec sa」の結果
![](https://blogimg.goo.ne.jp/user_image/66/b1/0089d00fde457f00234dcb9f67b98028.png)
接続中の「show ipsec sa gateway 2 detail」の結果
![](https://blogimg.goo.ne.jp/user_image/16/48/77448f02e950808ebdc1b3ccef603fa9.png)
接続失敗表示後の「show ipsec sa」と「show ipsec sa gateway 2 detail」の結果
![](https://blogimg.goo.ne.jp/user_image/46/f4/6416fade058bf66b323f9fcff87a0abe.png)
NVR500は、Rev.11.00.38
Windows 10は、バージョン 1803/OSビルド 17136.619
Windows 10は、NAT Traversalが利用できるようレジストリに設定が必要である情報が多く見受ける。(HKLM¥SYSTEM¥CurrentControlSet¥Services¥PolicyAgent¥AssumeUDPEncapsulationContextOnSendRule=(DWORD)2)
確認してみたが、上記バージョンでは、設定不要である。
「L2TP」を選択し、
「VPNサーバアドレス」「共有鍵」と「ユーザ名」「ユーザパスワード」を設定
![](https://blogimg.goo.ne.jp/user_image/16/4b/db65547c5aa6a29042755598e69299be.png)
接続
![](https://blogimg.goo.ne.jp/user_image/77/f1/86f4bf56968288284e358afbfda20a7d.png)
WiresharkでL2TP/IPsecのパケットを解析するため「ヤマハNVR500のL2TP/IPsec VPNパケットをWiresharkで解析」で作成したLUAスクリプトでISAKMP/ESP復号鍵を抽出してみた。
NVR500の設定は、
(ISAKMP)部 [IKE sa]
ipsec ike encryption gateway_id 3des-cbc (default):[3des-cbc/des-cbc/aes-cbc/aes256-cbc]
ipsec ike group gateway_id mod1024 (default):[mod768/mod1024/mod1536/mod2048]
ipsec ike hash gateway_id sha (default):[sha256/sha/md5]
ipsec ike pfs gateway_id off (default):[on/off]
*応答側で動作する場合は、定義された選択肢内で相手側のproposalに合わせられる。端末側のproposalに従うため設定しない。
(ESP)部 [ESP sa]
ipsec sa policy policy_id gateway_id esp aes-cbc sha-hmac
(iOS/macOSは、sha256-hmacでエラーとなる。nvr500から有効な暗号鍵(first 16bytes に依存)を得るには、aes-cbc)
![](https://blogimg.goo.ne.jp/user_image/48/be/0470151fe9cf39a583d6943b7097b59a.png)
「show ipsec sa」
「show ipsec sa gateway 2 detail」
の結果(シリアルコンソール)
(ISAKMP)部 SA[1]で
aes256-cbc
sha-1
modp2048
(ESP)部 SA[2]SA[3]で
aes-cbc
hmac-sha
LUAスクリプトの実行
![](https://blogimg.goo.ne.jp/user_image/45/14/7079356f592aa57815a053e16cee0a21.png)
結果、(ISAKMP)部の鍵が20Bytes(160bits)で抽出された。aes256-cbcなので32Bytes(256bits)のはずだが。。。
ログを確認してみると確かに「SKEY_ID」が20Bytesしか記録されていない
![](https://blogimg.goo.ne.jp/user_image/41/a5/efea654d28c27a6ef7bc032e7c752161.png)
「show ipsec sa gateway 2 detail」で表示されるSA[1]のKEY 8Bytes とSKEY_ID値の先頭8Bytesと一致しない。この20BytesのデータでISAKMPデータを復号できない。
(ESP)部で記録される鍵は、aes-cbcのespデータを復号できる
![](https://blogimg.goo.ne.jp/user_image/43/2e/1f1604174c27941616b837a7b7692947.png)
iPhone6S(iOS)/macOS Sierra(iPhone6SでWiFiテザリング)で接続すると(ISAKMP) aes256-cbc/sha2-256/modp2048 (ESP) aes-cbc/hmac-shaで接続する。Windows10と(ISAKMP)部のIntegrityCheckMethodが異なる。
iOS/macOSと同じように(ISAKMP)部でaes256-cbc/sha2-256/modp2048で接続するようPowershellの「Set-VpnConnectionIPsecConfiguration」で指定してみた。
設定するパラメータは、「AuthenticationTransformConstants」「CipherTransformConstants」「DHGroup」「IntegrityCheckMethod」「PfsGroup」「EncryptionMethod」と「ConnectionName」で、全てを指定しないとエラーになる。
「AuthenticationTransformConstants」で「Accepted Values」に「SHA1」が見当たらない。
![](https://blogimg.goo.ne.jp/user_image/50/71/fced6c6539fa0011a47859b8e3a54699.png)
どうも「SHA1-96」を省略結合した「SHA196」が「SHA1」を示すようだ。指定値とし「SHA1」または「SHA196」。表示は、「SHA196」となる。
「IntegrityCheckMethod」では、「Accepted Values」に「SHA1」記載、解説には「SHA196」
![](https://blogimg.goo.ne.jp/user_image/2d/67/78cc0bdcb309e10bc335d0862e23a751.png)
指定値「SHA1」で表示値「SHA1」となる。
NVR500側の「aes-cbc」「aes256-cbc」「sha-hmac」「sha256-hmac」設定と「Set-VpnConnectionIPsecConfiguration」のパラメータ設定値の組み合わせで、接続結果を下表にまとめた。太字(ボールド)は、iOS/macOSで接続した時。セル背景グリーンは、Win10デフォルトでの接続時。
![](https://blogimg.goo.ne.jp/user_image/5e/11/f13eb5168c2155e3107b649bc4037f77.png)
![](https://blogimg.goo.ne.jp/user_image/0a/a5/c3392b52eb358e54622c8989491e4125.png)
--- powershell command ---
設定変更
Set-VpnConnectionIPsecConfiguration -AuthenticationTransformConstants SHA1 -CipherTransformConstants AES128 -ConnectionName "L2TP IPsec on NVR500" -DHGroup Group14 -EncryptionMethod AES256 -IntegrityCheckMethod SHA256 -PfsGroup PFS2048
設定内容を確認
(Get-VpnConnection -Name "L2TP IPsec on NVR500").IPSecCustomPolicy
初期値に戻す
Set-VpnConnectionIPsecConfiguration -ConnectionName "L2TP IPsec on NVR500" -RevertToDefault
----------------
(ISAKMP)部でaes256-cbc/sha2-256/modp2048で接続されたことが確認できる
![](https://blogimg.goo.ne.jp/user_image/3e/c8/2d260967c531d74197ca9bd7c46f2000.png)
LUAスクリプトでログから鍵を抽出する。
![](https://blogimg.goo.ne.jp/user_image/4b/99/4a95c3f5af0bb37caa0092aa25a3c0fd.png)
「SKEYID_e」も32Bytes(256bits長)が記録される。キー値の先頭8Bytesと「show ipsec sa gateway 2 detail」の(ISAKMP)部KEY値が一致することを確認。
![](https://blogimg.goo.ne.jp/user_image/3e/bc/29943aa9631e700818be0b464b8e7f28.png)
生成された「ikev1_decryption_table」「esp_sa」鍵ファイルをWiresharkに取込みパケット解析する。ISAKMP部が復号されているのを確認。
![](https://blogimg.goo.ne.jp/user_image/15/38/69e2f6b8e90a3ea1054f390a114a51ad.png)
結果
NVR500のL2TP/IPsec接続で、ISAKMPフェーズ1で「SHA1」が選択されるとログに記録される復号鍵が壊れている
追記
上記接続表の斜体文字(Italic)で示した条件で接続するとISAKMPのフェーズ1でSA[1]が生成され、フェーズ2でSA[2](send)、SA[3](receive)のSAが生成される。さらにSA[4]なる接続を確立しようとしてタイムアウトで接続に失敗する。NVR500には、SA[1]-SA[3]が削除されSA[4]だけ残っているのが確認された。Win10側の挙動としては、接続失敗までに長い時間がかかる。その間に「show ipsec sa gateway 2 detail」でSAの状態が確認できる。下記例では、SA[4]が生成されていないが、接続失敗後にSA[3]が残っている。条件により異なるのだと思う。何れにしても「ヤマハ」さんが解決する事と思う。
(追記):SA[1],SA[2],SA[3]が生成され、接続失敗で、SA[1],SA[2]が削除され、SA[3]が残る。SA[3]が生存中に再度接続が行われるとSA[1],SA[2],SA[4]が生成され、再度接続失敗でSA[1],SA[2],SA[3]が削除され、SA[4]が残る。というような状況。
Powershellで条件を設定
![](https://blogimg.goo.ne.jp/user_image/6b/32/164f22a64a3a50a94d5f8ca91c74be0c.png)
Win10のVPN接続で「長い接続中表示」の後の接続失敗表示
![](https://blogimg.goo.ne.jp/user_image/30/87/e63ae02f0f6409577953e15173a4672b.png)
接続中の「show ipsec sa」の結果
![](https://blogimg.goo.ne.jp/user_image/66/b1/0089d00fde457f00234dcb9f67b98028.png)
接続中の「show ipsec sa gateway 2 detail」の結果
![](https://blogimg.goo.ne.jp/user_image/16/48/77448f02e950808ebdc1b3ccef603fa9.png)
接続失敗表示後の「show ipsec sa」と「show ipsec sa gateway 2 detail」の結果
![](https://blogimg.goo.ne.jp/user_image/46/f4/6416fade058bf66b323f9fcff87a0abe.png)