Azure と 自宅環境を Cisco ルータを用いて、NATトラバーサル経由で Site-to-Site VPN接続をしてみる

# はじめに
Azure 仮想環境に対して、初めて自宅から Site-to-Site VPN 接続(IPSec)してみましたので、備忘録に設定を残しておきます。

# 環境
環境は以下の通りです。今回は PoC 環境用途としてシンプルな環境になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/d9d1b8e9-be4e-5f4e-ea4e-dae14a814e92.png)

## 自宅環境
- Flet's ルータで Internet には NAT 変換を行う
- Cisco 891 ルータが Azure から見た Local Gateway として設定する
    - Private IP経由での IPSec パススルー接続（NATトラバーサル）を行う
    - Flet's ルータ側のポートマッピング機能にて、UDP:500、UDP:4500を Cisco ルータにマッピングする

## Azure 環境
- Azure VPN Gateway の構成は以下の通り。基本最安価構成の PoC 環境としている。
- Basic SKUのため、今回は静的ルーティング (Static Route) によるルート設定になる。

|  構成  |  パラメータ  |
| ---- | ---- |
| ゲートウェイの種別 | VPN |
| VPNの種類 | ポリシーベース |
|  世代  |  Generation1  |
|  SKU  |  Basic  |
| IKEプロトコル | IKEv1 |

