IPv6

提供: ArchWiki
移動先: 案内検索

Arch Linux では、IPv6 はデフォルトで有効になっています。

近隣探索

マルチキャストアドレス ff02::1 に ping するとリンクローカルスコープの全てのアドレスが返答します。インターフェイスを指定する必要があります:

$ ping ff02::1%eth0

以下のコマンドでローカルネットワークの近隣リストを取得できます:

$ ip -6 neigh

マルチキャストアドレス ff02::2 に ping するとルーターだけが返答します。

-I your-global-ipv6 オプションを追加すると、リンクローカルホストはリンクグローバルスコープアドレスを返します。この場合はインターフェイスを省略できます:

$ ping -I 2001:4f8:fff6::21 ff02::1

ステートレス自動設定 (SLAAC)

ネットワークが設定されている場合、IPv6 アドレスを取得する一番簡単な方法はステートレスアドレス自動設定になります (略して SLAAC)。ルーターが示すプレフィックスから自動的にアドレスが推測されるため、特別な設定や DHCP クライアントなどのソフトウェアが必要ありません。

クライアント

netctl を使っている場合、イーサネットまたはワイヤレス設定に以下の行を追加するだけで使えます。

IP6=stateless

NetworkManager を使用している場合、自動的に IPv6 アドレスが有効になります。

ステートレス自動設定は IPv6 の icmp パケットがネットワークを通過できる場合にのみ利用することができるので注意してください。クライアント側から ipv6-icmp パケットを許可する必要があります。シンプルなステートフルファイアウォール/iptables を使っているのであれば次を追加してください:

-A INPUT -p ipv6-icmp -j ACCEPT

他のファイアウォールフロントエンド (ufw, shorewall など) を使っている場合はそれぞれのドキュメントを読んで ipv6-icmp パケットを有効にしてください。

ゲートウェイ

ネットワーク上のクライアントに IPv6 を正しく配るためには広告デーモンを使用する必要があります。広告に使われる標準的なツールは radvd公式リポジトリからインストールすることができます。radvd の設定はとてもシンプルです。/etc/radvd.conf を編集して以下を記述してください:

# replace LAN with your LAN facing interface
interface LAN {
  AdvSendAdvert on;
  MinRtrAdvInterval 3;
  MaxRtrAdvInterval 10;
  prefix ::/64 {
    AdvOnLink on;
    AdvAutonomous on;
    AdvRouterAddr on;
  };
};

上記の設定は、広告されている /64 ブロックのアドレスを使って自動的に設定するようにクライアントに伝えます。上記の設定では LAN インターフェイスに割り当てられた全てのプレフィックスを広告することになるので注意してください。広告するプレフィックスを制限したい場合は ::/64 の代わりに適当なプレフィックスを使って下さい。例えば 2001:DB8::/64prefix ブロックは宣言したいプレフィックスの数だけ繰り返し用いることができます。

ゲートウェイも ipv6-icmp パケットを全てのチェインで許可する必要があります。シンプルなステートフルファイアウォール/iptables を使っている場合は以下を追加:

-A INPUT -p ipv6-icmp -j ACCEPT
-A OUTPUT -p ipv6-icmp -j ACCEPT
-A FORWARD -p ipv6-icmp -j ACCEPT

他のファイアウォールフロントエンドを使っている場合も適当に設定して、忘れずに radvd.service を有効にしてください。

プライバシー拡張

SLAAC を通じてクライアントがアドレスを取得した場合、IPv6 アドレスは宣伝されたプレフィックスとクライアントのネットワークインターフェイスの MAC に由来することになります。そうすると IPv6 アドレスから簡単にコンピューターの MAC アドレスを割り出せてしまうためセキュリティ上の懸念になりかねません。この問題に取り組むために IPv6 Privacy Extensions (RFC 4941) が開発されました。プライバシー拡張を有効にすると、カーネルは自動設定された元のアドレスからわからなくした一時アドレスを生成します。リモートサーバーに接続するときはプライベートアドレスが使用されるためオリジナルのアドレスは隠匿されます。プライバシー拡張を有効にするには以下の手順に従って下さい:

以下の行を /etc/sysctl.d/40-ipv6.conf に追加:

