PPPoEとIPoEを同時に使いたい(IX2215)

# 序論
サークルの部室が引っ越しをすることになり、とある建物の4階のテナントに入居することになった。
前はマンションの部屋を借りてネットワークを構築していたのだが、**スプラトゥーンができないという深刻な問題**があり、サークルのメンバーとスプラトゥーンをやる時は各々のテザリングを利用し、別のネットワークを使うことで問題を回避していたのだが、引っ越しを機にしてその問題を解決しようとしたその備忘録である。

# IPv4の枯渇とMAP-E
IPv4は0.0.0.0~255.255.255.255のアドレス空間を持ち、理論上2^32(4,294,967,296)個存在する。実際に使えるアドレスはブロードキャストアドレスを除くとさらに少ない。
日本は202,183,168分のアドレスを保有しており、一人当たり使えるIPv4アドレスは約1.6個である。
IPv4アドレスが枯渇する中で、次世代IPアドレスであるIPv6は2^64のアドレス空間を持ち、IPv6の普及が早まっている。しかし、IPv4とIPv6は互換性がないため、IPv6からの接続をIPv4にルーティングしてくれるようなものが必要となる。そのやり方はいくつかあるが、最近主に使われているものはMAP-E方式(JPNE社)があり、一つのIPv4アドレスを複数のIPv6で分割してIPv6からのIPv4への接続を可能とする。そして必然的に使用できるポート数が制限されてしまう。MAP-E方式の他にもDS-Lite方式(TRANSIX社)もあるが、MAP-Eはユーザ側のルータにNATが存在し、DS-LiteはTRANSIX側の変換ルーターにNATがあるという違いがある。
MAP-EはNATがユーザ側のルータで行われるため、特定の状況でポート枯渇が発生してしまい、通信ができなくなるという可能性が存在する。JPNEの[徹底解説IPv6](https://www.jpne.co.jp/ebooks/v6plus-ebook.pdf)によると、MAP-Eはポート数に制限があるため、MAP-E方式においてNATセッションは５タプルと呼ばれる５つの要素（通信プロトコル、宛先IPv4アドレス、送信元IPv4アドレス、宛先ポート、送信元ポート）からパケットの振り分けを行い、ポート数を超えて通信をしている。例えば、同じポート番号を使い回す等して(ポート番号が同じでも送信先のアドレスが違えばパケットの識別ができる)制限を超えてセッションを立てている。
詳しくはipv6様の記事を参考にしてほしい。

https://qiita.com/ip6/items/eba871aae1444870ee52

## なぜスプラトゥーンができなかったのか？
スプラトゥーンのようなP2Pプレイは基本全てのプレイヤーと1:1とセッションを作る必要があり、NATセッションにおいて送信元ポート以外の4つの要素がすべて同じ状態で、送信元ポートの差異によってしか識別できない通信が極端に多くなってしまった状態、すなわちMAP-Eにおける「ポートの枯渇」が起きてしまう。一人までは通信ができたとしても、二人以上が同じチームとなり対戦をすることになるとさらに同一のプレイヤーとセッションを立てることになるためポート枯渇がより加速する。

## まだPPPoEが使える

新しく引っ越した建物は2階から4階までのテナントが一つの回線を使っていて、引っ越しのついでに2階のメインルータを交換することになった。
幸にもPPPoEがまだ使える状態だったので、MAP-EによるIPoEとPPPoEによるIPv4ネットワークを併用できればスプラトゥーンも問題なくプレイできるのではと思い、早速行動に移した。計画としてはスイッチ専用のAPを置いて、そこから流れてくるトラフィックは全てPPPoEに落とし込むという計画を立てた。

# IX2215ルータ設定
MAP-Eによる接続の場合、まずNTTのNGN網に接続を行い、その後JPNEのサーバからIPv6、IPv4の変換を行う。


VLANというものを使えばネットワークの分割ができるらしいが、VLANについて知ったのは後になって、とりあえずDHCPでIPを固定し、ルーティングを変える方法を選んだ。
## DHCP設定
```
ip dhcp profile lan1
  assignable-range 192.168.100.1 192.168.100.199
  subnet-mask 255.255.255.0
  default-gateway 192.168.100.1
  dns-server 192.168.100.1
  fixed-assignment 192.168.100.246 AA:BB:CC:DD:EE:FF
!
```
ここではAA:BB:CC:DD:EE:FFに対して192.168.100.246に固定してあげた。
次にPPPoEの設定を作成する。
## PPPoE設定
```
ppp profile sonet
  authentication myname PRIVATE
  authentication password PRIVATE PRIVATE
!
interface GigaEthernet0.1
  encapsulation pppoe
  auto-connect
  ppp binding sonet
  ip address ipcp
  ip tcp adjust-mss auto
  ip napt enable
  ip napt hairpinning
  no shutdown
!
```
## IPoE MAP-Eトンネル作成
IPoE MAP-Eを利用するためにはトンネルを作成する必要がある。
```
interface Tunnel0.0
  tunnel mode map-e
  ip address map-e
  ip tcp adjust-mss auto
  ip napt enable
  no shutdown
!
```
一般的に通信する時はMAP-Eを経由してネットワークに繋がるようにしたいので、defaultルーティングはTunnel0.0に流れるように設定する。
## デフォルトルーティング設定
```
ip route default Tunnel0.0
```
## スイッチ専用APのルーティング設定
最後に、固定IPを割り振ったAPのトラフィックにおいてルーティング経路を設定する。
```
ip access-list pppoe-ip permit ip src 192.168.100.246/32 dest any
```
pppoe-ipというaccess-listを作成する。
```
route-map pppoe-route-map permit 10
  match ip address access-list pppoe-ip
  set interface GigaEthernet0.1
!
```
pppoe-route-mapというroute-mapはipがpppoe-ipからの通信であればGigaEthernet0.1(PPPoE)にパケットを落とし込むというものである。
最後に、LANはGigaEthernet2.0に差し込むため、GigaEthernet2.0に上記のルーティングマップを使うと明示しなければならない。
```
interface GigaEthernet2.0
  ip address 192.168.100.1/24
  ip dhcp binding lan1
  ip policy route-map pppoe-route-map
  no shutdown
!
```
これでPPPoEとIPoEの設定が完了。
実際検証してみた結果、スイッチ専用のAPから接続した場合、IPoEとは別のIPv4アドレスが降りてくることが確認でき、スプラトゥーンも問題なく快適にプレイできることが確認できた。
# 終わりに
ネットワークの知識は学校で学んだ薄っぺらい知識が全部だったので、IX2215のような高級ルータには触れたことがなく、初めてのルータ設定だったが上手くいって嬉しかった。
VLANという概念が存在することを後から知り、今回は導入できなかったが、将来的にはDHCPのIP固定方式ではなく、VLANを使ってソフトウェア的にネット環境を分離して行きたい。
また、PPPoEだと一般ポートの開放ができるらしいので、VPNやマイクラのサーバもたててより快適なゲーム環境を作っていきたい。