梅本肇 / ume@mahoroba.org
FreeBSDにKAMEプロジェクト(http://www.kame.net/)
の成果がマージされた4.0-RELEASEがリリースされてか
ら既に1年が過ぎました。みなさんは如何にIPv6を使用
されているでしょうか? まだ多くの方は試されてたこ
とがないのが現状かもしれません。
本連載では次世代インターネットプロトコルである
IPv6とのFreeBSDでの付き合い方について紹介していき
たいと考えています。この連載を通じて、読者のみなさ
んが、IPv6と仲良く付き合っていくことができるように
なれば良いなと思います。
3ffe:0505:0002:1000:0000:0000:0000:0001という感じで、16ビット単位で「:」で区切り、16進数 で表記します。ここで、16ビット単位で先頭の0は省略 できます。また、0の連続は1箇所のみ::で省略できます。 例えば上記例では、
3ffe:505:2:1000::1のようになります。この省略記法は非常に良く使います。 例えば、IPv4での127.0.0.1つまりlocalhostは、IPv6で は::1となります。これは、
0000:0000:0000:0000:0000:0000:0000:0001を省略した形です。そのうちに説明する予定ですが、 DNSの逆引きを設定する際は省略部分を戻して、逆順に 書いていくことになるので、慣れておいた方が良いでしょ う。
3ffe:505:2::/48になります。
この中で集約可能グローバル・ユニキャストアドレスが いわゆるグローバルアドレスで、通常使用するアドレス です。(図1)
2000::/3 集約可能グローバル・ユニキャストアドレス fe80::/10 リンクローカル・ユニキャストアドレス fec0::/10 サイトローカル・ユニキャストアドレス ff00::/8 マルチキャストアドレス
マルチキャストアドレスは、マルチキャストを扱うた めのアドレスです。
図1: アドレス毎の有効範囲 ![]()
ここで重要な点は、DHCPのようにアドレスを配るわけ ではないということです。IPv6アドレスのインタフェー ス識別子はイーサネットならMACアドレスから算出され るEUIアドレスを使います。つまり、一意的に決定され ます。
図2: tcpdumpによる観測 ume@mille:104# tcpdump -i wi0 -X -s 256 tcpdump: listening on wi0 20:22:17.273447 fe80::202:2dff:fe0a:6bee > ff02::2: icmp6: router solicitation 0x0000 6000 0000 0010 3aff fe80 0000 0000 0000 `.....:......... 0x0010 0202 2dff fe0a 6bee ff02 0000 0000 0000 ..-...k......... 0x0020 0000 0000 0000 0002 8500 4939 0000 0000 ..........I9.... 0x0030 0101 0002 2d0a 6bee ....-.k. 20:22:17.350853 fe80::220:afff:fef8:7c44 > ff02::1: icmp6: router advertisement 0x0000 6000 0000 0058 3aff fe80 0000 0000 0000 `....X:......... 0x0010 0220 afff fef8 7c44 ff02 0000 0000 0000 ......|D........ 0x0020 0000 0000 0000 0001 8600 5933 4000 0708 ..........Y3@... 0x0030 0000 0000 0000 0000 0101 0020 aff8 7c44 ..............|D 0x0040 0304 40c0 0027 8d00 0009 3a80 0000 0000 ..@..'....:..... 0x0050 3ffe 0505 0002 0000 0000 0000 0000 0000 ?............... 0x0060 0304 40c0 0027 8d00 0009 3a80 0000 0000 ..@..'....:..... 0x0070 2001 0200 0301 0000 0000 0000 0000 0000 ................
図3で、inet6と表示されている行がIPv6アドレスです。 fe80::で始まるアドレスがリンクローカルアドレスです。 IPv6の設定がされてない状態ではグローバルアドレスは 付いていないはずですが、リンクローカルアドレスは必 ず付いているはずです。*7)
図3: ifconfigの実行結果 ume@piano:146> ifconfig -au lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x7 inet6 ::1 prefixlen 128 inet 127.0.0.1 netmask 0xff000000 an0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::240:96ff:fe48:4ea8%an0 prefixlen 64 scopeid 0xa inet 202.227.26.45 netmask 0xfffffff0 broadcast 202.227.26.47 inet6 3ffe:505:2:0:240:96ff:fe48:4ea8 prefixlen 64 inet6 2001:200:301:0:240:96ff:fe48:4ea8 prefixlen 64 ether 00:40:96:48:4e:a8
ちなみに、リンクローカルアドレスにはスコープが必 要ですので、%an0を付けています。ping6では-Iで明示 的にインタフェースを指定することもできます。この場 合はスコープを付ける必要はありません。(図5)
図4: 自分自身にping6してみる ume@piano:186> ping6 -c 3 fe80::240:96ff:fe48:4ea8%an0 PING6(56=40+8+8 bytes) fe80::240:96ff:fe48:4ea8%an0 --> fe80::240:96ff:fe48:4ea8%an0 16 bytes from fe80::240:96ff:fe48:4ea8%an0, icmp_seq=0 hlim=64 time=0.383 ms 16 bytes from fe80::240:96ff:fe48:4ea8%an0, icmp_seq=1 hlim=64 time=0.424 ms 16 bytes from fe80::240:96ff:fe48:4ea8%an0, icmp_seq=2 hlim=64 time=0.427 ms --- fe80::240:96ff:fe48:4ea8%an0 ping6 statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0.383/0.411/0.427 ms
では、ff02::1にping6してみましょう。ff02::1に対 してping6を実行すると、同一セグメント上の全ての IPv6対応ノードが返事をします。ここで、-wオプション を指定しています。このオプションを指定すると、通常 のECHO_REQUESTではなくICMPv6ノード情報 (FQDN) 問い 合わせパケットを送ります。このパケットを受け取った ノードはホスト名を返してきますので、同一セグメント 上にいる全てのIPv6対応ノードのホスト名を知ることが できます。(図6)
図5: インタフェース指定でのping6 ume@piano:211> ping6 -c 3 -I an0 fe80::220:afff:fef8:7c44 PING6(56=40+8+8 bytes) fe80::240:96ff:fe48:4ea8%an0 --> fe80::220:afff:fef8:7c44 16 bytes from fe80::220:afff:fef8:7c44%an0, icmp_seq=0 hlim=64 time=4.769 ms 16 bytes from fe80::220:afff:fef8:7c44%an0, icmp_seq=1 hlim=64 time=3.502 ms 16 bytes from fe80::220:afff:fef8:7c44%an0, icmp_seq=2 hlim=64 time=3.511 ms --- fe80::220:afff:fef8:7c44 ping6 statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 3.502/3.927/4.769 ms
では、適当にあたりを付けて、telnetしてみましょう。 リンクローカルアドレスを使ってログインすることがで きました。(図7)
図6: ff02::1へのping6の実行 ume@piano:138> ping6 -I an0 -w ff02::1 PING6(56=40+8+8 bytes) fe80::240:96ff:fe48:4ea8%an0 --> ff02::1 40 bytes from fe80::240:96ff:fe48:4ea8%an0: piano.mahoroba.org. 40 bytes from fe80::220:afff:fef8:7c44%an0: chaos.mahoroba.org. 40 bytes from fe80::200:f8ff:fe05:3eae%an0: peace.mahoroba.org. 40 bytes from fe80::202:2dff:fe0a:6bee%an0: mille.mahoroba.org. ^C --- ff02::1 ping6 statistics --- 1 packets transmitted, 0 packets received, 100% packet loss
リンクローカルアドレスを使うだけなら、なんら設定 する必要はないということをお分り頂けたことでしょう。
図7: リンクローカルアドレスでTELNET ume@piano:221> telnet fe80::200:f8ff:fe05:3eae%an0 Trying fe80::200:f8ff:fe05:3eae... Connected to fe80::200:f8ff:fe05:3eae%an0. Escape character is '^]'. Trying SRA secure login: User (ume):
| 現在使用されているインターネットプロトコルはバー ジョン4なので、IPv6と対比してIPv4と呼びます。 | |
| とりあえずここではセキュリティの話は考えないこ とにします。 | |
| 同一セグメント上の全てのIPv6対応ルータが所属す るマルチキャストアドレス | |
| 同一セグメント上の全てのノードが所属するマルチ キャストアドレス | |
| RSを送るためのコマンド。 | |
| 筆者は実際にNICが壊れて泣きました。 | |
| 付いてない人は、「俺のkernelはoptions INET6を 落してるから付いてないもんねー」なんて悲しいこ とを言わずに、IPv6 対応にしましょう。:-) | |
| 例えば、筆者は、サーバ群はマシンルーム兼書斎 (物置ともいう) に置いてあり、普段は居間でノー トで生活しているのですが、新しいマシンを組む際 に取り敢えず適当にインストールして、居間からロ グインして設定するなんてものぐさなことをしてい たりすることがあります。^^; |