NGN網を利用してBGP over GREでHomeNOCへ接続する

梅雨ですね。IP資源、足りてますか？  
ということで、HomeNOCと接続して実験用ネットワーク資源の払い出しを受けてみましょう。  
  
HomeNOCは、有志の方々が学生や若手のエンジニアを対象に実験ネットワーク接続を提供する団体です。  

# ここでやること

本記事では、NGN網を利用してHomeNOCに接続するまでの方法を、より詳細に解説します。L2 GRE6トンネル上でBGPを用いて、グローバルIP資源の払い出しを受けます。

:::note warn
本記事で紹介する方法は、生のパケットをGREトンネルにカプセル化し、そのままNGN網に流すため、セキュリティ対策が十分ではありません。
通常は、GRE over IPSecを用いて暗号化することを推奨します。
:::

# 準備・設定
## L1をよしなに
今回はProxmoxVE上のVMにVyOSを用意したので、NICを追加しONUとの接続を行いました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/a70948ca-da9a-894f-384b-12b78f02eb00.png"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/f9111ed9-e9aa-3101-0107-dff14de440ff.png" />
また、ONUと接続しているブリッジインターフェースとは別に、IPを割り当てるVMに接続するブリッジ(SDNでも可)を用意し、インターフェースとして追加しております。

## v6オプションを契約
NGN回線に接続しても、初期設定ではNTTが指定するサイトしか利用できません。
網内での折り返し通信を行うために、v6オプションという追加サービスを以下のページより契約します。ネームもセッションプラスも不要です。
NTT東日本：https://flets.com/v6option/
NTT西日本：https://flets-w.com/opt/v6option/

申請から適用されるまでに1週間程度かかるようです。気長に待ちましょう。

## VyOSの設定
v6オプションの申請が通ったら、VyOSの初期設定とNGN網への接続を行います。
### インストール
ユーザー名とパスワードの初期値はvyos/vyosです。
```
vyos@vyos:~$ install image
(中略)
Would you like to continue? (Yes/No) [YES]: y
(中略)
Partition (Auto/Parted/Skip) [Auto]: y
(中略)
Install the image on? [sda]: sda

This will destroy all data on /dev/sda.
Continue? (Yes/No) [No] : y

How big of a root partition should I create? (1000MB - 10737MB) [10737]MB: (そのまま確定)
(中略)
What would you like to name this image? [1.1.7]: (そのまま確定)
(中略)
Which one should I copy to sda? [/config/config.boot]: (そのまま確定)
(中略)
Enter password for user 'vyos': (パスワードを入力)
Retype password for user 'vyos': (パスワードを入力)
(中略)
Which drive should GRUB modify the boot partition on? [sda]: sda

Setting up grub: OK
Done!
```

### IPv6の設定
```
set interfaces ethernet eth0 address dhcpv6
set interfaces ethernet eth0 ipv6 address autoconf
set interfaces ethernet eth0 ipv6 dup-addr-detect-transmits 1
set interfaces ethernet eth0 dhcpv6-options duid "(DUID)"
```
[NTT技術参考資料](https://flets.com/pdf/ip-int-3.pdf)にもあるように、NGN網内のDHCPv6でPrefix Delegationのリクエストを受け取る際にはDUIDをDUID-LL形式(00:03:00:01:[MACアドレス])の形にする必要があります。
ここで指定するMACアドレスは物理インターフェイスのもでも大丈夫ですが、私は仮想NICに割り当てられたMACアドレスを指定しました。

最後に、PrefixのサイズをNTTのNGN網からもらえる/56合わせて56にします。
```
set interfaces ethernet eth0 dhcpv6-options pd 1 interface eth1 sla-id 1
set interfaces ethernet eth0 dhcpv6-options pd 1 length 56
```

ここまでできたらv6関連の設定は完了です！割当られたアドレスを確認し、次のステップへ進みましょう。
`show interfaces ethernet インターフェイス`を実行することで確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/6165a389-4751-2c87-5a60-0699c68787f0.png)

