Fortigate(6.0)を使ってフレッツ光ネクストのIPv6 IPoEから払い出されたPrefixを委譲する

## やりたいこと
IPoEで払い出されたIPv6 Prefixを、Fortigateを使って下位ネットワークに委譲してみる。
更新版（7.2）の記事はこちら→ https://qiita.com/gaichi/items/7843c7879b0eb195c9a1

## 環境・材料
- NTT西日本フレッツ光ネクスト（ひかり電話付き）
- ISP契約（ぷらら＋IPoEオプション）
- Fortigate60D（ver6.0)
- うまく動かなくてもくじけない心

## 説明
　ひかり電話ありのフレッツ契約の場合、HGWの下部にDHCPv6-PDクライアントに対応するルータを突っ込むとサブネットの分割ができます（IPv6ではサブネットといわないかもしれないけれども）。ルータには、/60が割り振られるようです。この機能を活用して、Fortigateにプレフィックスを委譲し、FortigateのLAN側を/64で分割するよう試してみます。
　なお、IPv4の設定とかDS-liteだとかMAP-Eとか、とにかくIPv4関係は今回は全く触れません。

## 注意事項
 FortigateのIPv6の設定や動作はなんとなくすっきりしなかったり不安定だったりすることがあります。設定しただけだとうまく動かないこともありましたが、再起動すると動作するようになることがあります。

## 設計
- 物理構成

　HGW--(WAN2)Fortigate(Intenal)--下部LAN

## 設定

- WAN2インタフェースの設定

　WAN2にはHGWを接続します。HGWからDHCPv6-PDによってIPv6アドレスの割り当てと移譲の権限を取得する設定です。

~~~
config system interface
    edit "wan2"
        set allowaccess ping
        config ipv6
            set ip6-allowaccess ping
            set dhcp6-prefix-delegation enable
            set autoconf enable
        end
    end
~~~

https://docs.fortinet.com/document/fortigate/6.0.0/handbook/800956/dhcpv6 の「DHCPv6-PD configuration」には「set autoconf enable」の記載がない。すでにIPv6アドレスを上位（今回はHGW)から払い出されている前提で書かれているのだろうけど、不親切だと思いました。
　なお、Pingに応答するようにしておきます。切り分けが楽になります。

- Internalインタフェースの設定

~~~
config system interface
    edit "internal"
        config ipv6
            set ip6-mode delegated
            set ip6-allowaccess ping
            set ip6-send-adv enable …①
            set ip6-upstream-interface "wan2" …②
            set ip6-subnet ::1:0:0:0:1/64　…③
            config ip6-delegated-prefix-list
                edit 1
                    set upstream-interface "wan2"　…②
                    set autonomous-flag enable
                    set onlink-flag enable
                    set subnet 0:0:0:1::/64　…④
                next
            end
        end
~~~

① インタフェースからRA（Router Advertisement）を送出する設定です。
② 上位のネットワークが存在するインタフェースの指定です。今回はWAN2が上位（HGW経由フレッツ経由ISP）なので、WAN2を設定します。
③ 下部のネットワーク側に設定するIPv6アドレスです。例えばHGWが2400:XXXX:YYYY:19D0::/60をFortigateに割り当てた場合、このインタフェースのプレフィックスはこの設定値である::1:0:0:0:1との論理和、つまり2400:XXXX:YYYY:19D1::1/64がInternalのIPv6アドレスになります。
④ サブネットのプレフィックスを設定します。③に合わせて、0:0:0:1::/64としておきます。（論理和の考え方も③と同じ）

- DHCPv6サーバの設定
 RAに加えて、DHCPv6サーバの設定をします。DNSサーバのアドレスはこの設定が通知されます。（この設定はたぶんステートレス）

~~~
config system dhcp6 server
    edit 1
        set dns-service delegated
        set subnet 0:0:0:1::/64
        set interface "Inaternal"
        set upstream-interface "wan2"
        set ip-mode delegated
    next
end
~~~

## 確認方法
- IPv6アドレスの確認

~~~
FGT60D4614****** # diag ipv6 address list
dev=18 devname=Internal flag= scope=0 prefix=64 addr=2400:XXXX:YYYY:19d1::1 preferred=12826 valid=12826 cstamp=0 tstamp=0
dev=6 devname=wan2 flag=P scope=253 prefix=10 addr=fe80::QQQQ:ZZZZ:XXXX:e857
dev=18 devname=Internal flag=P scope=253 prefix=10 addr=fe80::WWWW:VVVV:ZZZZ:e854
dev=6 devname=wan2 flag= scope=0 prefix=64 addr=2400:XXXX:YYYY:1900:aaa:bbb:ccc:e857 preferred=12031 valid=13831 cstamp=0 tstamp=0
（一部省略）
~~~
表示されたIPv6アドレスに、HGWの管理画面からPingで試験すると吉。

- ネイバーキャッシュの確認方法

~~~
# diag ipv6 neighbor-cache list
~~~

- ルーティングテーブルの確認方法

~~~
# diag ipv6 route list
~~~


- HGWの「DHCPv6サーバ払い出し状況」

## おまけ
LAN側に他のインタフェースがあれば，さらにPrefixの委譲ができます。
別のインタフェースで，③と④を次のように変更します。
理屈的には0:0:0:1::～0:0:0:F::まで使えるはずなので，15個委譲できるはずです（多分）。


~~~
…
set ip6-subnet ::2:0:0:0:1/64　…③
…
set subnet 0:0:0:2::/64　…④
…
~~~

## 備考
- HGWの「DHCPv6サーバ払い出し状況」で見えるIPv6アドレスと「diag ipv6 address list」コマンドで出力されるアドレスが微妙に異なる。Forti自身は「diag ipv6 address list」で表示されるアドレスを認識しているので、Pingなどで試験するときはこのアドレスに当てるとよい。
- HGWがDHCPv6-PDで払い出したプレフィックスあてのルーティングは、HGW内にルーティングテーブルとして持つようだ(でも確認する方法がない…）。
- DHCPv6-PDクライアントになる他のルータがHGW下部にいる場合、HGWから割り当てられるPrexfixが変わってしまうことがあります（というより、固定できないと思っておいたほうが良い）。その場合に、ホストがIPv6アドレスを複数（古いPrefixと新しいprefix）の二つを持ってしまい、不安定になることがあります。
- HGWのIPv6セキュリティ設定で、ICMPv6を「双方向」（IPoE→LAN、LAN→IPoE)で許可しておくと切り分けに便利。ICMPv6だけなら、侵入されてもそんなに悪いことはできないでしょう、きっと。気になるようなら、動作確認後に切っておけばよいです。

## 独り言
- HGWのネイバーキャッシュを確認する方法がなくて不便。
- HGWのルーティングテーブルを確認する方法がなくて不便。
- HGW内の状態をもう少し見せてほしい…。

## 参考
https://www.seil.jp/blog/10.html