NTTフレッツ IPv6上でCisco DMVPN (IPv4 over IPv6)を組んでみた

#なぜ興味を持ったのか
各種ブログや口コミを拝見していると、フレッツPPPoEのスループット、latencyなどに満足をいただけていないのをよく拝見します。

これは主にNTT東西が提供しているフレッツサービスのPPPoEの設備増設ポリシーに依存していることが大きく、解決策としてIPv6を利用するのが一般的になってきました。
（上記については、[この辺り](http://techlog.iij.ad.jp/archives/1879)でISPの中の人が詳しく解説いただいています）

一方、同様の理由でVPN over IPv6も様々なサービスがラインナップされつつありますが（例えば[NTTCom](https://www.ntt.com/business/services/network/internet-connect/ocn-business/bocn/knowledge/archive_24.html)など）、企業向けルータのDIYの記事ではYamaha RTXを利用した記事が多く、逆にCiscoを使った事例見つけることができませんでした。
ということで、やってみました。


#環境
Cisco ISR [C891FJ-K9](https://www.cisco.com/c/ja_jp/products/collateral/routers/800-series-routers/data_sheet_c78-519930.html)
ローエンドの拠点向けルータとしてリリースされているものです。


##ソフトウェアバージョンなど
```sh ver
Cisco IOS Software, C800 Software (C800-UNIVERSALK9-M), Version 15.7(3)M4, RELEASE SOFTWARE (fc2)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2019 by Cisco Systems, Inc.
Compiled Sat 09-Feb-19 16:59 by prod_rel_team
一部略
License Information for 'c800'
    License Level: advipservices   Type: Permanent
    Next reboot license Level: advipservices
```
891FJは、Advanced IP Services がembeddedされており、DMVPNやEIGRPをサポートしており、お買い得感があります。
（C841mだとオークション市場によく出回っているのが上記をサポートしていないAdvanced Securityだったりします）

##ISP
- [IIJmioひかり](https://www.iijmio.jp/imh/)
- [IIJ FiberAccess/NF](https://www.iijmio.jp/guide/outline/nbd/)

IIJmioにはIPoEオプションを追加し、native IPoE + ひかり電話 の環境です。よってIPv6 prefix delegation　でひかり電話ルータからprefixを受け取理、IPv6 address auto configuration で半固定IPv6を生成しています。
IIJ FiberAccess/NFではフレッツアンバンドルのIIJのIPoEサービスであり、上記と同様にひかり電話環境です。

#やりたいこと
3拠点以上でVPNを貼って~~遊びたい~~勉強したい。
- IPSEC (どうせならDMVPNで)
- IPv4 (private address) over IPv6 (フレッツ native IPv6)

#Config
以下のconfigで、DMVPNはupして、EIGRPで経路も出てきました。
spoke siteを2つ作ったところ、Dynamic tunnel で通信できているようなので、うまくできたと思われます（ツッコミ歓迎）。
関係があるところだけを抜粋します。ポイントは multi-point GREの末尾にipv6をつける。逆にいうとそれだけである。
Dynamic routingはなんでもいいのだが、ここではEIGRPで。（今は他の機器との相互接続でスッキリさせたいのでOSPFにしている）

##hub サイト
```sh run
crypto isakmp policy 1
 encr aes 256
 hash sha256
 authentication pre-share
 group 24
crypto isakmp key cisco123 address ipv6 ::/0
!
!
crypto ipsec transform-set transform-dmvpn esp-aes 256 esp-sha256-hmac 
 mode transport
!
!
crypto ipsec profile profile-dmvpn
 set transform-set transform-dmvpn 
!
interface Tunnel1
 description ###DMVPN intranet###
 ip address 10.0.10.1 255.255.255.0
 no ip redirects
 ip mtu 1360
 no ip next-hop-self eigrp 1
 no ip split-horizon eigrp 1
 ip pim sparse-mode
 ip nhrp network-id 1
 ip nhrp holdtime 360
 ip nhrp redirect
 ip tcp adjust-mss 1320
 load-interval 30
 keepalive 10 3
 tunnel source GigabitEthernet8
 tunnel mode gre multipoint ipv6
 tunnel key 1
 tunnel protection ipsec profile profile-dmvpn shared
!
interface GigabitEthernet8
 description ##WAN I/F to Flet's###
 no ip address
 duplex auto
 speed auto
 no cdp enable
 ipv6 address autoconfig default
 ipv6 enable
 ipv6 dhcp client pd PREFIX
 pppoe enable group global
 pppoe-client dial-pool-number 1
!
router eigrp 1
 network 10.0.10.0 0.0.0.255
```

##spokeサイト
```sh run
crypto isakmp policy 1
 encr aes 256
 hash sha256
 authentication pre-share
 group 24
!  
crypto isakmp key cisco123 address ipv6 ::/0
!
!
crypto ipsec transform-set transform-dmvpn esp-aes 256 esp-sha256-hmac 
 mode transport
!
!
crypto ipsec profile profile-dmvpn
 set transform-set transform-dmvpn 
!
interface Tunnel1
 description ###DMVPN Intranet###
 ip address 10.0.10.2 255.255.255.0
 ip mtu 1360
 no ip next-hop-self eigrp 1
 no ip split-horizon eigrp 1
 ip pim sparse-mode
 ip nhrp map 10.0.10.1 [hubサイトのIPv6 address]
 ip nhrp map multicast [hubサイトのIPv6 address]
 ip nhrp network-id 1
 ip nhrp holdtime 360
 ip nhrp nhs 10.0.10.1
 ip tcp adjust-mss 1320
 delay 1000
 tunnel source GigabitEthernet8
 tunnel mode gre multipoint ipv6
 tunnel key 1
 tunnel protection ipsec profile profile-dmvpn shared
!
interface GigabitEthernet8
 description ##WAN I/F to Flet's###
 no ip address
 duplex auto
 speed auto
 no cdp enable
 ipv6 address autoconfig default
 ipv6 enable
 ipv6 dhcp client pd PREFIX
 pppoe enable group global
 pppoe-client dial-pool-number 1
!
router eigrp 1
 network 10.0.10.0 0.0.0.255
```

#残課題など
- ping値は東京〜山梨間で夜間の混雑時間であっても12-15msec程度で安定しており、さすがIPv6と言ったところでしょうか。
- 最低限80Mbps程度のスループットは出ている模様。（自宅がVDSLのため、それ以上は継続できず）
- IPSECヘッダに透過しているQoSのうちIP_TOS 0x48がフレッツの網内でdropすることがある（網仕様?)。macOSからSSHしようとすると漏れなくdropしてくれるので、回避策を要検討。当座 ~/.ssh/configにIPQoS 0x00と記載でカバー。IPv6 over PPPoE であれば問題なし。
- MTU値について、Ciscoのデザインガイドは1400byteを使用したところフラグメントが発生しているのか、10Mbpsとスループットが落ちた。40byteほど余裕を持たせたところ大丈夫になった。


#参考資料
[Cisco Scalable DMVPN Design and Implementation Guide](https://www.cisco.com/c/dam/en/us/products/collateral/security/dynamic-multipoint-vpn-dmvpn/dmvpn_design_guide.pdf)
[IPv4 DMVPN over IPv6 WAN - Configuration](https://community.cisco.com/t5/vpn-and-anyconnect/ipv4-dmvpn-over-ipv6-wan-configuration/td-p/2173535)
[Cisco IPv6 インターネット接続設定例（IPv6oE方式）](https://www.cisco.com/c/ja_jp/support/docs/ip/ip-version-6/ipoe.html)
[Cisco IPSec Overhead Calculator Tool ]
(https://cway.cisco.com/tools/ipsec-overhead-calc/)