Azure VPN Gateway と Fortigate で VPN がつながらない場合のトラブルシューティング方法


どこのご家庭にもある一般的な Fortigate 100E で Azure と VPN の接続検証をしてみたので、個人的なメモとして残しておきます。

各種ドキュメント

上記の公式ドキュメントにも記載がありますが、Azure 的には FortiOS 5.6 が最小要件となっています。
FortiOS 5.6 より古いファームウェアを使っている場合、VPN トンネルが張れているのにも関わらず通信が通らないなど
複数の既知の問題が確認されていますので、必ず FortiOS 5.6 以降のファームウェアに更新してから使いましょう。

また、Fortigate とは IKEv2 で接続するので、Azure 側はルートベースのゲートウェイを作りましょう。

構成手順

Cookbook の通りに設定すればつながったので省略。

VPN トンネルをクリア

diagnose vpn ike restart
diagnose vpn ike gateway clear

パケット採取

とりあえずパケット採取から。100E はストレージを積んでないので、CLI でキャプチャして、fgt2eth で pcap に変換すれば良さそう。

FG100E # diagnose sniffer packet any "" 6
fgt2eth.exe -in <上記でキャプチャしたテキスト ファイル> -out packet.pcap

VPN トンネルを確認

まず初めに、トンネルの一覧を取得して現状を確認。以下は接続できていない場合の例です。

FG100E # diagnose vpn tunnel list
list all ipsec tunnel in vd 0
------------------------------------------------------
name=Azure ver=2 serial=1 ff.ff.ff.ff:0->aa.aa.aa.aa:0
bound_if=7 lgwy=static/1 tun=intf/0 mode=auto/1 encap=none/8 options[0008]=npu
proxyid_num=1 child_num=0 refcnt=9 ilast=0 olast=0 ad=/0 itn-status=a1
stat: rxp=0 txp=0 rxb=0 txb=0 //切断状態なので、TX/RX ともに 0 になっています
dpd: mode=on-idle on=0 idle=20000ms retry=3 count=0 seqno=129956
natt: mode=none draft=0 interval=0 remote_port=0
proxyid=Azure proto=0 sa=0 ref=1 serial=1
 src: 0:0.0.0.0/0.0.0.0:0
 dst: 0:0.0.0.0/0.0.0.0:0

正常に接続出来ている状態だと、以下のような結果になるはず。

FG100E # diagnose vpn tunnel list
list all ipsec tunnel in vd 0
------------------------------------------------------
name=Azure ver=2 serial=1 xx.xx.xx.xx:0->yy.yy.yy.yy:0
bound_if=7 lgwy=static/1 tun=intf/0 mode=auto/1 encap=none/8 options[0008]=npu
proxyid_num=1 child_num=0 refcnt=12 ilast=6 olast=3 ad=/0 itn-status=a2
stat: rxp=3 txp=2 rxb=312 txb=168 //接続済みであればパケットがカウントされています
dpd: mode=on-idle on=1 idle=20000ms retry=3 count=0 seqno=129979
natt: mode=none draft=0 interval=0 remote_port=0
proxyid=Azure proto=0 sa=1 ref=3 serial=1
 src: 0:0.0.0.0/0.0.0.0:0
 dst: 0:0.0.0.0/0.0.0.0:0

 //先ほどまで表示されていなかった SA の情報が追加で出ています
 SA: ref=6 options=10026 type=00 soft=0 mtu=1438 expire=26584/0B replaywin=1024
 seqno=3 esn=0 replaywin_lastseq=00000003 itn=0
 life: type=01 bytes=0/0 timeout=26731/27000
 dec: spi=101af04b esp=aes key=32 47f48f9be216cd73b0583d192569138e2a44480dfca10e7b41a833f2b565bb3c
 ah=sha1 key=20 8da6cf572039a77cc454e39d294d47842f4fa71c
 enc: spi=b9c6a7b0 esp=aes key=32 d8361980da39eab24e49527f2b1c08ac0583114d7b94228d98b465e1c3366dce
 ah=sha1 key=20 88442398c9fb9fff1d76f6d0fc029ccdf9b50763
 dec:pkts/bytes=3/96, enc:pkts/bytes=2/304
 npu_flag=03 npu_rgwy=aa.aa.aa.aa npu_lgwy=ff.ff.ff.ff npu_selid=0 dec_npuid=1 enc_npuid=1

デバッグログの有効化

トンネルが正しく張れていない場合などは、IKE のデバッグ ログを有効化してみましょう。

