OCI IPSec VPN Ciscoルータを使用した冗長構成の検証

## 概要
パブリッククラウドへのネットワーク接続手段は様々な方法がありますが、オンプレDCやオフィスから安価に安全にLAN-to-LAN接続する方法としてルータを使用したIPSec VPNが挙げられます。IPSec VPNはオンプレにルータを1台設置して構築するだけでなく、可用性を高めるため冗長構成を構築することも可能です。
今回はパブリッククラウド接続先はOracle Cloud(OCI), オンプレ側をルータ2台設置して冗長構成を検証しました。

## 検証構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/fe56794f-f323-0344-5a0a-54be775bb782.png)

【OCI】
  * IPSecVPN構成を2つ作成
  　こちらを参考にしました
https://docs.oracle.com/ja-jp/iaas/Content/Network/Tasks/settingupIPsec.htm#Setting_Up_VPN_Connect

【オンプレ】
  * CPE IPSecルータ Cisco892J 2台
  　IPSecパラメータはこちらを参考にしました
https://docs.oracle.com/ja-jp/iaas/Content/Network/Reference/ciscoiosCPE.htm
  * Internet回線 1回線
  　2回線準備できなかったためNATルータを設置してCisco892J 2台はNAT配下に設置しました
　　OCIはCPEがNAT配下にあってもIPSec構築可能です。Internet回線が2回線または2Global IP準備可能であればNATルータは不要です


## 構成のポイント
  * IPSecはIKEV2でルーティングはBGPを使用します。
  * OCIは1CPEあたり2VPN作成されます。2CPE構成の場合合計4VPN作成されます。VPN上でBGPを稼働させますがデフォルトでは当コストになるため非対称ルーティングになる可能性が高いです。オンプレでBGPを構成する場合は優先制御でMED値を使うことがありますが、OCIではMED値設定ではなくAS Path prependを使用することができるため、今回はこの方法を採用してIPSecrouter1(Active)を常に優先するようルーティング制御を行います。
  (NetworkSEとしては非対称ルーティングはやはり気になりますので改善方法あるのはありがたいです..)
  * IPSec断を検知するためDPDを設定します。これがないとインターネット上で通信断が発生してもIPSecでは検知できないため通信が回復してもIPSec通信が回復せずBGP再確立しませんでした。
  * CPEからOCIへのルート配布は必要なセグメントのみとしています。この辺は通信要件によって変わると思います。
  * CPE2台の間はHSRPを設定します。  
  * CPEからOCIに通信する際のMSSを検証環境の制約で1350に設定しています。こちらは通信環境によって異なるためフラグメントを発生させない範囲で適切な値を設定していただければと思います。

## 検証結果
  * 通常時のOCI側ルーティングテーブルは優先ルート1(K-IPSec11-tun1)からのルートが採用されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/c2ee1a19-8fc5-a6e7-7d96-661f1d447f16.png)
  * 通常時においてはIPSecrouter1(Active)の優先ルート1を経由して通信します。
  * OCI側の原因で優先ルート1が消失した場合は優先ルート2に迂回して通信が可能です。
  * IPSecrouter1(Active)がHW障害の場合はIPSecrouter2(Standby)に迂回して優先ルート3に迂回して通信が可能です。
  
## Ciscoルータ　サンプル

