雑多なIPv6のお勉強メモ
概要
夜ネットワークが遅いので調べてみたら、どうやらPPPoEが悪いらしい。IPv6のいくつかの方法でそれが迂回できるらしいので、とりあえずDMM光を契約してみた。これはv6プラスという方法らしい。そのときに技術的な部分をすこし勉強したのでメモ。
環境
うちの環境。
- 回線:DU光(IPv4) → DMM光(JPNE, v6プラス, IPv4 over v6対応)
- ルーター:WXR-1900DHP2 version 2.55
ブログとかから読み取ったv6プラスの雰囲気のメモ
v6プラスはネットワークイネイブラー(JPNE, VNEと呼ばれる会社のうちのひとつ)によって提供されるサービス。
NGN(Next Generation Network)はNTTが提供するIP網。
NGNはNTTが提供している閉域網で、NGNを利用してJPNEのサーバー(VNE)にアクセスするのでPPPoEの認証とかしてるとこを迂回できるから速い(とは言うもののPPPoEを完全に理解できてない感じがする)。
IPアドレスはRA(Router Advertisement)という仕組みで割り振られる。
→契約情報とIPアドレスの関係性は?データベースがどこかにある?→あるっぽい。後述。
RAは各「ノード」(要調査、IPv6の仕様で決まっている名前?)にIPを割り振る仕組み。
ルーターから定期的によくわからんパケットを送る。
各家庭のルーター(本当にルーティングをする?それともただのスイッチとして動く?)はIPv6モードとして設定するとよい。
https://dotsukareta.blogspot.com/p/v6.html
NDプロキシというのを設定するとよいらしい(NDプロキシはRFCで定義されているらしい?要調査)
Neighbor Discovery Proxies
https://tools.ietf.org/html/rfc4389
IPv6ではプレフィックスとインターフェースIDがそれぞれ8Byteずつ割り当てられている。
そのプレフィックスの部分がRAで決まる。インターフェースIDはどうやって決まるんだろう?家にあるルーターが割り振る?それともNTT側が振る?
リンクローカルアドレスはどうもEUI-64というもので決まるっぽいけど、グローバルアドレスのほうはよくわかってない。
リンクローカルアドレス
v4のローカルアドレスみたいなもの(192.168.0.0/16的な)。FE80::/10
すべてのノードにはリンクローカルアドレスが割り振られる。
リンクローカルアドレスにpingするときは、どのインターフェースのリンクローカルアドレスかわからないので必ず-Iオプションが必要。
VNE
https://www.jpne.co.jp/technical/wp/fallback_at_closed_network/
http://www.geekpage.jp/blog/?id=2012/3/28/1
IPアドレスの割り振り方
http://www.geekpage.jp/blog/?id=2013/1/11/1
ISP(DMM)からVNE(JPNE)へ契約情報が行き、そこからNGNのユーザー管理機能へ契約情報が登録され、家のルーターに向けて出ていくRAの情報が変わる。
(RAはRS(Router Solicit)パケットが家庭内のルーターから送られたときにNTT側のルーターから返すパケット。アドレスやDNSの情報?が入っている)
RFC6106によってRAでDNSが送れるようになった。
とおもったけどRFC6106の廃止という記事がある。8106になったらしい。
http://www.geekpage.jp/blog/?id=2017-3-21-1
https://tools.ietf.org/html/rfc8106
ステートレスアドレス
SLAACとかRDNSS(Recursive DNS Server)とか
https://www.infraexpert.com/study/ipv6z5.html
SLAACの仕様:https://tools.ietf.org/html/rfc4862
インターフェースIDはEUI-64と言う方法で設定されるらしい。ほぼMAC address.
https://www.infraexpert.com/study/ipv6z4.html
CEアドレス
Customer Edgeアドレスの略。多分家にあるルーターのこと。
確認したいもの
NDプロキシ
うちではBuffaloのルーターを使っていて、その設定にこれがある。外から全部の通信が通るとこまるからこれがあるらしい。NDはNeighbor Discoveryの略。
https://tools.ietf.org/html/rfc4389
Neighbor Discovery:これを先に理解したほうがよさそう。
https://ja.wikipedia.org/wiki/%E8%BF%91%E9%9A%A3%E6%8E%A2%E7%B4%A2%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB
NDというのはIPv4で言うARPのようなもので、NDをするとルーターが知ってるMACアドレスを返す。
NDProxyはNDを受け取って代わりに返すプロキシのことで、おそらくNDプロキシをONにするとBuffaloのルーターが外からのND Solicitパケットを代わりに返答してくれる(そのときに内側のIPへのND Solicitのパケットを防ぐ?)ということだと予想。(だけど本当にそれできちんと外からのパケットを防げているのか疑問。たとえば内側からあるマシンへアクセスした場合、MACアドレスはどこかのルーターに記録されるはず。そのあと同じルーターをとおってそのマシンへパケットを飛ばしたら通ってしまうのではないかという疑問がある。)まだちゃんとND proxyのrfcを読んでいないので読んだらわかるかな。
関係ないけど、ルーターの速度が低下したのでサポートにチャットしてみたところ、NDプロキシを解除するように指示された(IPv6パススルーにするように指示された)。NDプロキシがバグってルーターに負荷をかけるような条件があるのかも。
DNSサーバー
RaspberryPiをdnsmasqをつかってDNSサーバーとして利用している。これはipv4の時代ではNATがあったのでローカルアドレス(192.168.xxx.yyy)が引けるようにローカル専用に立てていたもの。
IPv6になると各マシンにグローバルIPが振られるのでいらないはずだけど、実際どうなのかよくわからってない。→いらなさそう。
ただ家の中でたててたサービスの一部がDNSをいじって動かしていた部分があるので直さないと困る。あとsearchパスを送りたい。
DNSサーバーってどうやってやればいいんだろう。とりあえず家庭内のルーターにIPv4のDHCPサーバーが立っているので、このひとにラズパイのIPv4のアドレスを配るように設定してみた。
でも本来DNSサーバーのアドレスもIPv6で送られるハズでは?というかRAのタイミングで送られてくるのでは?うーんなにか勘違いしているのかな。
とおもったけど、どうやらこれによるとバッファローのルーターはRDNSSに対応していないっぽい?
https://gist.github.com/testpilot031/ff8418c1f1e86f72b4037f50d0e1f9a1
これがどのようにして検証した文章なのかは不明。
mDNS
なんかv4しか出してくれないんだけどなんでだろう。
/etc/avahi/avahi-daemon.confにはuse-ipv4もuse-ipv6もyesってかいてある。
あーなるほど、pingとかで試してる側の手元のマシンのnsswitchがipv4しか使わないようになっている。
/etc/nsswitch.confでmdns4_minimulとなっている部分をmdns_minimulに変更すればよい。変更後は再起動はいらない。
https://l-w-i.net/t/fedora/mdns_001.txt
ルーター
とりあえず公式につかえるよって言っているWXR-1900DHP2を引っ張り出してきて設定した。ただ、もともとつかっていたGoogle WiFiもどうやらIPv6には対応していてSLAACはいけるっぽいので、試しに使ってみたい。とおもったけどだめだった。おそらくDHCPv6しか対応していない??あと、IPv4 over IPv6に対応していないという記述を見つけた [公式FAQ]ので諦め。
IPv4 over IPv6
IPv4のパケットをカプセル化してIPv6でVNEに向けて送信するという方法。
おそらくルーターでカプセル化すると思われる(そのためルーターにv6プラス機能がついていないとつかえない)。
MAP-EやDS-LiteというのがIPv4 over IPv6を実現するためのプロトコル。JPNEはMAP-Eを採用している。
MAP-Eの仕様はここ:https://tools.ietf.org/html/rfc7597
どうやってIPv4の情報(v4アドレスや使えるポートのレンジ)をIPv6アドレスの中に埋め込むかが書いてある。
MAP-EはNAPT(Network Address Port Translation)の仕組みをつかってやるらしい。
1:共有グローバルIPv4アドレスをルーターに振る。
2:ルーターは自身の使えるポートをIPv6アドレスから計算し、NAPTをつかってその中から適当なsourceポートを選ぶ。
3:そのパケットをIPv6をつかってVNEに投げつける
4:VNEはカプセル化されたIPv4のパケットを取り出し、外へ投げる。
IPv6アドレスはJPNEの場合以下のプレフィックス。(https://gato.intaa.net/archives/13173)
240b:0010::/31 => 106.72.x.y/15
240b:0012::/31 => 14.8.x.y/15
240b:0250::/31 => 14.10.x.y/15
240b:0252::/31 => 14.12.x.y/15
NECのルーターのMAP-Eの設定例
https://jpn.nec.com/univerge/ix/Support/ipv6/v6plus-mape/index.html
Ciscoのやつも
https://www.cisco.com/c/ja_jp/support/docs/csa/2019/cisco-sa-20190327-nat64.html
結局v6プラスってどういうもの?
そのうちまとめたい。