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

## やりたいこと
IPoEで払い出されたIPv6 Prefixを、Fortigateを使って下位ネットワークに委譲してみる。
過去記事：https://qiita.com/gaichi/items/e96bf638df642b2a9792

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

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

## 設計
- 物理構成

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

## 設定
Prefix委譲ではない設定であればGUIだけでできるのですが，Prefix委譲の設定をやりきるためにはCLI設定が必要なようです。

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

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

~~~
config system interface
    edit "wan2"
        config ipv6
            set ip6-allowaccess ping
            set dhcp6-prefix-delegation enable
            set autoconf enable
            config dhcp6-iapd-list
                edit 1
                    set prefix-hint ::/60
                next
            end
        end
    next
end
~~~

- Internalインタフェース（LAN側）の設定

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

① インタフェースからRA（Router Advertisement）を送出する設定です。
② 上位のネットワークが存在するインタフェースの指定です。今回はWAN2が上位（HGW経由フレッツ経由ISP）なので、WAN2を設定します。
③ 下部のネットワーク側（LAN側）に設定する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 "internal"
        set upstream-interface "wan2"
        set delegated-prefix-iaid 1
        set ip-mode delegated
    next
end
~~~

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

~~~
# diag ipv6 address list
~~~
表示されたIPv6アドレスに、HGWの管理画面からPingで試験すると吉。

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

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

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

~~~
# diag ipv6 route list
~~~


- DHCPv6のリース状態
~~~
 exe dhcp6 lease-list
~~~

## おまけ
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　…④
…
~~~

## 備考
- 同一物理インタフェースでPPPoE(IPv4)を同居できません。設定は可能ですが，PPPoEセッション確立した段階で，IPv6アドレスを忘れてしまいます（期待通りに動きません）。なので，IPoE専用の物理ポートを準備してください。
- 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