トラブルシューティング ガイドには 2 パターン書かれていますが、それぞれ何が違うんだろう・・・。(Phase 1, 2 ?)

diag vpn ike log 
diag debug app ike -1
diag debug enable

デバッグ ログを止める場合は以下のコマンドで。(以降の手順でも同様)

diagnose debug reset
diagnose debug disable

PSK の不一致

PSK が間違っている場合、以下のように明確に pre-shared key mismatch のログが出ます。

ike 0:Azure:230: PSK auth failed: probable pre-shared key mismatch
ike Negotiate SA Error: ike ike [6253]

Proposal Mismatch

SA の Proposal が一致しない (mismatch) 場合、以下のようなログが出ます。

//Fortigate から Azure へ接続要求 (SA_INIT) を送付
ike 0:Azure:781: sent IKE msg (SA_INIT): ff.ff.ff.ff:500->aa.aa.aa.aa:500, len=252, id=c9b9112fd4614416/0000000000000000
ike 0: comes aa.aa.aa.aa:500->ff.ff.ff.ff:500,ifindex=7....
ike 0: IKEv2 exchange=SA_INIT_RESPONSE id=c9b9112fd4614416/d00184a2a68d4b91 len=36
ike 0: in C9B9112FD4614416D00184A2A68D4B91292022200000000000000024000000080000000E

//Azure から応答を受信
ike 0:Azure:781: initiator received SA_INIT response
ike 0:Azure:781: processing notify type NO_PROPOSAL_CHOSEN
ike 0:Azure:781: malformed message
ike 0: comes aa.aa.aa.aa:500->ff.ff.ff.ff:500,ifindex=7....
ike 0: IKEv2 exchange=SA_INIT id=d4455f39cff0dd02/0000000000000000 len=620
ike 0: in D4455F39CFF0DD02000000000000000021202208000000000000026C220001040200002C010100040300000C0100000C800E01000300000803000002030000080200000200000008040000020200002C020100040300000C0100000C800E0100030000080300000C030000080200000500000008040000020200002C030100040300000C0100000C800E00800300000803000002030000080200000200000008040000020200002C040100040300000C0100000C800E0080030000080300000C030000080200000500000008040000020200002805010004030000080100000303000008030000020300000802000002000000080400000200000028060100040300000801000003030000080300000C0300000802000005000000080400000228000088000200004191FDF37EC6B68E1EFC9C40EDCE63919DE238DCD0A45B2B165EE30D6B0050953F4D4617E4449B4E96D455DEB34660FBA90308D82D11F29726B1BE27DB39DDC1605A2AC986F00D7F150649C954FA56ECC0183F1020FEFBCDA895F5A8EF33D959F0C1685C81AE533F1FE4904E2F8E9C4A300E8CD7795D1232910E68C852CAD9DE2900003499BE0BCCC36A0A9785CD1A2648ACB60B6E04D55DD3164797685AA6B06722E13D17CDACB1039FA8C7F01A697901B453442900001C000040048BF34E42B5DCB2F629EA1E8D91A7C71CB30388ED2B00001C00004005727E19E5CC569747EC22A6DD9CC63D94AA49EE642B0000181E2B516905991C7D7C96FCBFB587E461000000092B000014FB1DE3CDF341B7EA16B7E5BE0855F1202B00001426244D38EDDB61B3172A36E3D0CFB8190000001801528BBBC00696121849AB9A1C5B2A5100000002
ike 0:d4455f39cff0dd02/0000000000000000:782: responder received SA_INIT msg
ike 0:d4455f39cff0dd02/0000000000000000:782: received notify type NAT_DETECTION_SOURCE_IP
ike 0:d4455f39cff0dd02/0000000000000000:782: received notify type NAT_DETECTION_DESTINATION_IP

