# VPN / マルチポイントVPN

マルチポイントVPNは、ポイントツーマルチポイント（一対多）型のトンネルインターフェースを利用することにより、1つのインターフェース設定で複数拠点とのVPN接続を実現する仕組みです。

## 概要

従来、VPN接続にはおもにポイントツーポイント（一対一）型のトンネルインターフェースが用いられてきましたが、この方式では接続先の数だけトンネルインターフェースの設定が必要になるため、ハブ＆スポーク構成のハブ（センター）側ではスポーク（拠点）の追加にともなう設定変更量が多く、ネットワークの構成変更に手間がかかりました。
これに対して、ポイントツーマルチポイント型のトンネルインターフェースでは、1つのインターフェースで複数拠点との接続が可能なため、拠点追加にともなうセンター側の設定変更量がポイントツーポイント型よりも少なく、さらにRADIUSサーバー等を利用すればセンター側の設定変更なしで拠点を追加することも可能になります。

また、複数拠点でポイントツーマルチポイント型のトンネルインターフェースを使用すれば、メッシュ構成のVPNも従来よりシンプルな設定で実現可能です。

### ポイントツーマルチポイント型トンネルインターフェース

次に、ポイントツーポイント型トンネルとポイントツーマルチポイント型トンネルのおもな違いをまとめます。

| ポイントツーポイント | ポイントツーマルチポイント
接続先 | 1つ | 複数
ブロードキャスト | なし | あり
リンク層アドレス（ARP）解決 | 不要 | 必要
経路設定時のネクストホップ指定方法 | インターフェース | 対向アドレス

ポイントツーポイント型トンネルインターフェースに転送されたパケットは、該当トンネルで使用しているトンネリングプロトコルによってカプセル化され、唯一の接続先である対向ルーターに転送されます。この場合、接続先が1つしかないためARP解決の必要はありません。
一方、ポイントツーマルチポイント型トンネルインターフェースは、同インターフェース上に複数の対向ルーターが存在しうるという点でEthernetに似た性質を持っています。そのため、ポイントツーマルチポイント型トンネルインターフェースにパケットを転送するにあたっては、同インターフェース上のどの対向ルーターに送信すればよいかの判断が必要になります。これはEthernetと同じようにネクストホップIPアドレスをARP解決することによって行いますが、得られるアドレスがMACアドレスではなく対向ルーターのトンネル終端IPアドレス（エンドポイントIPアドレス）になる点がEthernetと異なります。したがって、ポイントツーマルチポイント型トンネルインターフェース上のARPエントリーはリンク層アドレスがIPアドレスになります。
また、ポイントツーマルチポイント型トンネルインターフェースではブロードキャストもサポートしています。ポイントツーマルチポイント型トンネルインターフェースはその時点で把握している接続先（エンドポイント）の1つ1つに対してブロードキャストパケットを複製し、それぞれを適切にカプセル化してから各接続先に送信します。

## 基本仕様

マルチポイントVPNの基本的な仕様は次のとおりです。

- トンネリングプロトコルにはマルチポイントGREを使用する。
- セキュリティープロトコルとしてトランスポートモードIPsec/ISAKMPを併用可能。
- デリバリー（外側）プロトコル、ペイロード（内側）プロトコルともにIPv4のみサポート。
- デリバリー（外側）ヘッダーのDF（フラグメント不可）ビットはつねにセットされる。
- マルチポイントGREトンネルインターフェースは1装置あたり1つだけ作成可能。
- マルチポイントGREトンネルインターフェースでは、スタティックルーティングをサポート
  - ip routeコマンドでスタティック経路を設定するときは、GATEWAYパラメーターでネクストホップアドレス（エンドポイント）を明示的に指定すること。
- マルチポイントGREトンネルインターフェースのIPv4アドレスをDHCP、ISAKMPなどによって動的に設定することはできない。

## 基本設定

ここではいくつかの構成を例に、各ルーターにおけるマルチポイントVPN固有の設定だけを取り出して紹介します。
なお、以下の各例では次のことを仮定しています。

- IPv4インターネットへの接続にはPPPoEを使用（ppp0インターフェース）
- ppp0インターフェースにはグローバルIPアドレスが1個固定で設定されている
- IPsecによる保護を使用する

### ハブ＆スポーク構成（共通の事前共有鍵を使用）

- ハブ（センター）がスポーク（拠点）を集約する構成
  - ハブではマルチポイントGREトンネルインターフェースを使用
  - スポークでは通常のGREトンネルインターフェースを使用
- センターと各拠点間では共通の事前共有鍵を使用

ハブ（センター）

    crypto isakmp key friend hostname hub
    interface tunnel0
     tunnel mode gre multipoint
     tunnel source ppp0
     tunnel endpoint dynamic
     tunnel local name hub
     tunnel protection ipsec
     ip address 172.16.0.1/28
    !
    ip route 192.168.20.0/24 172.16.0.2
    ip route 192.168.30.0/24 172.16.0.3