## HomeNOCへの利用者情報の登録と接続の申請
[実験ネットワーク利用](https://www.homenoc.ad.jp/usage/)を熟読し、申請を行います。
接続形態はいくつか選択できますが、今回は回線種別としてGREトンネル，接続方式としてL3 BGPを選択しました。

申請フォームの入力欄にトンネル終端のv6アドレスを入力する箇所がありますので、前のステップにて確認したグローバルユニキャストアドレスを記入します。
割当資源の量や利用計画については、各自適切な量を入力してください。

また、IPv4アドレスの割り当てを申請する場合には、JPNICの定めた利用率を満たしている必要があります。JPNICの定めた利用率とは割り当て直後(3カ月以内)に25%以上、 かつ割り当て後1年以内に50%以上となり、以下の数式により算出するものとします。

                   割り当てられた空間の中からホスト等に
                         割り当てているアドレス数の合計
    利用率 = -----------------------------------------------  ×100
                割り当てられた空間の大きさ － サブネット数 × 2

## GRETunnel/BGPの設定
HomeNOCから審査に通過し、開通の準備が整った旨の連絡が届いたら、改めてVyOSをごにょごにょします。
以下の設定で必要になるパラメータは、[AS59105 Service Online](https://dashboard.homenoc.ad.jp/dashboard/info)のInfoページに記載がありますので、そちらを参考しつつ設定を進めてください。

### GRETunnelの確立
以下のコマンドを実行することでGRETunnelの設定を行います。
```
set interfaces tunnel tun0 address '(HomeNOCとの貴団体側v4境界アドレス/prefix)'
set interfaces tunnel tun0 address '(HomeNOCとの貴団体側v6境界アドレス/prefix)'
set interfaces tunnel tun0 description 'HomeNOC'
set interfaces tunnel tun0 encapsulation 'ip6gre'
set interfaces tunnel tun0 parameters ipv6 encaplimit 'none'
set interfaces tunnel tun0 remote '(HomeNOC側トンネル終端アドレス)'
set interfaces tunnel tun0 source-address '(貴団体側トンネル終端アドレス)'
set interfaces tunnel tun0 source-interface '(ONUとの接続を行っているインターフェイス名)'
```

:::note info
Infoページの情報を元に設定をしますが、以下に記載がない場合はprefixを省いた値を入力してください。
:::

### BGPの設定
以下のコマンドを実行することでBGPの設定を行います。
```
set protocols bgp address-family ipv4-unicast network (割り当てを受けたv4資源/prefix)
set protocols bgp address-family ipv6-unicast network (割り当てを受けたv6資源/prefix)
set protocols bgp neighbor (HomeNOCとの貴団体側v4境界アドレス) address-family ipv4-unicast
set protocols bgp neighbor (HomeNOCとの貴団体側v4境界アドレス) remote-as '(割り当てを受けたプライベートAS番号)'
set protocols bgp neighbor (HomeNOCとの貴団体側v6境界アドレス) address-family ipv6-unicast
set protocols bgp neighbor (HomeNOCとの貴団体側v6境界アドレス) remote-as '(割り当てを受けたプライベートAS番号)'
set protocols bgp system-as '(割り当てを受けたプライベートAS番号)'
set protocols static route (HomeNOCとのHomeNOC側v4境界アドレス/prefix) next-hop (HomeNOCとの貴団体側v4境界アドレス)
```
:::note info
プライベートAS番号は、Info画面上部に小さく記載された6から始まる5桁の番号です。
:::

### インターフェースの設定
IPを割り当てたいVMを接続させるためのネットワークインターフェースを用意してあげます。
```
set interfaces ethernet (VMを接続させるためのインターフェース名) address '(割り当てを受けたv4資源+1/prefix)'
set interfaces ethernet (VMを接続させるためのインターフェース名) address '(割り当てを受けたv6資源+1/prefix)'
```

### 設定を保存
以上のすべての手順を完了させた後、設定の適用と保存を行います。
```
commit
save
```

# 疎通確認
インターネットに接続している何らかの端末から、上の手順で作成したインターフェースに割り当てたアドレス宛にping叩き、応答が確認あれば作業は正常に完了しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/64590cde-3eee-e43f-a6ce-bcd4f6e74d6c.png)

# まとめ/感想
HomeNOCから割り当てていただいたアドレスを利用するところまでできましたので、最後の手順にて作成したインターフェースを割り当てたいVMにアサインすることでIP資源を利用することが可能です。
しかし、セキュリティ強化やパラメータチューニングなど、まだ課題は残っています。
私はBGPを初めて実際に触り、知識がまだまだ浅かったことを痛感させられましたが、HomeNOCのslackコミュニティの方々からアドバイスをうけつつ、接続確立まで漕ぎ着けることができました。

この記事がどなたかのお役に立てれば幸いです。