# Enable IPv6 Privacy Extensions
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
net.ipv6.conf.nic0.use_tempaddr = 2
...
net.ipv6.conf.nicN.use_tempaddr = 2

nic0 から nicN はあなたのネットワークインターフェイスカード (Network Interface Card) に置き換えて下さい。ネットワーク#現在のデバイス名を取得に書かれているコマンドで確認できます。sysctl の設定を実行する場合、all.use_tempaddrdefault.use_tempaddr パラメータは既存の nic には適用されません。

再起動後、Privacy Extensions が有効になります。

dhcpcd

dhcpcd のデフォルト設定ファイルには、バージョン 6.4.0 から slaac private オプションが含まれており、RFC 7217 の実装である、"Stable Private IPv6 Addresses instead of hardware based ones" を有効にします (commit)。従って、新しいネットワークに接続するとき以外に IPv6 アドレスに変更するような場合を除いて、何も変更する必要はありません。固定アドレスの場合は slaac hwaddr に設定してください。

NetworkManager

NetworkManager には /etc/sysctl.d/40-ipv6.conf の設定は反映されません。このことは再起動した後に $ ip -6 addr show interface を実行することで確認できます: 標準のアドレスの隣に scope global temporary アドレスは表示されないでしょう。

デフォルトで IPv6 のプライバシー拡張を有効化するには、以下の行を /etc/NetworkManager/NetworkManager.conf に追加してください:

/etc/NetworkManager/NetworkManager.conf
...
[connection]
ipv6.ip6-privacy=2

NetworkManager で管理している接続ごとに IPv6 プライバシー拡張を有効化したいときは、/etc/NetworkManager/system-connections/ にある設定したい接続のキーファイルを編集して、[ipv6] セクションに ip6-privacy=2 という行を追加してください:

/etc/NetworkManager/system-connections/example_connection
...
[ipv6]
method=auto
ip6-privacy=2
ノート: プライバシー拡張を有効にすることで作成される scope global temporary IPv6 アドレスは更新されることがないように思われますが (valid_lft の期間で deprecated 状態に移行することがない)、長い期間でみるとアドレスが変更されることもあるのが確認できます。

systemd-networkd

Systemd-networkd にも /etc/sysctl.d/40-ipv6.conf に書かれている設定は適用されません。.network ファイルの中で IPv6PrivacyExtensions オプションの値を kernel に設定する必要があります。ただし、以下の IPv6 プライバシー拡張の設定は反映されます:

net.ipv6.conf.xxx.temp_prefered_lft
net.ipv6.conf.xxx.temp_valid_lft

詳しくは systemd.network(5) man ページ を参照。

connman

/var/lib/connman/settings の global セクションに以下を追加:

[global]
IPv6.privacy=prefered

固定アドレス

固定アドレスを使うことによって場合によりセキュリティが向上することがあります。例えば、あなたのローカルなルーターが近隣探索や radvd (RFC 2461) を使う場合、インターフェイスは MAC アドレスに基づいて自動的に割り当てられます (IPv6 の Stateless Autoconfiguration を使用)。これだと IP アドレスのネットワークが変更されたとしてもシステムを追跡することが出来るため、セキュリティ上あまりよろしくないということがあるでしょう。

netctl を使って固定 IP アドレスを割り当てるには、/etc/netctl/examples/ethernet-static のサンプルファイルを見て下さい。以下の行が重要です:

...
# For IPv6 static address configuration
IP6=static
Address6=('1234:5678:9abc:def::1/64' '1234:3456::123/96')
Routes6=('abcd::1234')
Gateway6='1234:0:123::abcd'

IPv6 と PPPoE

PPPoE の標準ツールである pppd は PPPoE における IPv6 をサポートしています (あなたの ISP とモデムがサポートしている場合)。以下を /etc/ppp/pppoe.conf に追加してください:

+ipv6

PPPoE に netctl を使っている場合、netctl の設定に以下を追加してください:

PPPoEIP6=yes

プレフィックス委譲 (DHCPv6-PD)

ノート: このセクションではゲートウェイのカスタム設定について述べており、クライアントのマシンは対象にしていません。市場に出ている標準的なルーターについては、ルーターのドキュメントを読んでプレフィックス委譲を有効にする方法を調べて下さい。