<font color="#ff0000">【注意】
IPSecパラメータの一部(認証アルゴリズム SHA-1)はサポート対象外のため変更が必要です。
変更前
crypto ipsec transform-set oracle-vpn-transform esp-aes 256 esp-sha-hmac
mode tunnel
変更後
crypto ipsec transform-set oracle-vpn-transform esp-aes 256 esp-sha256-hmac
mode tunnel
</font>
[サポートされているIPSecパラメータ](https://docs.oracle.com/ja-jp/iaas/Content/Network/Reference/supportedIPsecparams.htm)

<details><summary>Activeルータ IPSecrouter1 configサンプル</summary><div>


#暗号化設定

crypto ikev2 proposal oracle_v2_proposal
 encryption aes-cbc-256
 integrity sha384
 group 5
!
crypto ikev2 policy oracle_v2_policy
 proposal oracle_v2_proposal
!
crypto ikev2 keyring oci-keyring1
 peer <font color="#ff0000">OCI_Global_IP1</font>
  address <font color="#ff0000">OCI_Global_IP1</font>
  pre-shared-key local <font color="#ff0000">シークレットキー</font>
  pre-shared-key remote <font color="#ff0000">シークレットキー</font>
 !
!
crypto ikev2 keyring oci-keyring2
 peer <font color="#ff0000">OCI_Global_IP2</font>
  address <font color="#ff0000">OCI_Global_IP2</font>
  pre-shared-key local <font color="#ff0000">シークレットキー</font>
  pre-shared-key remote <font color="#ff0000">シークレットキー</font>
 !
!
crypto ikev2 profile <font color="#ff0000">oracle-vpn-OCI_Global_IP1</font>
 match identity remote <font color="#ff0000">address OCI_Global_IP1</font> 255.255.255.255
 identity local address <font color="#ff0000">192.168.100.201</font>
 authentication remote pre-share
 authentication local pre-share
 keyring local oci-keyring1
 lifetime 28800
 dpd 10 5 on-demand
!
crypto ikev2 profile <font color="#ff0000">oracle-vpn-OCI_Global_IP2</font>
 match identity remote address <font color="#ff0000">OCI_Global_IP2</font> 255.255.255.255
 identity local address <font color="#ff0000">192.168.100.201</font>
 authentication remote pre-share
 authentication local pre-share
 keyring local oci-keyring2
 lifetime 28800
 dpd 10 5 on-demand
!
crypto ipsec security-association replay window-size 128
!
crypto ipsec transform-set oracle-vpn-transform esp-aes 256 esp-sha-hmac
 mode tunnel
crypto ipsec df-bit clear
!
!
crypto ipsec profile oracle_v2_ipsec_profile_tunnel1
 set transform-set oracle-vpn-transform
 set pfs group5
 set ikev2-profile oracle-vpn-<font color="#ff0000">OCI_Global_IP1</font>
!
crypto ipsec profile oracle_v2_ipsec_profile_tunnel2
 set transform-set oracle-vpn-transform
 set pfs group5
 set ikev2-profile oracle-vpn-<font color="#ff0000">OCI_Global_IP2</font>
!

#GRE設定

interface Tunnel1
 ip address <font color="#ff0000">192.168.2.2 255.255.255.252</font>
 ip virtual-reassembly in
 ip tcp adjust-mss <font color="#ff0000">1350</font>
 #mssはインターネット種類や暗号化パラメータによって異なります。
 #フラグメントが発生する場合はさらに小さい値をご検討ください
 tunnel source <font color="#ff0000">192.168.100.201</font>
 tunnel mode ipsec ipv4
 tunnel destination <font color="#ff0000">OCI_Global_IP1</font>
 tunnel protection ipsec profile oracle_v2_ipsec_profile_tunnel1
!
interface Tunnel2
 ip address <font color="#ff0000">192.168.2.6 255.255.255.252</font>
 ip virtual-reassembly in
 ip tcp adjust-mss <font color="#ff0000">1350</font>
 #mssはインターネット種類や暗号化パラメータによって異なります。
 #フラグメントが発生する場合はさらに小さい値をご検討ください
 tunnel source <font color="#ff0000">192.168.100.201</font>
 tunnel mode ipsec ipv4
 tunnel destination <font color="#ff0000">OCI_Global_IP2</font>
 tunnel protection ipsec profile oracle_v2_ipsec_profile_tunnel2
!
#Interface設定

track 1 interface GigabitEthernet0 line-protocol
!
interface FastEthernet8
 description LAN
 ip address 192.168.1.2 255.255.255.0
 standby 1 ip 192.168.1.1
 standby 1 priority 110
 standby 1 preempt
 standby 1 track 1 decrement 30
 duplex auto
 speed auto
!
interface GigabitEthernet0
 ip address <font color="#ff0000">192.168.100.201 255.255.255.0</font>
 duplex auto
 speed auto
!

#BGP設定

router bgp 64513
 bgp log-neighbor-changes
 redistribute connected
 redistribute static
 neighbor 192.168.1.3 remote-as 64513
 neighbor 192.168.2.1 remote-as 31898
 neighbor 192.168.2.1 ebgp-multihop 255
 neighbor 192.168.2.1 soft-reconfiguration inbound
 neighbor 192.168.2.1 distribute-list 10 out


 neighbor 192.168.2.5 remote-as 31898
 neighbor 192.168.2.5 ebgp-multihop 255
 neighbor 192.168.2.5 soft-reconfiguration inbound
 neighbor 192.168.2.5 distribute-list 20 out
 neighbor 192.168.2.5 route-map routemap-2-in in
 neighbor 192.168.2.5 route-map routemap-2-out out
!

route-map routemap-2-in permit 10
 set as-path prepend 31898
!
route-map routemap-2-out permit 10
 set as-path prepend 64513
!
!
access-list 10 permit 192.168.1.0 0.0.0.255
access-list 10 permit 192.168.2.0 0.0.0.3
access-list 10 deny   any
access-list 20 permit 192.168.1.0 0.0.0.255
access-list 20 permit 192.168.2.4 0.0.0.3
access-list 20 deny   any
!

#ルーティング

ip route 0.0.0.0 0.0.0.0 192.168.100.1
!


</div></details>

<details><summary>Standbyルータ IPSecrouter2 configサンプル</summary><div>

#暗号化設定

crypto ikev2 proposal oracle_v2_proposal
 encryption aes-cbc-256
 integrity sha384
 group 5
!
crypto ikev2 policy oracle_v2_policy
 proposal oracle_v2_proposal
!
crypto ikev2 keyring oci-keyring1
 peer <font color="#ff0000">OCI_Global_IP3</font>
  address <font color="#ff0000">OCI_Global_IP3</font>
  pre-shared-key local <font color="#ff0000">シークレットキー</font>
  pre-shared-key remote <font color="#ff0000">シークレットキー</font>
 !
!
crypto ikev2 keyring oci-keyring2
 peer <font color="#ff0000">OCI_Global_IP4</font>
  address <font color="#ff0000">OCI_Global_IP4</font>
  pre-shared-key local <font color="#ff0000">シークレットキー</font>
  pre-shared-key remote <font color="#ff0000">シークレットキー</font>
 !
!
crypto ikev2 profile oracle-vpn-<font color="#ff0000">OCI_Global_IP1</font>
 match identity remote address <font color="#ff0000">OCI_Global_IP1</font> 255.255.255.255
 identity local address <font color="#ff0000">192.168.100.202</font>
 authentication remote pre-share
 authentication local pre-share
 keyring local oci-keyring1
 lifetime 28800
 dpd 10 5 on-demand
!
crypto ikev2 profile oracle-vpn-<font color="#ff0000">OCI_Global_IP2</font>
 match identity remote address <font color="#ff0000">OCI_Global_IP2</font> 255.255.255.255
 identity local address <font color="#ff0000">192.168.100.202</font>
 authentication remote pre-share
 authentication local pre-share
 keyring local oci-keyring2
 lifetime 28800
 dpd 10 5 on-demand
!
crypto ipsec security-association replay window-size 128
!
crypto ipsec transform-set oracle-vpn-transform esp-aes 256 esp-sha-hmac
 mode tunnel
crypto ipsec df-bit clear
!
!
crypto ipsec profile oracle_v2_ipsec_profile_tunnel1
 set transform-set oracle-vpn-transform
 set pfs group5
 set ikev2-profile oracle-vpn-<font color="#ff0000">OCI_Global_IP3</font>
!
crypto ipsec profile oracle_v2_ipsec_profile_tunnel2
 set transform-set oracle-vpn-transform
 set pfs group5
 set ikev2-profile oracle-vpn-<font color="#ff0000">OCI_Global_IP4</font>
!

#GRE設定

interface Tunnel1
 ip address <font color="#ff0000">192.168.2.10 255.255.255.252</font>
 ip virtual-reassembly in
 ip tcp adjust-mss <font color="#ff0000">1350</font>
 #mssはインターネット種類や暗号化パラメータによって異なります。
 #フラグメントが発生する場合はさらに小さい値をご検討ください
 tunnel source <font color="#ff0000">192.168.100.202</font>
 tunnel mode ipsec ipv4
 tunnel destination <font color="#ff0000">OCI_Global_IP3</font>
 tunnel protection ipsec profile oracle_v2_ipsec_profile_tunnel1
!
interface Tunnel2
 ip address <font color="#ff0000">192.168.2.14 255.255.255.252</font>
 ip virtual-reassembly in
 ip tcp adjust-mss <font color="#ff0000">1350</font>
 #mssはインターネット種類や暗号化パラメータによって異なります。
 #フラグメントが発生する場合はさらに小さい値をご検討ください
 tunnel source <font color="#ff0000">192.168.100.202</font>
 tunnel mode ipsec ipv4
 tunnel destination <font color="#ff0000">OCI_Global_IP4</font>
 tunnel protection ipsec profile oracle_v2_ipsec_profile_tunnel2
!

#Interface設定

track 1 interface GigabitEthernet0 line-protocol
!
interface FastEthernet8
 description LAN
 ip address 192.168.1.3 255.255.255.0
 standby 1 ip 192.168.1.1

 standby 1 preempt
 standby 1 track 1 decrement 30
 duplex auto
 speed auto
!
interface GigabitEthernet0
 ip address <font color="#ff0000">192.168.100.202 255.255.255.0</font>
 duplex auto
 speed auto
!

#BGP設定

router bgp 64513
 bgp log-neighbor-changes
 redistribute connected
 redistribute static
 neighbor 192.168.1.2 remote-as 64513
 neighbor 192.168.2.9 remote-as 31898
 neighbor 192.168.2.9 ebgp-multihop 255
 neighbor 192.168.2.9 soft-reconfiguration inbound
 neighbor 192.168.2.9 distribute-list 10 out
 neighbor 192.168.2.9 route-map routemap-3-in in
 neighbor 192.168.2.9 route-map routemap-3-out out
 neighbor 192.168.2.13 remote-as 31898
 neighbor 192.168.2.13 ebgp-multihop 255
 neighbor 192.168.2.13 soft-reconfiguration inbound
 neighbor 192.168.2.13 distribute-list 20 out
 neighbor 192.168.2.13 route-map routemap-4-in in
 neighbor 192.168.2.13 route-map routemap-4-out out
!

route-map routemap-3-in permit 10
 set as-path prepend 31898 31898
!
route-map routemap-3-out permit 10
 set as-path prepend 64514 64514
!
route-map routemap-4-in permit 10
 set as-path prepend 31898 31898 31898
!
route-map routemap-4-out permit 10
 set as-path prepend 64514 64514 64514
!
!
access-list 10 permit 192.168.1.0 0.0.0.255
access-list 10 permit 192.168.2.8 0.0.0.3
access-list 10 deny   any
access-list 20 permit 192.168.1.0 0.0.0.255
access-list 20 permit 192.168.2.12 0.0.0.3
access-list 20 deny   any
!

#ルーティング

ip route 0.0.0.0 0.0.0.0 192.168.100.1
!

</div></details>