Oracle Cloud InfrastructureのSite-to-Site VPN機能をCisco 891FJで使ってみた記録です。

はじめに

  • 公式のサンプルは Cisco IOS のIKEv2 Configuration Templateにある通り
    • ただ手元で試した限り891FJでは動かなかった
  • ベンダに依存しないパラメータ一覧は Supported IPSec Parameters の通り
    • configではこの一覧のrecommendedに極力沿う

前提条件

  • OCIではIKEv1とIKEv2が選べるがv2を使う
  • ルーティングのやりとりはBGPと静的ルーティングが選べるがBGPを使う
    • ローカル側のas番号は適当に65534
  • IPSecトンネル内のIPアドレスは以下の通り
    • トンネル1
      • OCI側 172.31.1.1/30
      • ローカル側 172.31.1.2/30
    • トンネル2
      • OCI側 172.31.2.1/30
      • ローカル側 172.31.2.2/30
    • いずれもOCI側で指定する必要あり
      • ネットワーキング->顧客接続性->サイト間VPN (IPSec)->(作ったVPN名)
      • トンネル1/2の右側の三点リーダーから設定
      • BGPのas番号もここで指定する
  • CPE IKE識別子タイプはfqdnを使う
    • 値は 891fj.hoge.example
    • これもOCI側で指定
      • ネットワーキング->顧客接続性->サイト間VPN (IPSec)
      • 作ったVPNの右側の三点リーダーから設定
    • デフォルト値だとIPアドレスで、ローカル側はIPアドレス固定されてないため避けたかった

IKEv2系

# プロポーザルの作成
crypto ikev2 proposal OCI_PROPOSAL
 # 公式の Encryption algorithm
 encryption aes-cbc-256
 # 公式の Authentication algorithm
 integrity sha384
 # 公式の Diffie-Hellman group
 group 20

# ポリシーの作成
crypto ikev2 policy OCI_POLICY
 # 他にIKEv2を使うような通信していないのでany
 match fvrf any
 # プロポーザル紐づけ
 proposal OCI_PROPOSAL

# IKEv2プロファイル(トンネル1本目)
crypto ikev2 profile OCI_PROFILE_TUN1
 # OCI側識別子はIPアドレスを使っている
 match identity remote address <VPNトンネル1のOCI側グローバルIPアドレス> 255.255.255.255
 # ローカル側識別子はfqdnでやる
 identity local fqdn 891fj.hoge.example
 # 事前共有鍵 公式サンプルでは別途KeyRing作っていたが面倒なのでここで指定
 authentication remote pre-share key <VPNトンネル1の共有シークレット>
 authentication local pre-share key <VPNトンネル1の共有シークレット>
 # 公式の IKE session key lifetime
 lifetime 28800

# IKEv2プロファイル(トンネル2本目)
crypto ikev2 profile OCI_PROFILE_TUN2
 match identity remote address <VPNトンネル2のOCI側グローバルIPアドレス> 255.255.255.255
 identity local fqdn 891fj.hoge.example
 authentication remote pre-share key <VPNトンネル2の共有シークレット>
 authentication local pre-share key <VPNトンネル2の共有シークレット>
 lifetime 28800

IPSec系

# 公式の Encryption algorithm
crypto ipsec transform-set OCI_IPSEC_TS esp-gcm 256
 # 公式の IPSec protocol
 mode tunnel

# IPSecプロファイル(トンネル1と2で同じもの使う)
crypto ipsec profile OCI_IPSEC_PROFILE
 # トランスフォームセット紐づけ
 set transform-set OCI_IPSEC_TS
 # 公式の Perfect Forward Secrecy (PFS)
 set pfs group5
 # 公式の IPSec session key lifetime デフォルト値が3600なのでshow runには出ない
 set security-association lifetime seconds 3600

# サンプルにあったオススメ設定達
crypto ipsec security-association replay window-size 128
crypto ipsec df-bit clear

トンネル作成

  • IPSecはDialer1から繋ぐ前提
  • まずはACL準備
# ACLは好みに応じて isakmpが500番 non500-isakmpが4500番のこと
# NATデバイス挟んでいないならnon500-isakmpは要らないかもしれない
ip access-list extended v4WanIn
 permit esp host <VPNトンネル1のOCI側グローバルIPアドレス> any
 permit udp host <VPNトンネル1のOCI側グローバルIPアドレス> eq isakmp non500-isakmp any
 permit esp host <VPNトンネル2のOCI側グローバルIPアドレス> any
 permit udp host <VPNトンネル2のOCI側グローバルIPアドレス> eq isakmp non500-isakmp any

# インターフェイスにACL適用
interface Dialer1
 ip access-group v4WanIn in
  • トンネル作成
  • GREは使わずIPSec VTI(Virtual Tunnel Interface)というものを作るらしい
# トンネル作成(1本目)
interface Tunnel1
 # ローカル側トンネル内IPアドレス
 ip address 172.31.1.2 255.255.255.252
 # どのインターフェイスからIPSec張るか
 tunnel source Dialer1
 # IPSec VTIを作る
 tunnel mode ipsec ipv4
 # IPSec対向先指定
 tunnel destination <VPNトンネル1のOCI側グローバルIPアドレス>
 # IKEv2プロファイルとIPSecプロファイルの指定
 tunnel protection ipsec profile OCI_IPSEC_PROFILE ikev2-profile OCI_PROFILE_TUN1

# トンネル作成(2本目)
interface Tunnel2
 ip address 172.31.2.2 255.255.255.252
 tunnel source Dialer1
 tunnel mode ipsec ipv4
 tunnel destination <VPNトンネル2のOCI側グローバルIPアドレス>
 tunnel protection ipsec profile OCI_IPSEC_PROFILE ikev2-profile OCI_PROFILE_TUN2
  • show crypto ikev2 sashow crypto ipsec sa などでいい感じになっているか見る

BGP系

  • ローカル側のクライアントPCやら何やらがつながっているセグメントは192.168.10.0/24とする
# BGP設定
router bgp 65534
 # ローカル側にある、OCIへ伝えるルート情報(maskの部分はshow runで消えているかもしれない)
 network 192.168.10.0 mask 255.255.255.0
 # ルート情報を伝える先 as番号は固定
 neighbor 172.31.1.1 remote-as 31898
 neighbor 172.31.2.1 remote-as 31898
  • show ip bgp とかでいい感じになっているか見る

おわりに

  • 中身を理解せず公式サンプルconfigコピペしたら全力でハマったので辛さあった