スポーク1（拠点1）

    crypto isakmp key friend hostname hub
    interface tunnel0
     tunnel mode gre
     tunnel source ppp0
     tunnel destination 10.1.1.1
     tunnel local name spoke1
     tunnel remote name hub
     tunnel protection ipsec
     ip address 172.16.0.2/28
    !
    ip route 192.168.10.0/24 172.16.0.1
    ip route 192.168.30.0/24 172.16.0.1

スポーク2（拠点2）

    crypto isakmp key friend hostname hub
    interface tunnel0
     tunnel mode gre
     tunnel source ppp0
     tunnel destination 10.1.1.1
     tunnel local name spoke2
     tunnel remote name hub
     tunnel protection ipsec
     ip address 172.16.0.3/28
    !
    ip route 192.168.10.0/24 172.16.0.1
    ip route 192.168.20.0/24 172.16.0.1

### ハブ＆スポーク構成（個別の事前共有鍵を使用）

- ハブ（センター）がスポーク（拠点）を集約する構成
  - ハブではマルチポイントGREトンネルインターフェースを使用
  - スポークでは通常のGREトンネルインターフェースを使用
- センターと各拠点間では個別の事前共有鍵を使用

ハブ（センター）

    crypto isakmp key friend1 hostname spoke1
    crypto isakmp key friend2 hostname spoke2
    interface tunnel0
     tunnel mode gre multipoint
     tunnel source ppp0
     tunnel endpoint dynamic
     tunnel local name hub
     tunnel protection ipsec
     ip address 172.16.0.1/28
    !
    ip route 192.168.20.0/24 172.16.0.2
    ip route 192.168.30.0/24 172.16.0.3

スポーク1（拠点1）

    crypto isakmp key friend1 hostname hub
    interface tunnel0
     tunnel mode gre
     tunnel source ppp0
     tunnel destination 10.1.1.1
     tunnel local name spoke1
     tunnel remote name hub
     tunnel protection ipsec
     ip address 172.16.0.2/28
    !
    ip route 192.168.10.0/24 172.16.0.1
    ip route 192.168.30.0/24 172.16.0.1

スポーク2（拠点2）

    crypto isakmp key friend2 hostname hub
    interface tunnel0
     tunnel mode gre
     tunnel source ppp0
     tunnel destination 10.1.1.1
     tunnel local name spoke2
     tunnel remote name hub
     tunnel protection ipsec
     ip address 172.16.0.3/28
    !
    ip route 192.168.10.0/24 172.16.0.1
    ip route 192.168.20.0/24 172.16.0.1

### ハブ＆スポーク構成（センター側では各拠点をRADIUS認証）

- ハブ（センター）がスポーク（拠点）を集約する構成
  - ハブではマルチポイントGREトンネルインターフェースを使用
  - スポークでは通常のGREトンネルインターフェースを使用
- センターと各拠点間では共通の事前共有鍵を使用
- さらにセンターは各拠点を個別にRADIUSでも認証

ハブ（センター）

    radius-server host 192.168.10.5 key RadiusPasswordHere
    aaa authentication isakmp default group radius
    crypto isakmp profile spoke
     remote authentication eap-radius
     transform 1 integrity SHA1 encryption AES128 group 14
    crypto isakmp peer dynamic profile spoke
    crypto isakmp key friend hostname hub
    interface tunnel0
     tunnel mode gre multipoint
     tunnel source ppp0
     tunnel endpoint dynamic
     tunnel local name hub
     tunnel protection ipsec
     ip address 172.16.0.1/28
    !
    ip route 192.168.20.0/24 172.16.0.2
    ip route 192.168.30.0/24 172.16.0.3

スポーク1（拠点1）

    crypto isakmp profile hub
     local authentication eap-radius
     transform 1 integrity SHA1 encryption AES128 group 14
    crypto isakmp peer hostname hub profile hub
    crypto isakmp key friend hostname hub
    crypto isakmp key friend1 hostname hub type eap
    interface tunnel0
     tunnel mode gre
     tunnel source ppp0
     tunnel destination 10.1.1.1
     tunnel local name spoke1
     tunnel remote name hub
     tunnel protection ipsec
     ip address 172.16.0.2/28
    !
    ip route 192.168.10.0/24 172.16.0.1
    ip route 192.168.30.0/24 172.16.0.1