//Azure 側から受け取った proposal
ike 0:d4455f39cff0dd02/0000000000000000:782: incoming proposal:
ike 0:d4455f39cff0dd02/0000000000000000:782: proposal id = 1:
ike 0:d4455f39cff0dd02/0000000000000000:782:   protocol = IKEv2:
ike 0:d4455f39cff0dd02/0000000000000000:782:      encapsulation = IKEv2/none
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=ENCR, val=AES_CBC (key_len = 256)
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=INTEGR, val=AUTH_HMAC_SHA_96
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=PRF, val=PRF_HMAC_SHA
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=DH_GROUP, val=MODP1024.
ike 0:d4455f39cff0dd02/0000000000000000:782: proposal id = 2:
ike 0:d4455f39cff0dd02/0000000000000000:782:   protocol = IKEv2:
ike 0:d4455f39cff0dd02/0000000000000000:782:      encapsulation = IKEv2/none
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=ENCR, val=AES_CBC (key_len = 256)
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=INTEGR, val=AUTH_HMAC_SHA2_256_128
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=PRF, val=PRF_HMAC_SHA2_256
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=DH_GROUP, val=MODP1024.
ike 0:d4455f39cff0dd02/0000000000000000:782: proposal id = 3:
ike 0:d4455f39cff0dd02/0000000000000000:782:   protocol = IKEv2:
ike 0:d4455f39cff0dd02/0000000000000000:782:      encapsulation = IKEv2/none
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=ENCR, val=AES_CBC (key_len = 128)
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=INTEGR, val=AUTH_HMAC_SHA_96
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=PRF, val=PRF_HMAC_SHA
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=DH_GROUP, val=MODP1024.
ike 0:d4455f39cff0dd02/0000000000000000:782: proposal id = 4:
ike 0:d4455f39cff0dd02/0000000000000000:782:   protocol = IKEv2:
ike 0:d4455f39cff0dd02/0000000000000000:782:      encapsulation = IKEv2/none
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=ENCR, val=AES_CBC (key_len = 128)
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=INTEGR, val=AUTH_HMAC_SHA2_256_128
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=PRF, val=PRF_HMAC_SHA2_256
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=DH_GROUP, val=MODP1024.
ike 0:d4455f39cff0dd02/0000000000000000:782: proposal id = 5:
ike 0:d4455f39cff0dd02/0000000000000000:782:   protocol = IKEv2:
ike 0:d4455f39cff0dd02/0000000000000000:782:      encapsulation = IKEv2/none
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=ENCR, val=3DES_CBC
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=INTEGR, val=AUTH_HMAC_SHA_96
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=PRF, val=PRF_HMAC_SHA
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=DH_GROUP, val=MODP1024.
ike 0:d4455f39cff0dd02/0000000000000000:782: proposal id = 6:
ike 0:d4455f39cff0dd02/0000000000000000:782:   protocol = IKEv2:
ike 0:d4455f39cff0dd02/0000000000000000:782:      encapsulation = IKEv2/none
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=ENCR, val=3DES_CBC
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=INTEGR, val=AUTH_HMAC_SHA2_256_128
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=PRF, val=PRF_HMAC_SHA2_256
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=DH_GROUP, val=MODP1024.

//Fortigate 側の proposal
ike 0:d4455f39cff0dd02/0000000000000000:782: my proposal, gw Azure:
ike 0:d4455f39cff0dd02/0000000000000000:782: proposal id = 1:
ike 0:d4455f39cff0dd02/0000000000000000:782:   protocol = IKEv2:
ike 0:d4455f39cff0dd02/0000000000000000:782:      encapsulation = IKEv2/none
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=ENCR, val=DES_CBC
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=INTEGR, val=AUTH_HMAC_MD5_96
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=PRF, val=PRF_HMAC_MD5
ike 0:d4455f39cff0dd02/0000000000000000:782:         type=DH_GROUP, val=MODP1024.

//no proposal chosen で Fortigate と Azure の proposal が一致しないためエラーになっている
ike 0:d4455f39cff0dd02/0000000000000000:782: lifetime=28800
ike 0:d4455f39cff0dd02/0000000000000000:782: no proposal chosen
ike Negotiate SA Error: ike ike  [9697]

正常な場合のログは以下。

