IPv6の半固定IPとサーバーのための対策
2020/05/09
珍しく完全な解決とは言えないパターンの記事
プロバイダからIPv6アドレスが降ってきたのでおうちサーバをv6接続に対応しようとしたら、IPoEは半固定とかいう謎仕様だったのでそれの対策を考えました。
スポンサーリンク
ちなみにこの記事は2017/04/19に執筆、2020/05/09に追記した情報です。未来の人達の世界ではこの通りではないかも知れないので確認しながらどうぞ。
IPv6(IPoE)のアドレス変動
「アドレス」と書いてるが、厳密にいえばプレフィックス。
NTTでIPoEのIPv6接続を行うと、そのIPアドレスは「半固定」となる。(これはNTT側の制限に起因する感じ?なのでプロバイダがどこであれ関係ない)
IPv4でも稀に半固定系のプロバイダがあるが、アレと似たような物でほとんど固定だが稀にアドレスの変動が起こるという代物。
そうなると困るのはサーバで、IPが変わってしまうので接続できなくなってしまう。
……とは言うが、実際に手元の環境で観察した感じではこの記事を書いた時(2017/08)から今(2020/05)まで一度も変動していない。本当に変動するのか?
AAAAレコードの書き換え
変動した際の課題1つめ。
アドレスが変動した際に、新しいアドレスに合わせてDNSに登録されているAAAAレコードを書き換える必要がある。
この辺りはv4時代に培われた動的IPでサーバを公開するノウハウが応用できるかと思う。
キャッシュサーバのTTL切れ(浸透とか反映とかいうと怒られる奴)に少し時間が掛かるが、これはどう頑張っても仕方のない事なので多少は目をつぶるとする。(DNSが許すならTTLを縮めておけば少しはマシかと)
パケットフィルタ設定の書き換え
v6特有の課題がこれ。
IPv4まではルーターがパケットを待ち受け、NATで振り分けしていた=実際にグローバルIPを持つのはルーターなのでAレコードの書き換えで済んでいた。
これがIPv6では「そこら辺の石ころに割り当ててもまだ余る」くらい広大なアドレス空間が使えるため、各デバイスにグローバルIPが付き、ルーターは通過させるアドレスとポートの組み合わせで設定するようになった。(この辺はルーターにもよるが)
変動が発生した場合はルーター配下にあるデバイスのIPv6アドレスも変わるため、AAAAレコードだけではなくルーターのパケットフィルタ設定も書き換える必要がある。
そして、それが自動で出来ないと詰む。ルーター側にそういう機能があるか、APIやSSHで設定変更できる機能があるか、どちらかが必須。
ネットワークがサーバ専用になっている(DMZとか?)なら、ルータ側で全てのパケットを通してから各サーバのiptablesでフィルタすれば良いと思うが、私用のPCなんかもある場合はセキュリティの観点からフィルタなしはよろしくない。
IPv6/IPv4フォールバックの遅延
DNSにAAAAとAを両方指定して解決する(AAAAがダメな時にAにフォールバックされる)なら苦労しない。
確かに可能ではあるんだけど、現実的ではない。
この辺りはHappy Eyeballsの実装次第な所もあるが、AAAAが使えない時にAに切り替わるか、それがどう切り替わるかはクライアント依存。
手元のFirefoxで試してみた所、AAAAが繋がらない場合はタイムアウト後にAで接続し直す挙動になっていた。そのタイムアウトが50秒、つまり、50秒待たされた後にページが表示される。
これは実質繋がらないと言っても良い、なので使えない手法となる。
対策
これだけv6対応が叫ばれている時代に「半固定だからやりません」とか言ったら磔獄門は避けられまい。
色々な対策を考えてみたので参考までにどうぞ。
プロバイダを変える
札束ビンタは世界いちーィイ!!
固定IPv6アドレスを発行してくれるプロバイダに変更(もしくは追加契約)する手法。
具体例としてはインターリンク ZOOT NEXTやIIJ IPv6 FiberAccess/Fサービス タイプPPPoE(法人向け)、NURO Biz(法人向け)など。
この場合のデメリットは当然ながらに「お金が掛かる事」「契約周りの作業が必要な事」
それから、フレッツ光+固定IPv6は現状PPPoEのみとなるので、「PPPoEセッションを消費する事」の3つ
当然ながらIPoEのメリット(速度とか)はない、理論的にはNAT変換がない分v4よりか速くなりそうだが、その辺りは分からない。
なお、PPPoEでも半固定のプロバイダがあるので要注意。
DDNSを使う
IPv4の時と同じ戦法で、DDNSを利用してAAAAレコードを書き換える。
DDNS自体の手法はどんなものでも良い。無料のサービスを利用してもいいし、腕に自信がある人はAWS Route53を利用してAPIでAAAAレコードを書き換えたのでも良い。
注意点が必要なのは、CNAMEを使うタイプのDDNSだと"他のレコードを同時に使用できない"という仕様が効いてくる事。(参考:CNAME を巡る 2/3 のジレンマ - 鷲ノ巣、「zone apex cname」でググる)
ルーターのパケットフィルタ設定を書き換えるという大きな課題がそのまま残る事には注意。
Route53で切り離す
ルーターのパケットフィルタ設定が書き換えられそうにないので考えたもう一つの方法。
Route53のヘルスチェックやAPIを利用して、変動が起こった際にAAAAレコードを返さないようにする。(切り離す)
つまり、クライアントにはAレコードだけを返し、最初からv4で接続させるようにする。
これでルーターの設定書き換え問題と、IPv6/IPv4フォールバックの遅延問題をクリア出来る。その後管理者が確認してv6アドレスを再度有効にする。
完全自動化とはいかないが、悪くない方法だと思う。
ただし切り離し中はIPv6でしか接続できないクライアント(v4アドレスを持たないネットワーク)から接続できなくなる。(現状v4での接続手段を持たないクライアントは少ないだろうが)
ダチョウアルゴリズム
そもそもこの変動は滅多に発生しない。なんたって3年くらい観察してて1回も変動してないんだから、個人的には本当に変動するのかすら疑問を抱いている。
だったら、数年の内の数時間くらいのダウンは仕方ないとして諦めてしまった方が良いのではないか?という考え方も十分アリだと思う。
DNSにAとAAAAを両方登録しておけばOK。変動問題は最初から知らなかったみたいな顔をしておけばいいのだ。だってほとんど変動しないんだもん。
あまり可用性を重要としていないサーバ、もしくはクライアントにIPv6/IPv4フォールバック問題がない事が確実ならば、ふざけているように見えて意外と有力候補。
特に個人が遊びで動かしているサーバーなんかはこれで十分だろう。
変動しない半固定
まとめるとこう
- プロバイダを変更/追加契約しても良い: 固定プレフィックスを出してくれる所に移行
- ルーターが高機能: Route53とルーターの機能を活用してDDNS化
- ルーターがカスでフィルタ書き換えが出来ない: Route53で切り離し
- できるだけ手軽に: 何もしない
この事を分かりやすく説明すると「対策せずにIPv6に対応すると却って可用性が落ちる可能性がある」ということになる。
ただ、ここまで書いておいてなんだが、結局のところは個人レベルなら「何もしない」のが一番良いんじゃないかと思う。
所詮は"可能性がある"レベルでしかなく、手元の環境では今まで1度も変動していないくらいだ。
"仕様上そうなる可能性がある"くらいの話であって、実際に変動する事はあまりないのだろうか?
余談:ルーターのデフォルト設定が危ない?
今回のような「NTT+IPv6(IPoE)」の場合にルータのデフォルト設定が「クソ危ない」事がある。
NTTから貸し出されるルータはデフォルト設定で「NGNで折り返したパケットを全て素通りさせる設定」になっている。
どういうことかと言うと、NTT西なら西、東なら東の「他の加入者」から飛んできたパケットはルータを素通りする(西と東でのパケットは遮断されるっぽい?)
なので、同じNGNに居る「悪い奴」がポートスキャンして攻撃したり出来るわけだ(相手に悪意がなくても、感染したマルウェアがこっちを狙ってくるとか)
対策としては、ルータの設定画面に入り、「IPv6パケットフィルタ設定」にある「IPv6セキュリティのレベル」を「高度」にすればNGN内からのパケットも遮断できる。
基本的に「高度」にして困る事はないので、明確な理由がない限りは遮断しておいた方が安全だと思う。
(ちなみに、iptablesはIPv6の場合ip6tablesになり、別物扱いなのでこっちはこっちで遮断しておかないとポート露出狂になる)