スポーク2（拠点2）

    crypto isakmp profile hub
     local authentication eap-radius
     transform 1 integrity SHA1 encryption AES128 group 14
    crypto isakmp peer hostname hub profile hub
    crypto isakmp key friend hostname hub
    crypto isakmp key friend2 hostname hub type eap
    interface tunnel0
     tunnel mode gre
     tunnel source ppp0
     tunnel destination 10.1.1.1
     tunnel local name spoke2
     tunnel remote name hub
     tunnel protection ipsec
     ip address 172.16.0.3/28
    !
    ip route 192.168.10.0/24 172.16.0.1
    ip route 192.168.20.0/24 172.16.0.1

### フルメッシュ構成

- 各サイトが他のすべてのサイトと接続するフルメッシュ構成
- すべてのサイトでマルチポイントGREトンネルインターフェースを使用
- すべてのサイト間で共通の事前共有鍵を使用

ノード1（サイト1）

    crypto isakmp key friend hostname node1
    interface tunnel0
     tunnel mode gre multipoint
     tunnel source ppp0
     tunnel local name node1
     tunnel endpoint 10.2.2.2
     tunnel endpoint 10.3.3.3
     tunnel protection ipsec
     ip address 172.16.0.1/28
    !
    ip route 192.168.20.0/24 172.16.0.2
    ip route 192.168.30.0/24 172.16.0.3

ノード2（サイト2）

    crypto isakmp key friend hostname node2
    interface tunnel0
     tunnel mode gre multipoint
     tunnel source ppp0
     tunnel local name node2
     tunnel endpoint 10.1.1.1
     tunnel endpoint 10.3.3.3
     tunnel protection ipsec
     ip address 172.16.0.2/28
    !
    ip route 192.168.10.0/24 172.16.0.1
    ip route 192.168.30.0/24 172.16.0.3

ノード3（サイト3）

    crypto isakmp key friend hostname node3
    interface tunnel0
     tunnel mode gre multipoint
     tunnel source ppp0
     tunnel local name node3
     tunnel endpoint 10.1.1.1
     tunnel endpoint 10.2.2.2
     tunnel protection ipsec
     ip address 172.16.0.3/28
    !
    ip route 192.168.10.0/24 172.16.0.1
    ip route 192.168.20.0/24 172.16.0.2

## 設定と状態の確認

マルチポイントGREトンネルインターフェースの情報はshow interfaceコマンドで確認できます。

    awplus# show interface tunnel0
    Interface tunnel0
      Link is UP, administrative state is UP
      Hardware is Tunnel
      IPv4 address 172.16.0.1/28 broadcast 172.16.0.15
      index 15 metric 1 mtu 1434
      <UP,BROADCAST,RUNNING,MULTICAST>
      VRF Binding: Not bound
      SNMP link-status traps: Disabled
      Bandwidth 1g
      Tunnel source 10.1.1.1
      Tunnel name local hub
      Tunnel protocol/transport gre multipoint, key disabled, sequencing disabled
      Tunnel endpoint 10.2.2.2
      Tunnel endpoint 10.3.3.3
      Tunnel TTL 64
      Checksumming of packets disabled, path MTU discovery disabled
      Tunnel protection via IPsec (profile "default")
      Router Advertisement is disabled
      Router Advertisement default routes are accepted
      Router Advertisement prefix info is accepted
        input packets 56, bytes 3804, dropped 0, multicast packets 0
        output packets 121, bytes 5364, multicast packets 0, broadcast packets 0
        input average rate : 30 seconds 0 bps, 5 minutes 0 bps
        output average rate: 30 seconds 0 bps, 5 minutes 0 bps
        input peak rate 972 bps at 2019/03/14 00:30:13
        output peak rate 1.53 Kbps at 2019/03/14 00:30:13
      Time since last state change: 0 days 02:18:50

マルチポイントGREトンネルインターフェース上のARPエントリーは、リンク層アドレス（LL Address）が対向ルーターのトンネル終端IPアドレス（エンドポイントIPアドレス）になっています。これはshow arpコマンドで確認できます。

    awplus# show arp
    IP Address      LL Address       Interface            Port        Type
    172.16.0.2      10.2.2.2         tunnel0              -           dynamic

IPsecの接続相手はshow ipsec peerコマンドで確認できます。

    awplus# show ipsec peer
    IPsec
      Selectors (local:remote)
        Address:  10.1.1.1 : any
        Protocol: gre:gre
        Port:     any:any
        Mark:     any:any
      Profile: default
        SPI (In:Out): c11b381d:cdfcfc96
            Selectors:  10.1.1.1/32[gre] 10.2.2.2/32[gre]
          Proto:      ESP
          Mode:       transport
          Encryption: AES256
          Integrity:  SHA256
          Expires:    28794s
    ISAKMP
      LocalID:  hub
      RemoteID: spoke1
        Cookies (Initiator:Responder) d67d8e23b5626547:cadf02b393a4047c
          Ver:            2             Lifetime: 84450s    State: Established
          Authentication: PSK           Group:    14
          Encryption:     AES256        NATT:     no
          Integrity:      SHA256        DPD:      yes