プレフィックス委譲は多くの ISP で IPv6 を展開するのに使われている技術です。ネットワークプレフィックスをユーザーサイト (ローカルネットワーク) に割り当てる手法になります。ルーターを設定することでネットワークプレフィックスを様々なサブネットワークに割り当てるができます。ISP は DHCPv6 を使ってネットワークプレフィックスの手綱を握り (大抵は /56/64)、dhcp クライアントがプレフィックスをローカルネットワークに割り当てます。インターフェイスが2つのシンプルなゲートウェイの場合、WAN (もしくは ppp などの擬似インターフェイス) に接続されたインターフェイスから取得したアドレスから、ローカルネットワークに接続されたインターフェイスに IPv6 プレフィックスが割り当てられます。

dibbler を使う

Dibbler はポータブルな DHCPv6 クライアントであり、プレフィックス委譲に使うことができます。AURdibblerAUR でインストール可能です。

dibbler を使用する場合、/etc/dibbler/client.conf を編集して下さい:

log-mode short
log-level 7
# use the interface connected to your WAN
iface "WAN" {
  ia
  pd
}
ヒント: 詳しくは dibbler-client(8) の man ページを見て下さい。

dhcpcd を使う

Dhcpcd は IPv4 の dhcp サポートの他に、DHCPv6 クライアントのほぼ完全な実装も備えており、DHCPv6-PD も含まれています。dhcpcd を使用する場合 /etc/dhcpcd.conf を編集して下さい。IPv4 で既に dhcpcd を使っている場合は既存の設定を上書きしてください。

duid
noipv6rs
waitip 6
# Uncomment this line if you are running dhcpcd for IPv6 only.
#ipv6only

# use the interface connected to WAN
interface WAN
ipv6rs
iaid 1
# use the interface connected to your LAN
ia_pd 1 LAN
#ia_pd 1/::/64 LAN/0/64

この設定は WAN インターフェイス (WAN) からプレフィックスを要求して内部インターフェイス (LAN) に委譲します。/64 が発行される場合、コメントアウトされている ia_pd instruction を使う必要があります。また、WAN インターフェイス (WAN) 以外の全てのインターフェイスでルーター要請は無効になります。

ヒント: dhcpcd(8)dhcpcd.conf(5) の man ページも参照。

WIDE-DHCPv6 を使う

WIDE-DHCPv6 は Dynamic Host Configuration Protocol for IPv6 (DHCPv6) のオープンソース実装で、KAME プロジェクトによって開発されました。AURwide-dhcpv6AUR からインストール可能です。

wide-dhcpv6 を使用する場合 /etc/wide-dhcpv6/dhcp6c.conf を編集して下さい:

# use the interface connected to your WAN
interface WAN {
  send ia-pd 0;
};
 
id-assoc pd 0 {
  # use the interface connected to your LAN
  prefix-interface LAN {
    sla-id 1;
    sla-len 8;
  };
};
ノート: sla-len(WAN-prefix) + (sla-len) = 64 となるように設定してください。上記の場合 /56 プレフィックス用に設定されています (56+8=64)。/64 プレフィックスの場合 sla-len0 になります。

wide-dhcpv6 クライアントを起動・有効化するには以下のコマンドを使います。WAN は WAN に接続しているインターフェイスに置き換えてください:

# systemctl enable/start dhcp6c@WAN.service
ヒント: 詳しくは dhcp6c(8)dhcp6c.conf(5) の man ページを読んで下さい。

Comcast の IPv6

Motorola SURFBoard 6141 や Realtek RTL8168d/8111d で dhcpcd -4dhcpcd -6 が機能することを確認しています。どちらか片方なら動作しますが、両方のプロトコルとアドレスを単一のインターフェイスで使用するデュアルスタックは上手くいきません (-4 を先に実行した場合、たとえインターフェイスをリセットしたとしても、-6 コマンドが機能しなくなります。コマンドを実行したとき、NIC には /128 アドレスが付与されます)。以下のコマンドを試してください:

# dhclient -4 enp3s0
# dhclient -P -v enp3s0

-P 引数は IPv6 プレフィックスのリースだけを取得します。-vstdout に書き込みを行います。/var/lib/dhclient/dhclient6.leases にも書き込みが行われます:

Bound to *:546
Listening on Socket/enp3s0
Sending on   Socket/enp3s0
PRC: Confirming active lease (INIT-REBOOT).
XMT: Forming Rebind, 0 ms elapsed.
XMT:  X-- IA_PD a1:b2:cd:e2
XMT:  | X-- Requested renew  +3600
XMT:  | X-- Requested rebind +5400
XMT:  | | X-- IAPREFIX 1234:5:6700:890::/64

IAPREFIX は必須の値です。CIDR スラッシュの前の ::1 を置き換えてプレフィックスを実際のアドレスにしてください:

# ip -6 addr add 1234:5:6700:890::1/64 dev enp3s0

IPv6 の無効化

ノート: Arch カーネルは直接 IPv6 をサポートしてるため、モジュールをブラックリスト化することはできません。

機能を無効にする

警告: IPv6 スタックを無効化すると特定のプログラムが動作しなくなってしまう可能性があります: FS#46297

カーネル行に ipv6.disable=1 を追加すると IPv6 スタック全体が無効化されるので、問題が発生している場合の対処法として使うことができます。詳しくはカーネルパラメータを見て下さい。

もしくは、ipv6.disable_ipv6=1 を追加すると IPv6 スタックの機能は維持されつつも、どのネットワークデバイスにも IPv6 アドレスが割り当てられなくなります。

以下の sysctl 設定を /etc/sysctl.d/40-ipv6.conf に追加することで、特定のネットワークインターフェイスへの IPv6 アドレスの割り当てを止めさせることも可能です:

# Disable IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.nic0.disable_ipv6 = 1
...
net.ipv6.conf.nicN.disable_ipv6 = 1

無効にするインターフェイスはちゃんと全て確認してください。sysctl の設定を適用する場合、all.disable_ipv6 の無効化は既に立ち上がっているインターフェイスには適用されないためです。

また、sysctl で IPv6 を無効化するときは、/etc/hosts の IPv6 ホストをコメントアウトしたほうが良いでしょう:

#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost
#::1 localhost.localdomain localhost

コメントアウトしておかないと、利用できない IPv6 アドレスでホストが解決されて接続エラーが起こる可能性があります。

他のプログラム

カーネルの IPv6 機能を無効化しても他のプログラムが IPv6 を使用するのを止めることはできません。ほとんどの場合、止めなくても全く問題ありませんが、プログラムに何か問題が発生するようでしたら、プログラムのマニュアルページを読んでプログラムが IPv6 を使用しないように設定してください。

dhcpcd

dhcpcd は (無害ですが) IPv6 のルーター要請を送信し続けます。これを無効にするには、dhcpcd.conf (5) man ページに書かれているように、以下を /etc/dhcpcd.conf に追加してください:

noipv6rs
noipv6

NetworkManager

NetworkManager で IPv6 を無効化するには、ネットワークの状態アイコンを右クリックして、Edit Connections > Wired > Network name > Edit > IPv6 Settings > Method > Ignore/Disabled を選択してください。

そして "Save" をクリックします。

ntpd

Systemd#ドロップインファイル に書いてあるように、systemd が ntpd.service を起動する方法を変更します:

# systemctl edit ntpd.service

ドロップインファイルが作成されデフォルトの ntpd.service の代わりに実行されます。-4 フラグは ntp デーモンによって IPv6 が使われるのを防ぎます。以下をドロップインファイルに記述してください:

[Service]
ExecStart=
ExecStart=/usr/bin/ntpd -4 -g -u ntp:ntp

最初に ExecStart を消去して、次に -4 フラグを使って置き換えます。

systemd-networkd

networkd ではインターフェイスごとに IPv6 を無効化できます。ネットワークユニットの [Network] セクションに LinkLocalAddressing=ipv4 または LinkLocalAddressing=no が指定されている場合、networkd はマッチするインターフェイスで IPv6 を設定しません。

ただし、上記のオプションを使用している場合でも、IPv6 がシステム全体で無効化されていないとき networkd はルーター広告を受け取ることを期待します。(sysctl や ip6tables の設定によって) インターフェイスに IPv6 のトラフィックが来ないと、インターフェイスは設定中状態で待機し続け、ネットワークが完全に設定されるまで待機するサービスがタイムアウトしてしまう可能性があります。この問題を回避するには、[Network] セクションに IPv6AcceptRA=no オプションも設定してください。

参照