//Fortigate から Azure へ接続要求 (SA_INIT) を送付
ike 0:Azure:815: sent IKE msg (SA_INIT): ff.ff.ff.ff:500->aa.aa.aa.aa:500, len=340, id=a773817d787e06a4/0000000000                                                                                                                        000000
ike 0: comes aa.aa.aa.aa:500->ff.ff.ff.ff:500,ifindex=7....
ike 0: IKEv2 exchange=SA_INIT_RESPONSE id=a773817d787e06a4/5d4182e9c4e71157 len=364
ike 0: in A773817D787E06A45D4182E9C4E7115721202220000000000000016C220000300000002C010100040300000C0100000C800E0100030                                                                                                                        000080300000203000008020000020000000804000002280000880002000041168ABAA25B349FEF74B97112D464ACBDD24E9D415DB600ADA95C48                                                                                                                        F9FB09DD63388A7C14FDBF75EA926F25A97DFED9BDE66FD5E614A7B3FA0E6E72C4D25F018B709EFECFCDCADD3D3407B3821658A63EC9B9396EDCC                                                                                                                        AAFC79B68362928275364452E4513CD12AAD700846D45E52A8C91B3DF1168BE4A28BFCCCA1030949CAD29000034C2C8CB225C4F02C82BA41D222F                                                                                                                        C47318C9BB968E42109586814018DD44781D172DA7821374A5C71FF61120A6D5D8ADE92900001C0000400412B129D9A38E93680D50A89633A517B                                                                                                                        C0DF692582B00001C0000400572B08CE048FE1A5A0644D512093F674262CDEACE2B0000181E2B516905991C7D7C96FCBFB587E461000000090000                                                                                                                        0014FB1DE3CDF341B7EA16B7E5BE0855F120

//Azure から応答を受信
ike 0:Azure:815: initiator received SA_INIT response
ike 0:Azure:815: processing notify type NAT_DETECTION_SOURCE_IP
ike 0:Azure:815: ignoring unauthenticated notify payload (NAT_DETECTION_SOURCE_IP)
ike 0:Azure:815: processing notify type NAT_DETECTION_DESTINATION_IP
ike 0:Azure:815: ignoring unauthenticated notify payload (NAT_DETECTION_DESTINATION_IP)

//Azure 側から受け取った proposal
ike 0:Azure:815: incoming proposal:
ike 0:Azure:815: proposal id = 1:
ike 0:Azure:815:   protocol = IKEv2:
ike 0:Azure:815:      encapsulation = IKEv2/none
ike 0:Azure:815:         type=ENCR, val=AES_CBC (key_len = 256)
ike 0:Azure:815:         type=INTEGR, val=AUTH_HMAC_SHA_96
ike 0:Azure:815:         type=PRF, val=PRF_HMAC_SHA
ike 0:Azure:815:         type=DH_GROUP, val=MODP1024.

//Fortigate 側と一致した proposal
ike 0:Azure:815: matched proposal id 1
ike 0:Azure:815: proposal id = 1:
ike 0:Azure:815:   protocol = IKEv2:
ike 0:Azure:815:      encapsulation = IKEv2/none
ike 0:Azure:815:         type=ENCR, val=AES_CBC (key_len = 256)
ike 0:Azure:815:         type=INTEGR, val=AUTH_HMAC_SHA_96
ike 0:Azure:815:         type=PRF, val=PRF_HMAC_SHA
ike 0:Azure:815:         type=DH_GROUP, val=MODP1024.

//INITIAL-CONTACT を送付
ike 0:Azure:815: lifetime=28800
ike 0:Azure:815: IKE SA a773817d787e06a4/5d4182e9c4e71157 SK_ei 32:936D0D524FBD63007463875227CCF5EBF8E57329DEB3CAA91E                                                                                                                        3E2EB2E888CD10
ike 0:Azure:815: IKE SA a773817d787e06a4/5d4182e9c4e71157 SK_er 32:47962985DA68DEB918F4046430BE910B47081089B99EF38507                                                                                                                        1C0B517A3B0AAA
ike 0:Azure:815: IKE SA a773817d787e06a4/5d4182e9c4e71157 SK_ai 20:289FE8FA93A7F8428E837BFBAF9C0DEAB3315E65
ike 0:Azure:815: IKE SA a773817d787e06a4/5d4182e9c4e71157 SK_ar 20:CCA087CA7FFBC1F6F89A56A6EF762EEDA60EA9D4
ike 0:Azure:815: initiator preparing AUTH msg
ike 0:Azure:815: sending INITIAL-CONTACT

あ、当然ですが Fortigate のコンフィグとかトラブルシューティングは Fortinet 社に確認してくださいね。MS から各社の VPN デバイスについて正式な回答とかできるはずもないので、その辺は是非とも空気読んでくださいませ。

また気が向いたら追記します。

その他

Azure VPN Gateway 側でもログが取れるようになってたので、以下も併せてどうぞ。

Azure との VPN 接続がうまくいかない場合のデバッグ方法

あと、Jazug Night で登壇した際に更に詳しい話をしたので、以下のスライド P.64 – 73 や YouTube の録画 (1:03:36 – 1:18:50) もご確認ください。


2 comments for “Azure VPN Gateway と Fortigate で VPN がつながらない場合のトラブルシューティング方法

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください