FortiGateを使った拠点間VPN構築は、企業ネットワークの基本中の基本です。本部と支店、あるいは複数拠点を安全に接続するIPsec VPNは、実務でほぼ確実に要求されるスキルといえます。今回は、FortiGateによる拠点間IPsec VPNの設定を、実機での操作画面やCLI出力を交えながら詳しく解説します。
私が初めてFortiGateでVPNを構築したとき、Phase1とPhase2の設定パラメータが一致せず、トンネルが確立できないトラブルに丸一日悩まされました。結局、片側でAESの鍵長が256bit、もう片側が128bitになっていたという単純ミスでした。
それ以来、VPN設定時は必ず両拠点のパラメータを並べて記載したチェックシートを作成し、設定前に確認するようにしています。このような小さなミスマッチが、実は現場で最も多いトラブルです。
IPsec VPNは、インターネットなどのパブリックネットワークを経由しながらも、拠点間を安全に接続するための技術です。FortiGateのIPsec VPNは、2つのフェーズに分かれて動作します。
Phase1は、VPNトンネルを構築するための「信頼関係」を確立するフェーズです。ここでは以下のような情報をネゴシエーションします。
Phase1で定義する主要パラメータ
| パラメータ | 説明 | 推奨値 |
|---|---|---|
| 認証方式 | 相手を認証する方法(事前共有鍵 or 証明書) | PSK |
| 暗号化アルゴリズム | データの暗号化方式 | AES256 |
| 認証アルゴリズム | データの改ざん検知方式 | SHA256 |
| DHグループ | 鍵交換の強度を決める | 14以上 |
| ライフタイム | 鍵の有効期間 | 28800秒 |
Phase2では、Phase1で確立した安全な通信路を使って、実際のデータを暗号化するための設定を行います。ここで指定するのは、どのネットワーク同士を接続するか、どのような暗号化方式を使うか、といった具体的な通信パラメータです。
図1: Phase1とPhase2の処理時間比較
Phase1は重い暗号化処理が必要なため時間がかかりますが、一度確立すれば長時間維持されます。Phase2は軽量で、再接続も高速です。この理解が、トラブルシューティング時に非常に役立ちます。
まずはGUI(Web管理画面)での設定方法を解説します。今回は、本社(Site-A)と支店(Site-B)を接続する想定で進めます。
構築する拠点間VPNの環境情報
| 項目 | Site-A(本社) | Site-B(支店) |
|---|---|---|
| WAN側IP | 203.0.113.10 | 198.51.100.20 |
| LAN側セグメント | 192.168.10.0/24 | 192.168.20.0/24 |
| FortiGate LAN IP | 192.168.10.1 | 192.168.20.1 |
| 事前共有鍵 | MySecureP@ssw0rd!2024 | |
FortiGate管理画面から「VPN」→「IPsec Wizard」を選択します。
「Site to Site」を選択し、Nextをクリックします。
VPN名(例:to_SiteB)、Remote Gateway(対向のWAN IP)、Pre-shared Key を入力します。
Site-Aでの具体的な設定内容は以下の通りです。
VPN Name: to_SiteB
Remote Gateway: Static IP Address
IP Address: 198.51.100.20
Interface: wan1
Pre-shared Key: MySecureP@ssw0rd!2024
Advanced Settings:
IKE Version: 2
Encryption: AES256
Authentication: SHA256
Diffie-Hellman Group: 14
Key Lifetime: 28800
Phase1の設定パラメータ(暗号化方式、認証方式、DHグループ、ライフタイム)は両拠点で完全に一致させる必要があります。一つでも違うとトンネルが確立しません。特にDHグループの不一致は見落としがちなので要注意です。
Phase1の設定が完了したら、続けてPhase2を設定します。ウィザードの次画面で以下を入力します。
Local Address: 192.168.10.0/24
Remote Address: 192.168.20.0/24
Advanced Settings:
Encryption: AES256
Authentication: SHA256
PFS (Perfect Forward Secrecy): Enable
Diffie-Hellman Group: 14
Key Lifetime: 3600 seconds
PFS(Perfect Forward Secrecy)を有効にすることで、万が一鍵が漏洩しても過去の通信は保護されます。セキュリティ要件が高い環境では必ず有効化してください。
VPNトンネルを作成しただけでは通信できません。VPN経由の通信を許可するファイアウォールポリシーが必要です。
「Policy & Objects」→「Firewall Policy」を選択し、「Create New」をクリックします。
Incoming Interface: internal、Outgoing Interface: to_SiteB、Source/Destination: all、Service: ALL、Action: ACCEPTに設定します。
Incoming Interface: to_SiteB、Outgoing Interface: internal でも同様にポリシーを作成します。
双方向のポリシーを作成することで、相互に通信できるようになります。実務では、セキュリティポリシーに応じてSourceやDestination、Serviceを適切に制限します。
GUIでの設定方法を理解したら、CLI(コマンドラインインターフェース)での設定も押さえておきましょう。大量の拠点を設定する場合や、設定の自動化を行う場合はCLIが必須です。
SSH等でFortiGateにログインし、以下のコマンドを実行します。
config vpn ipsec phase1-interface
edit "to_SiteB"
set interface "wan1"
set ike-version 2
set keylife 28800
set peertype any
set net-device disable
set proposal aes256-sha256
set dhgrp 14
set remote-gw 198.51.100.20
set psksecret MySecureP@ssw0rd!2024
next
end
config vpn ipsec phase2-interface
edit "to_SiteB"
set phase1name "to_SiteB"
set proposal aes256-sha256
set dhgrp 14
set keylifeseconds 3600
set pfs enable
set src-subnet 192.168.10.0/24
set dst-subnet 192.168.20.0/24
next
end
config firewall policy
edit 0
set name "LAN_to_VPN"
set srcintf "internal"
set dstintf "to_SiteB"
set srcaddr "all"
set dstaddr "all"
set action accept
set schedule "always"
set service "ALL"
set logtraffic all
next
edit 0
set name "VPN_to_LAN"
set srcintf "to_SiteB"
set dstintf "internal"
set srcaddr "all"
set dstaddr "all"
set action accept
set schedule "always"
set service "ALL"
set logtraffic all
next
end
「edit 0」を使うことで、新しいポリシーIDが自動で割り当てられます。また、「set logtraffic all」を指定することで、通信ログが記録され、トラブルシューティング時に役立ちます。
VPN設定が完了したら、実際にトンネルが確立しているか、通信が可能かを確認します。FortiGateには便利な確認コマンドが用意されています。
diagnose vpn ike gateway list name to_SiteB
正常に接続されている場合の出力例です。
vd: root/0
name: to_SiteB
version: 2
interface: wan1 4
addr: 203.0.113.10:500 -> 198.51.100.20:500
created: 125s ago
IKE SA: created 1/1 established 1/1 time 0/0/0 ms
IPsec SA: created 1/1 established 1/1 time 0/0/0 ms
id/spi: 342 a5f3d9c8b2e14f67/4d8e9a1c3b5f2706
direction: initiator
status: established 125-125s ago = 0s
proposal: aes256-sha256
key: a4b9c8d7e6f5-d9e8f7a6b5c4
lifetime/rekey: 28800/28494
DPD sent/recv: 00000000/00000000
「status: established」となっていれば、Phase1が正常に確立しています。「created 1/1 established 1/1」は成功率を示しており、失敗がないことを意味します。
diagnose vpn tunnel list name to_SiteB
正常な場合の出力例:
name=to_SiteB ver=2 serial=3 203.0.113.10:0->198.51.100.20:0
bound_if=4 lgwy=static/1 tun=intf/0 mode=auto/1 encap=none/536
proxyid_num=1 child_num=0 refcnt=4 ilast=2 olast=2 ad=/0
stat: rxp=56 txp=48 rxb=7896 txb=6432
dpd: mode=on-demand on=1 idle=20000ms retry=3 count=0 seqno=0
natt: mode=none draft=0 interval=0 remote_port=0
proxyid=to_SiteB proto=0 sa=1 ref=2 serial=1
src: 0:192.168.10.0/255.255.255.0:0
dst: 0:192.168.20.0/255.255.255.0:0
SA: ref=3 options=226 type=00 soft=0 mtu=1438 expire=3266/0B replaywin=2048
seqno=31 esn=0 replaywin_lastseq=00000030 qat=0 rekey=0 hash_search_len=1
life: type=01 bytes=0/0 timeout=3600/3266
dec: spi=d8e4f9a2 esp=aes key=32 b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3
ah=sha256 key=32 f3e2d1c0b9a8f7e6d5c4b3a2f1e0d9c8
enc: spi=4c7d8e9a esp=aes key=32 a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
ah=sha256 key=32 d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2a1
npu_flag=00 npu_rgwy=198.51.100.20 npu_lgwy=203.0.113.10 npu_selid=3 dec_npuid=0 enc_npuid=0
「stat」行でパケット送受信カウント(rxp/txp)とバイト数(rxb/txb)が確認できます。この値が増加していれば、実際にデータが流れています。「expire」は残りの有効時間を秒単位で示しています。
FortiGateから対向拠点のネットワークへPingを送信します。
execute ping-options source 192.168.10.1
execute ping 192.168.20.1
成功時の出力例:
PING 192.168.20.1 (192.168.20.1): 56 data bytes
64 bytes from 192.168.20.1: icmp_seq=0 ttl=255 time=12.3 ms
64 bytes from 192.168.20.1: icmp_seq=1 ttl=255 time=11.8 ms
64 bytes from 192.168.20.1: icmp_seq=2 ttl=255 time=12.1 ms
64 bytes from 192.168.20.1: icmp_seq=3 ttl=255 time=12.0 ms
64 bytes from 192.168.20.1: icmp_seq=4 ttl=255 time=11.9 ms
--- 192.168.20.1 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 11.8/12.0/12.3 ms
パケットロスがなく、応答が返っていればVPN経由の通信が成功しています。通常、VPN経由の場合は暗号化処理のオーバーヘッドにより、レイテンシは直接接続より若干高くなります。
図2: VPN接続確認項目の重要度
VPN構築時には様々なトラブルが発生します。ここでは現場で頻出する問題とその解決方法を解説します。
Phase1トラブルの主な原因と対処法
| 原因 | 確認コマンド | 対処法 |
|---|---|---|
| 事前共有鍵の不一致 | diagnose debug application ike -1 | PSKを再確認し統一 |
| UDP500/4500ブロック | diagnose sniffer packet wan1 | FW設定確認 |
| 暗号化方式の不一致 | show vpn ipsec phase1-interface | proposalを統一 |
| DHグループの不一致 | get vpn ipsec phase1-interface | dhgrpを統一 |
| 対向IPアドレス誤り | execute ping 対向IP | remote-gw修正 |
Phase1のデバッグには、IKEデバッグが非常に有効です。
diagnose debug reset
diagnose debug application ike -1
diagnose debug enable
このコマンドで、IKEネゴシエーションの詳細ログがリアルタイムで表示されます。認証失敗やパラメータ不一致などのエラーメッセージが確認できます。
ike 0:to_SiteB: IKE Responder: new
ike 0:to_SiteB: negotiation result
ike 0:to_SiteB: proposal id = 1:
protocol = ISAKMP
encapsulation = IKE/none
type = dynamic
authentication = pre-shared key
dh-group = 14
encryption = aes256
hash = sha256
lifetime = 28800
ike 0:to_SiteB: SA established
Phase1が成功してもPhase2が確立しない場合、主にネットワーク設定やポリシーの問題です。
diagnose vpn tunnel list
# proxyid_num=0 の場合、Phase2が未確立
# Phase2デバッグ
diagnose debug reset
diagnose debug application ike 255
diagnose debug enable
Phase2のsrc-subnetとdst-subnetが対向側と逆転して設定されているケースが非常