## VPN Gateway 補足
- Azure VPN Gateway は作成するVPN GatewayのSKUサイズでパフォーマンスが変わる構成になっています。[詳しくは公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-about-vpngateways#gateway-skus-by-tunnel-connection-and-throughput)を参照してください。
- 今回は評価環境目的のため、Basic サイズを選定していますが、Basic はサイズ変更が出来ない制約があります。
    - 異なるSKUに変更する場合は、一度BasicのVPNゲートウェイを削除してやり直す必要あり。
    - 今後、本番環境などに変更する場合は、Generation1/VpnGw1以降のSKUで設定した方が良いと思います。

# やってみる ～ Azure 編 ～
- **Azure 側 Vnet にて、VPN ゲートウェイのための専用サブネットを作成する**
    - VPN ゲートウェイの専用サブネットとして「GatewaySubnet」を作成します。
    - [公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gateway-subnet)に「GatewaySubnet」に関する記述があるので参照のこと。
        - サブネットのサイズについて、同じように調べられた方がいらっしゃるので、[リンクを張っておきます。](https://www.syuheiuda.com/?p=5311)
            - VPN のみの場合: /29
            - ExpressRoute のみの場合: /28
            - VPN / ExpressRoute を併用する場合: /27
- **VPN ゲートウェイを作成する(※ 30-40分かかるので注意!)**
    - Azure Portal から、VPN ゲートウェイを作成します。
    - VPN ゲートウェイが使用するパブリックIPアドレスも合わせて作っちゃいましょう。
    - ![1-vpngateway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/8edca333-883e-7485-9d33-0322017b6c83.png)
    - 「確認および作成」を押すと、VPNゲートウェイを作成し始めます。
    - 作成完了まで30-40分ほど経過しますので、根気よく待ちましょう。
- **ローカルネットワークゲートウェイを作成する**
    - local Network Gateway == 対抗先VPNルータのことです。
    - IPSecの対抗先となるグローバルIPアドレスを設定します。
        - 本PoC環境では、NATトラバーサルのため、Flet'sルータのIPアドレスを入れています。
    - ![2-localgateway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/03b21279-0a66-98d8-fc55-25e56926c825.png)

- **Site-to-Site VPN (IPSec)設定を行う**
    - VPNゲートウェイの設定から、「接続」を選択し、Site-to-Site 接続のプロファイルを作成します。
    - 対象のローカルネットワークゲートウェイ、IPSec Pre-Shared Key (共有キー）を設定します。
    - 対抗先のVPNルータとのIPSec ピアが張られると、「接続済み」にステータスが変わります。
- **対抗先の静的ルートを設定する**
    - 今回はポリシーベース = 静的ルートのため、オンプレミス用（自宅）向けのネットワークをルートテーブルで手動で追加する必要があります。
    - 次ホップ「仮想ネットワークゲートウェイ」に対して、オンプレ用のルートを定義します。
    - ![3-routetable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/63d66c85-8965-47b6-147d-7c37d5d75ae5.png)

## やってみる ～ VPNルータ (Cisco 891) ～
- Azure の VPNルータについては、[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-about-vpn-devices)に検証済みデバイス、および構成ガイドが掲載されています。
    - デバイスによっては、Azure Portal から直接コンフィグファイルを落とせたりします。
    - 詳細なサンプルは [GitHub に Config Sample として掲載されています](https://github.com/Azure/Azure-vpn-config-samples)ので、最新情報をWatchしておいた方がよさそうです。
- GitHubのサンプルをベースに、自宅のCisco891を設定してみました。
    - 「1.1.1.1」はdummyで、Azure VPN GatewayのグローバルIPアドレスになります。

```
version 15.3
no service pad
service tcp-keepalives-in
service tcp-keepalives-out
service timestamps debug datetime localtime year
service timestamps log datetime localtime year
service password-encryption
service sequence-numbers
!
hostname c891home
!
!
logging buffered 512000
!
no aaa new-model
memory-size iomem 15
clock timezone JST 9 0
!
!
!
!
!
!
!
!
ip dhcp pool MyHome
 network 10.16.0.0 255.255.0.0
 default-router 10.16.0.1
 lease 7
!
!
no ip bootp server
!
!
crypto isakmp policy 10
 encr aes 256
 authentication pre-share
 group 2
 lifetime 28800
crypto isakmp key testtest address 1.1.1.1
!
!
crypto ipsec transform-set azure-ipsec-set esp-aes 256 esp-sha-hmac
 mode tunnel
!
!
!
crypto map azure-crypto-map 10 ipsec-isakmp
 set peer 1.1.1.1
 set security-association lifetime kilobytes 102400000
 set transform-set azure-ipsec-set
 match address 101
!
!
!
!
!
!
interface FastEthernet0
 description *** Home Hub ***
 ip address 192.168.11.254 255.255.255.0
 ip tcp adjust-mss 1350
 duplex auto
 speed auto
 crypto map azure-crypto-map
!
interface GigabitEthernet0
 description *** Home Hub ***
 switchport access vlan 11
 no ip address
 no cdp enable
 spanning-tree portfast
!
~省略
interface Vlan1
 no ip address
!
interface Vlan11
 description *** VPN localside ***
 ip address 10.16.0.1 255.255.0.0
!
!
ip dns server
ip route 0.0.0.0 0.0.0.0 192.168.11.1
!
no cdp run
!
access-list 101 permit ip 10.16.0.0 0.0.255.255 10.4.0.0 0.0.255.255 log-input
!
!
!
line con 0
 no modem enable
line aux 0
line 3
 modem InOut
 speed 115200
 flowcontrol hardware
line vty 0 4
 access-class remoteaccess in
 login
 transport input all
!
end
```

- IPSec Site-Site VPNが確立すると、以下のようになります。
    - pkts encaps / decaps で暗号化通信のパケット状況をチェックできます。


```
c891home#show crypto ipsec sa
(抜粋)
   local  ident (addr/mask/prot/port): (10.16.0.0/255.255.0.0/0/0)
   remote ident (addr/mask/prot/port): (10.4.254.0/255.255.255.0/0/0)
   current_peer 2.2.2.2 port 4500
     PERMIT, flags={}
    #pkts encaps: 86, #pkts encrypt: 86, #pkts digest: 86
    #pkts decaps: 88, #pkts decrypt: 88, #pkts verify: 88
    #pkts compressed: 0, #pkts decompressed: 0
    #pkts not compressed: 0, #pkts compr. failed: 0
    #pkts not decompressed: 0, #pkts decompress failed: 0
    #send errors 0, #recv errors 0

     local crypto endpt.: 192.168.11.254, remote crypto endpt.: 2.2.2.2
     plaintext mtu 1422, path mtu 1500, ip mtu 1500, ip mtu idb FastEthernet0
     current outbound spi: 0xB17D7BF2(2977790962)
     PFS (Y/N): N, DH group: none

     inbound esp sas:
      spi: 0xE41B5685(3826996869)
        transform: esp-256-aes esp-sha-hmac ,
        in use settings ={Tunnel UDP-Encaps, }
        conn id: 13, flow_id: Onboard VPN:13, sibling_flags 80000040, crypto map: azure-crypto-map
        sa timing: remaining key lifetime (k/sec): (96859361/3506)
        IV size: 16 bytes
        replay detection support: Y
        Status: ACTIVE(ACTIVE)
```

# 確認など
- Azure 側からは VPN ゲートウェイのステータスやメトリクスなどで通信状況を確認することができます。
    - 以下は仮想ネットワークゲートウェイの「接続」に対するメトリクスです。
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/d9276b44-de38-3dd0-ceb1-0cfd619b52eb.png)


# まとめ
Azure へのVPN接続についてまとめてみました。VPNテストは環境を作るのが大変ですが、NATトラバーサルが普通に使えるので、事前接続試験などを検討されている方は何かの参考にしていただけたらと思います。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。