Hatena::ブログ(Diary)

JULYの日記

2014-03-16 おうちに IPv6 がやってきた - その1

[]IPv6NAT が無いことの影響

我が家IPv6 環境がやってきました。フレッツ光ネクスト回線にして、ISP 側に申し込んで、IPoE(いわゆるネイティブ方式)で IPv6インターネットにつながりました。

おそらく、多くの一般家庭であれば、今時のルータさえ用意すれば、特段、意識することなく、IPv6 につながる環境になると思います。おうちサーバがあっても、「自宅内は IPv4 で十分」と考えれば、何も問題はありません。

が、一応、北の大地で技術サラリーマンの端くれとして生活の糧を得ている身としては、おうち LAN でも IPv6 を使わないでどうする、と、無駄努力をするのでした(^^;

IPv6 とは

なんて話はどうでもよいですね。立派な専門家の方々がたくさん解説を書いています

NAT が無い

これも割と有名な話だと思います。そもそも、NAT によってグローバルアドレスを延命する、というアイデアが出る前に、「次世代IP を作らなければ、アドレスが枯渇する」と言われてました*1

故に、かどうかは分かりませんが、IPv6 には NAT がありません。という事はどういう事かというと、「インターネット繋ぎたければ、末端の端末、一つ一つに、グローバルアドレスを持つべし」という事になります

実際、IPv6対応したご家庭用ブロードバンドルータで、IPv6 でつながる環境になると、IPv6アドレス自動構成によって、おうちの中の PCグローバルな IPv6 アドレスが付与されます。その状態で、例えば Google に繋ぐと、どこにも NAT が入らず、グローバルな IPv6 アドレスでつながっています

個人向けの接続サービスだと、IPv4 アドレスルータWAN 側に一個、割り当てられるのが普通ですが、IPv6場合は、プレフィックス、つまりアドレスネットワーク部が割り当てられます。128 bitIPv6 アドレスのうち、上位 64 bitアドレスISP から割り当てられ、下位 64 bit は「勝手に付けてよし」という状態です*2

プライベートアドレス

NAT が無く、普通にグローバルアドレスPC に割り当てられているのだからIPv4プライベートアドレスのような物は必要ないか、というと、そういうわけでもありません。例えば、サーバアドレスは固定したい訳ですが、もし、個人向けの安い契約で済ませようとすれば、割り当てられるプレフィックスが変わるたびに、サーバアドレスを変更する必要があります。固定の契約を結んでも、ISP を変えたら、サーバアドレスを変更しなければいけません。インターネットからアクセスするためのサーバならしかたないですが、内部だけで使うサーバもこれではたまりません。

当初は、「NAT は悪だ! だからプライベートアドレスなんて不要だ!」みたいな雰囲気があったのですが、結局、上記のような事を考えると、プライベートアドレスに該当する物が必要、ということで、IPv6 では ULA と呼ばれるアドレス帯が用意されました。

ULA は「fd」で始まるアドレスで、組織統合などがあった場合にも衝突しないように、計算方法提示されています。また、実際に計算するための Web ページが、BSDOSIPv6 を実装した Kame プロジェクトにあります

Generate Unique Local Address

自分が持っている PC機器MAC アドレスを入れれば、48bit のプレフィックスを生成してくれます。これで、IPv4 でのプライベートアドレスを使う事ができ、内部サーバに固定の IPv6 アドレスを割り当てる事ができます

再び、NAT が無い

IPv4プライベートアドレスで内部のネットワークを作り、それでインターネットに接続できたのは、NAT のおかげです。しかし、IPv6 では NAT がありません。このままだと、

ということになります。そもそも、内部のサーバは ULA を付ける訳ですから、じゃぁ、このサーバアップデートとかはどうするんだ? という事になります

で、どうするかというと、「どっちのアドレスも付ける」という事になりますIPv6 が「複数のアドレスを持つのが普通」と言う時、通常使うアドレスリンクローカルアドレスの事を指して解説している事が多いのですが、ULA を使う場合には、「ULA とグローバルの両方のアドレスを持つ」という事になりますIPv4 だと内部のネットワークプライベートアドレスだけで済んでいたのと、大きな違いになります*4

Windows 上で、ipconfig で見ると、こんな感じになります

   自動構成有効. . . . . . . . . . . : はい
   IPv6 アドレス . . . . . . . . . . . : 240b:1234:5678:9abc:def0:1234:5678:9abc(優先)
   IPv6 アドレス . . . . . . . . . . . : fdfe:dcba:9876:5432::beef(優先)
   一時 IPv6 アドレス. . . . . . . . . : 240b:1234:5678:9abc:fedc:ba09:8765:4321(優先)
   リンクローカル IPv6 アドレス. . . . : fe80::123:4567:890a:bcde%11(優先)

上記の例では、プレフィックスは 64 bit で、

になります

おうちサーバグローバルな IPv6 と ULA を付ける

ということで、おうちサーバIPv6 対応にするには、グローバルなアドレスと ULA の両方を持つように設定する必要があります

が、ここで落とし穴が。

私のおうちサーバCentOS なのですが、CentOS普通に GUIアドレス設定をしようとすると、

という状態になりますサーバなので、ULA のアドレスを手動で設定したいのですが、そうすると、自動構成で割り当てられるはずのグローバルなアドレスは付与されない、という状態になります。企業のように、グローバルプレフィックスが固定の場合は問題ないですが、おうちサーバだと、プレフィックスが変わる可能性があるので、グローバルアドレスを手動で設定する訳にはいきません。

IPv6自動構成アドレスは、ルータが送信する RA(Router Advertisement:ルータ広告)のメッセージを受信し、そのメッセージに含まれるプレフィックス情報を使って、自分アドレスを決定しますRA を受信して自動構成アドレスを生成しつつ、固定で ULA を付けたい。IPv4 で例えれば「DHCP と手動設定の両方のアドレスを付けたい」といった感じです。

いろいろ嗅ぎまわったところ、「/proc/sys/net/ipv6/conf/eth0/accept_ra」が 0 な事が分かりました。おそらく、これを 1 にする必要があるだろうと思って、

# echo 1 >/proc/sys/net/ipv6/conf/eth0/accept_ra

として「service network restart」としてみると、0 に戻ってしまいます

# find /etc/sysconfig/network-scripts/ -type f -exec grep -Hn accept_ra {} \;

とすると、確かに、この値を書き換えているところが見つかります

これを追いかけると、どうやら IPV6_AUTOCONF が yes なら accept_ra が 1 になるようです。GUI から IPv6 アドレスを手動すると、/etc/sysconfig/network-scripts/ifcfg-eth0 に IPV6_AUTOCONF が no に設定されます。これを yes にすれば良いのですが、今度は NetworkManager が上書きしてしまいます

ということで、

とした上で、ULA の固定アドレスを設定すると、両方のアドレスが割り当てられるようになります。ifcfg-インタフェース名で IPv6必要な設定内容はこんな感じになります

IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6ADDR=fdfe:dcba:9876:5432::1234/64

NetworkManager が残念

NetworkManager が動いていると、あるとき意図しない設定になっている目に遭って、「サーバから、そんな物は必要ない」みたいな事を言う人は多いのですが、とはいえ、無線 LANVPN のように、ユーザデマンドで接続する場合には、NetworkManager がある方が便利だし、慣れていない人でも、それなりに設定できるので、個人的には「なら、手なずけてやる」と思って使ってきたのですが、NetworkManager を止めざるを得なかったのは、KVMホストブリッジを作った時と合わせて2度目。う〜ん、ちょっと残念。

*1:その頃は IPng (IP next generation) と言われていました

*2フレッツ光ネクストネイティブ接続で個人契約場合サービスメニューによって変わる可能性が無いわけではないですが、基本、64 bitプレフィックスと思っていて間違いないと思います

*3ルータを介してルーティングすれば接続可能。ルータは割り当てを受けているプレフィックスを持つホストが、内部にいる事を知っているので、ルータLAN 側に ULA のアドレスを付けるれば、基本的には OK

*4:まぁ、インターネットへの接続は全部、Proxy 経由、という構成もあり得ますが、その Proxy は少なくとも、グローバルなアドレスと ULA の両方を持つ必要があります

*5:/etc/sysconfig/network-scripts/ifcfg-インタフェース名のファイルで NM_CONTROLLED=no とします

トラックバック - http://d.hatena.ne.jp/JULY/20140316