FreeBSD で IPv6

本項では、FreeBSD で IPv6 を使う際の設定例を示す。FreeBSD は、4.x Release の kernel から、標準で IPv6 スタックが含まれるようになった。したがって、そこそこ新しい FreeBSD で IPv6 ネットワークに参加するのは、極めて簡単だ。当方では gif は使っていないので、単なる LAN に繋がれたホストとしての設定だ。また、例中のインタフェースとしては、fxp0 を使用している。

アドレスをルータ広告で決めるとき

IPv6 アドレスをルータ広告で決めるときには、以下のように、IPv6 を使う旨と、使用するインタフェースを /etc/rc.conf に指定し、再起動するだけでいい。アドレスなどは、起動時にルータ広告で勝手に決まり、晴れて通信可能となる。

# インタフェースを明示的に決める場合

ipv6_enable="YES"
ipv6_network_interfaces="fxp0"

# インタフェースを自動決定する場合

ipv6_enable="YES"
ipv6_network_interfaces="auto"

再起動しないでやりたい場合は、ルータ広告の受け入れの有無を決める変数 net.inet6.ip6.accept_rtadv を sysctl で 1 設定し、rtsol を使う。

sysctl -w net.inet6.ip6.accept_rtadv=1
rtsol fxp0

アドレスの決定などが正しく行われれば、ifconfig で以下のように表示される。ルータ広告でもらったプレフィックスと Ethernet の MAC アドレスの組み合わせで、2001:2a0:204:1000:210:dcff:fe52:3f27 というアドレスが自動生成されているのが分かるだろうか。

% ifconfig fxp0

fxp0: flags=8843 mtu 1500
        inet6 fe80::210:dcff:fe52:3f27%fxp0 prefixlen 64 scopeid 0x1
        inet6 2001:2a0:204:1000:210:dcff:fe52:3f27 prefixlen 64
        ether 00:10:dc:52:3f:27
アドレスを手動で設定したいとき

IPv6 アドレスをルータ広告で設定せず、手動で決めたい場合は、/etc/rc.conf に以下のような設定を書き加える。

ipv6_enable="YES"
ipv6_network_interfaces="fxp0"
ipv6_ifconfig_fxp0="2001:2a0:204:1000::80"
ipv6_defaultrouter="2001:2a0:204:1000::1"

これで再起動すればいいが、手動でやる場合は、こんな感じ。

ifconfig fxp0 inet6 2001:2a0:204:1000::80 prefixlen 64 alias
route add -inet6 default 2001:2a0:204:1000::1

要注意点として、ifconfig では、IPv6 アドレスであることを明示するために inet6 を指定し、必ず alias を後ろに付けなければならない。IPv6 では、リンクローカルなど、複数のアドレスが設定されるからだ。不要になったアドレスは -alias で削除する。また、route で IPv6 の静的経路を設定するときには -inet6 オプションを付けなければならない。これが出来たら、ifconfig の表示は以下のようになる。

% ifconfig fxp0

fxp0: flags=8843 mtu 1500
        inet6 fe80::210:dcff:fe52:3f27%fxp0 prefixlen 64 scopeid 0x1
        inet6 2001:2a0:204:1000::80 prefixlen 64
アプリケーション

これで、取り敢えず telnet ftp といった、主要なアプリケーションは IPv6 で使えるようになっているはずだ。ping6 traceroute6 といった IPv6 診断用コマンドも使えるはずである。

inetd 経由で叩かれるサービスについては、/etc/inetd.conf において、設定が必要だ。たとえば telnet と ftp を IPv4 IPv6 の双方で受けたい場合は、以下のように設定する。

ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l ftp     stream  tcp6    nowait  root    /usr/libexec/ftpd       ftpd -l telnet  stream  tcp     nowait  root    /usr/libexec/telnetd    telnetd telnet  stream  tcp6    nowait  root    /usr/libexec/telnetd    telnetd

ほかのアプリケーションについては、ここでは取り上げない。

リンクローカルアドレスの使い方

ところで、ifconfig の中に出てきている fe80::210:dcff:fe52:3f27%fxp0 というアドレスは、リンクローカルアドレスといって、そのネットワークセグメント内だけで有効なアドレスだ。fe80 で始まり、IPv6 を喋るあらゆるインタフェースに自動的に付与される。普通の通信ではあまり使わないが、同じ LAN の中にあるホストとであれば、このアドレスだけで通信することも可能である。

しかし、複数のインタフェースを持っているホストでは、fe80::/64 という同一のネットワークアドレスを持つネットワークが、インタフェース数と同じ数だけ見えていることになるため、リンクローカルアドレスでほかのホストと通信をする際には、どのインタフェースのそれを問題にしているのかが確定しない。それを明らかにするのが、アドレスのケツに付いている %fxp0 というやつだ。スコープ ID といい、% をデリミタとして FreeBSD の実装ではインタフェース名になる。

そんなわけで、リンクローカルアドレスを使うときには、アドレスの後ろに スコープ ID を付けなければならない。なお、省略すると %lo0(ループバックインタフェース)が仮定されるようだ。

悪い例:

% ping6 fe80::2c0:f6ff:feb0:e284

PING6(56=40+8+8 bytes) fe80::1%lo0 --> fe80::2c0:f6ff:feb0:e284
ping6: sendmsg: No route to host
ping6: wrote fe80::2c0:f6ff:feb0:e284 16 chars, ret=-1
正しい例:

% ping6 fe80::2c0:f6ff:feb0:e284%fxp0

PING6(56=40+8+8 bytes) fe80::210:dcff:fe52:3f27%fxp0 --> fe80::2c0:f6ff:feb0:e284%fxp0
16 bytes from fe80::2c0:f6ff:feb0:e284%fxp0, icmp_seq=0 hlim=64 time=0.78 ms
16 bytes from fe80::2c0:f6ff:feb0:e284%fxp0, icmp_seq=1 hlim=64 time=0.414 ms
2003/05/18 作成
制作 − 突撃実験室