auひかりの宅内環境でIPv6リーチャブルなサブネットをFortigate 40Fで構築する

自宅のインターネット環境はauひかり（ISPはニフティ）で、auから提供されるホームゲートウェイ（BL1500HM）をそのまま使っていました。生活で使うのには十分な環境ですが、ネットワークでセキュリティ検証などの実験をやるには不便なので、UTM（Fortigate 40F）を導入して、複数のサブネットを作ることにしました。Fortigate 40FはWANポート1個、LANポート3個を備えているので、最大3つのサブネットが作れます。
UTMなので、設定次第でホームゲートウェイの代わりにもなるのですが、0ABJの電話サービスを契約している関係から、BL1500HMはそのままとして、LAN上にFortigate 40Fを置いてルーティングさせる方針としました。
# UTMにIPv4関連の設定を行う
UTMのIPv4関連の設定はそれほど難しくありません。下図のようにUTMのWANインタフェースに192.168.0.11、LAN1インタフェースに192.168.1.1のアドレスをつけて、デフォルトゲートウェイを192.168.0.1に設定する程度でインターネットと通信できるようになります。なお、UTMなのでデフォルトのフィルタリング設定で、LAN1からWANインターフェース方向のIPv4通信のみが許可されていて、その通信もUTMで監視できるようになっていました。
これで、従来からあったLAN0に加えて、LAN1のサブネットが追加でできました。
![Fortigate-IPv4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785377/3c5c17ac-82a4-a6b9-cd18-d36aaff30b59.png)
# UTMにIPv6関連の設定を行う
IPv6関連の設定は少し複雑です。auひかりの環境でホームゲートウェイの配下にUTM(ルータ)を配置してIPv6を有効化しているような情報（ブログなど）がほぼ無く、試行錯誤を重ねながらやってみました。
### 自分が使えるIPv6アドレスを確認する
まずは、どのIPv6アドレスが使えるのかを確認しました。ホームゲートウェイの管理画面では、ホームゲートウェイのLAN側につけられたIPv6アドレスとして「240f:xx:xx:1:xx:xx:xx:xx」の情報がありました。xxで伏せ字にしたところはそれぞれ次の通りでした。
- 第2～第3フィールド：ISPから割り振られたIPv6アドレスの情報
- 第5～第8フィールド：インタフェースのMACアドレスから計算されたEUI-64形式のアドレス

注目する点は第4フィールドが「1」というところです。ホームゲートウェイにつけられたIPv6アドレスは/64だけですが、実際には/48で割り振られているはずなので、この第4フィールドは自由に使えるだろうと想像しました。そこで、UTMのLAN1インタフェースでは、下図のように「240f:xx:xx:2:xx:xx:xx:xx」と、第4フィールドが「2」のIPv6アドレスを使う方針としました。![Fortigate-IPv6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785377/6aa76de3-cab3-148b-1ab4-2339d1d79528.png)
### UTMにIPv6アドレスを設定する
上記の方針でUTMのWANインタフェースとLAN1インタフェースにIPv6アドレスを設定します。
#### WAN側
管理画面で「IPv6アドレッシングモード」を「マニュアル」にして、「IPv6アドレスの自動設定」をONにします。これで、第4フィールドが「1」、第5～第8フィールドがEUI-64のアドレスがWANインタフェースに付きます。
#### LAN1側
管理画面で、「IPv6アドレッシングモード」を「マニュアル」にして、「IPv6アドレス/プレフィックス」を「240f:xx:xx:2:xx:xx:xx/64」にします。
### LAN1上の端末がIPv6を使えるようにする
続いて、LAN1上の端末にIPv6アドレスやデフォルトゲートウェイ、DNSサーバの情報を配付する設定を行います。
#### IPv6のDNSサーバを設定する
管理画面の「IPv6 DNS設定」にプライマリ/セカンダリDNSサーバのIPv6アドレスを設定します。IPv6対応のパブリックDNSサーバはいろいろありますが、今回はGoogle Public DNSのIPv6アドレスを使いました。
https://developers.google.com/speed/public-dns/docs/using?hl=ja

#### SLAACとDHCPv6を設定する
IPv4の場合、端末にIPアドレスなどの情報を配付する際にはDHCPを使いますが、IPv6の場合はSLAAC(ステートレスアドレス自動設定、RFC 4862)とDHCPv6を使います。
IPv6黎明期にはRA（ルータ広告）の機能だけでIPv6アドレスを配っていましたが、それだとDNSの情報等を配れないために、DHCPv6が開発され、普及してきたと理解していました。しかし、ネットの情報を見ると、Android系の端末がDHCPv6を使えない（Googleのポリシーらしい。。）ので、RAを使ってIPv6アドレスを自動設定するSLAACでIPv6アドレスを配り、さらにDHCPv6をステートレスで使ってDNSサーバのIPv6アドレスを配る必要があります。
UTMでは次のように設定します。
- 「ステートレスアドレス自動設定（SLAAC）」を有効化して、IPv6プレフィックスに「240f:xx:xx:2::/64」を追加します。
- 「DHCpv6サーバ」を有効化して、「DNSサービス」は「システムDNSと同じ」を選択します。「ステートフルサーバ」はOFFのままにします。

### IPv6のファイアウォールポリシーを追加する
上記の設定までで、LAN1上の端末からインターネットに向けてのIPv6通信ができるはずでしたが、実際にpingやtraceroute で疎通確認してみると、インターネットに出て行けないことが分かりました。確認するとホームゲートウェイのLAN側のIPv6アドレスにもpingが通らないので、UTMのファイアウォールで落とされていると判断しました。
そこで、UTMの「ファイアウォールポリシー」で「LAN→WAN」のポリシーを次のように追加しました。
- 着信インタフェース: lan
- 発信インタフェース: wan
- 送信元: all(ipv6)
- 宛先: all(ipv6)
- スケジュール: always
- サービス: ALL
- アクション: 許可

# 設定確認
以上でUTMの設定は完了です。実際にLAN1にWindows端末を接続して、設定が問題無くできているか確認してみました。
### ipconfig /all
パワーシェルでipconfig /all コマンドを実行してみたところ、IPv6アドレスがイーサネットアダプタに付与されていて、DNSサーバにもIPv6のGoogle Public DNSのアドレスが表示されます。
### ブラウザからIPv6確認サイトをアクセス
IPv6の接続性を確認するサイト（test-ipv6.com）にアクセスしてみました。こちらも問題無く、10点満点となりました。
https://test-ipv6.com/

久しぶりにKame Projectのサイトにアクセスしてみましたが、泳いでいる亀が問題無く見られました。
https://www.kame.net/