「IPv6」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
(→‎他のプログラム: 英語版に同期)
 
(6人の利用者による、間の19版が非表示)
4行目: 4行目:
 
[[pt:IPv6]]
 
[[pt:IPv6]]
 
[[ru:IPv6]]
 
[[ru:IPv6]]
[[zh-CN:IPv6]]
+
[[zh-hans:IPv6]]
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|IPv6 トンネルブローカー設定}}
 
{{Related|IPv6 トンネルブローカー設定}}
15行目: 15行目:
   
 
$ ping ff02::1%eth0
 
$ ping ff02::1%eth0
  +
  +
以下のコマンドでローカルネットワークの近隣リストを取得できます:
  +
  +
$ ip -6 neigh
   
 
マルチキャストアドレス {{ic|ff02::2}} に ping するとルーターだけが返答します。
 
マルチキャストアドレス {{ic|ff02::2}} に ping するとルーターだけが返答します。
30行目: 34行目:
 
[[netctl]] を使っている場合、イーサネットまたはワイヤレス設定に以下の行を追加するだけで使えます。
 
[[netctl]] を使っている場合、イーサネットまたはワイヤレス設定に以下の行を追加するだけで使えます。
   
IP6=stateless
+
IP6=stateless
   
 
[[NetworkManager]] を使用している場合、自動的に IPv6 アドレスが有効になります。
 
[[NetworkManager]] を使用している場合、自動的に IPv6 アドレスが有効になります。
36行目: 40行目:
 
ステートレス自動設定は IPv6 の icmp パケットがネットワークを通過できる場合にのみ利用することができるので注意してください。クライアント側から {{ic|ipv6-icmp}} パケットを許可する必要があります。[[シンプルなステートフルファイアウォール]]/[[iptables]] を使っているのであれば次を追加してください:
 
ステートレス自動設定は IPv6 の icmp パケットがネットワークを通過できる場合にのみ利用することができるので注意してください。クライアント側から {{ic|ipv6-icmp}} パケットを許可する必要があります。[[シンプルなステートフルファイアウォール]]/[[iptables]] を使っているのであれば次を追加してください:
   
-A INPUT -p ipv6-icmp -j ACCEPT
+
-A INPUT -p ipv6-icmp -j ACCEPT
   
 
他のファイアウォールフロントエンド (ufw, shorewall など) を使っている場合はそれぞれのドキュメントを読んで {{ic|ipv6-icmp}} パケットを有効にしてください。
 
他のファイアウォールフロントエンド (ufw, shorewall など) を使っている場合はそれぞれのドキュメントを読んで {{ic|ipv6-icmp}} パケットを有効にしてください。
60行目: 64行目:
 
ゲートウェイも {{ic|ipv6-icmp}} パケットを全てのチェインで許可する必要があります。[[シンプルなステートフルファイアウォール]]/[[iptables]] を使っている場合は以下を追加:
 
ゲートウェイも {{ic|ipv6-icmp}} パケットを全てのチェインで許可する必要があります。[[シンプルなステートフルファイアウォール]]/[[iptables]] を使っている場合は以下を追加:
   
-A INPUT -p ipv6-icmp -j ACCEPT
+
-A INPUT -p ipv6-icmp -j ACCEPT
-A OUTPUT -p ipv6-icmp -j ACCEPT
+
-A OUTPUT -p ipv6-icmp -j ACCEPT
-A FORWARD -p ipv6-icmp -j ACCEPT
+
-A FORWARD -p ipv6-icmp -j ACCEPT
   
 
他のファイアウォールフロントエンドを使っている場合も適当に設定して、忘れずに {{ic|radvd.service}} を有効にしてください。
 
他のファイアウォールフロントエンドを使っている場合も適当に設定して、忘れずに {{ic|radvd.service}} を有効にしてください。
85行目: 89行目:
 
=== dhcpcd ===
 
=== dhcpcd ===
   
[[dhcpcd]] のデフォルト設定ファイルには、バージョン 6.4.0 から {{ic|slaac private}} オプションが含まれており、[https://tools.ietf.org/html/rfc7217 RFC 7217] の実装である、"Stable Private IPv6 Addresses instead of hardware based ones" を有効にします ([http://roy.marples.name/projects/dhcpcd/info/8aa9dab00dc72c453aeccbde885ecce27a3d81ff commit])。従って、新しいネットワークに接続するとき以外に IPv6 アドレスに変更するような場合を除いて、何も変更する必要はありません。
+
[[dhcpcd]] のデフォルト設定ファイルには、バージョン 6.4.0 から {{ic|slaac private}} オプションが含まれており、[https://tools.ietf.org/html/rfc7217 RFC 7217] の実装である、"Stable Private IPv6 Addresses instead of hardware based ones" を有効にします ([http://roy.marples.name/projects/dhcpcd/info/8aa9dab00dc72c453aeccbde885ecce27a3d81ff commit])。従って、新しいネットワークに接続するとき以外に IPv6 アドレスに変更するような場合を除いて、何も変更する必要はありません。固定アドレスの場合は {{ic|slaac hwaddr}} に設定してください
   
 
=== NetworkManager ===
 
=== NetworkManager ===
115行目: 119行目:
 
net.ipv6.conf.xxx.temp_valid_lft
 
net.ipv6.conf.xxx.temp_valid_lft
   
詳しくは [[systemd-networkd#IPv6 プライバシー拡張]] や [http://www.freedesktop.org/software/systemd/man/systemd.network.html systemd.network(5) man ページ] を参照。
+
詳しくは {{man|5|systemd.network}} を参照。
   
== 固定アドレス ==
+
=== connman ===
   
  +
{{ic|/var/lib/connman/settings}} の global セクションに以下を追加:
固定アドレスを使うことによって場合によりセキュリティが向上することがあります。例えば、あなたのローカルなルーターが近隣探索や radvd ([http://www.apps.ietf.org/rfc/rfc2461.html RFC 2461]) を使う場合、インターフェイスは MAC アドレスに基づいて自動的に割り当てられます (IPv6 の Stateless Autoconfiguration を使用)。これだと IP アドレスのネットワークが変更されたとしてもシステムを追跡することが出来るため、セキュリティ上あまりよろしくないということがあるでしょう。
 
   
  +
[global]
[[netctl]] を使って固定 IP アドレスを割り当てるには、{{ic|/etc/netctl/examples/ethernet-static}} のサンプルファイルを見て下さい。以下の行が重要です:
 
  +
IPv6.privacy=preferred
  +
  +
== 安定したプライベートアドレス ==
  +
  +
別の選択肢として、安定したプライベート IP アドレス ([[RFC:7217|RFC 7217]]) があります。これにより、インターフェイスの MAC アドレスを公開せずに、ネットワーク内で安定した IP を実現できます。
  +
  +
カーネルにキー (例:{{ic|wlan0}}) を生成させるには、次のように設定します。
  +
  +
# sysctl net.ipv6.conf.wlan0.addr_gen_mode=3
  +
  +
インターフェイスを停止してから、{{ic|ip addr show dev wlan 0}} の実行後、各 IPv6 アドレスの横に {{ic|stable-privacy}} が表示されます。カーネルはこのインターフェースの IP アドレスを生成するために、128ビットの秘密鍵を生成しています {{ic|sysctl net.ipv 6.conf.wlan 0.stable_secret}} この値を保持するため、{{ic|/etc/sysctl.d/40 ipv6.conf}} に次の行を追加します。
  +
  +
# Enable IPv6 stable privacy mode
  +
net.ipv6.conf.wlan0.stable_secret = <output from previous command>
  +
net.ipv6.conf.wlan0.addr_gen_mode = 2
  +
  +
{{Note|'''not''' を使用して IPv6 アドレスを取得している場合、{{ic|stable-privacy}} フラグはこの IP アドレスに割り当てられます。}}
  +
  +
=== NetworkManager ===
  +
  +
上記の設定は NetworkManager には適用されませんが、NetworkManager はデフォルトで安定したプライベートアドレスを使用します。[https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/nm-1-12/NEWS#L367-369][https://bugzilla.redhat.com/show_bug.cgi?id=1279242#c15]
  +
  +
== 固定 IP アドレス ==
  +
  +
スタティックアドレスを使用すると、セキュリティが向上する場合があります。たとえば、ローカルルーターが近傍検索または radvd ([[RFC:2461|RFC 2461]]) を使用している場合、インタフェースには自動的にその MAC アドレスに基づくアドレスが割り当てられます (IPv6 のステートレス自動構成を使用) これは、IP アドレスのネットワーク部分が変更されてもシステムを追跡できるため、セキュリティにとって理想的ではない場合があります。
  +
  +
[[netctl]] を使用してスタティック IP アドレスを割り当てるには、{{ic|/etc/netctl/examples/ethernet-static}} のプロファイル例を参照してください。次の行が重要です。
   
 
...
 
...
129行目: 160行目:
 
Routes6=('abcd::1234')
 
Routes6=('abcd::1234')
 
Gateway6='1234:0:123::abcd'
 
Gateway6='1234:0:123::abcd'
  +
  +
{{Note|1=IPv6 のみに接続している場合は、IPv6 DNS サーバーを確認する必要があります。例:
  +
  +
DNS=('6666:6666::1' '6666:6666::2')
  +
  +
プロバイダから IPv6 DNS を提供されていない場合は、 [[resolv.conf]] の記事から選択できます。
  +
}}
   
 
== IPv6 と PPPoE ==
 
== IPv6 と PPPoE ==
134行目: 172行目:
 
PPPoE の標準ツールである {{ic|pppd}} は PPPoE における IPv6 をサポートしています (あなたの ISP とモデムがサポートしている場合)。以下を {{ic|/etc/ppp/pppoe.conf}} に追加してください:
 
PPPoE の標準ツールである {{ic|pppd}} は PPPoE における IPv6 をサポートしています (あなたの ISP とモデムがサポートしている場合)。以下を {{ic|/etc/ppp/pppoe.conf}} に追加してください:
   
+ipv6
+
+ipv6
   
 
PPPoE に [[netctl]] を使っている場合、netctl の設定に以下を追加してください:
 
PPPoE に [[netctl]] を使っている場合、netctl の設定に以下を追加してください:
   
PPPoEIP6=yes
+
PPPoEIP6=yes
   
 
== プレフィックス委譲 (DHCPv6-PD) ==
 
== プレフィックス委譲 (DHCPv6-PD) ==
145行目: 183行目:
 
プレフィックス委譲は多くの ISP で IPv6 を展開するのに使われている技術です。ネットワークプレフィックスをユーザーサイト (ローカルネットワーク) に割り当てる手法になります。ルーターを設定することでネットワークプレフィックスを様々なサブネットワークに割り当てるができます。ISP は DHCPv6 を使ってネットワークプレフィックスの手綱を握り (大抵は {{ic|/56}} か {{ic|/64}})、dhcp クライアントがプレフィックスをローカルネットワークに割り当てます。インターフェイスが2つのシンプルなゲートウェイの場合、WAN (もしくは ppp などの擬似インターフェイス) に接続されたインターフェイスから取得したアドレスから、ローカルネットワークに接続されたインターフェイスに IPv6 プレフィックスが割り当てられます。
 
プレフィックス委譲は多くの ISP で IPv6 を展開するのに使われている技術です。ネットワークプレフィックスをユーザーサイト (ローカルネットワーク) に割り当てる手法になります。ルーターを設定することでネットワークプレフィックスを様々なサブネットワークに割り当てるができます。ISP は DHCPv6 を使ってネットワークプレフィックスの手綱を握り (大抵は {{ic|/56}} か {{ic|/64}})、dhcp クライアントがプレフィックスをローカルネットワークに割り当てます。インターフェイスが2つのシンプルなゲートウェイの場合、WAN (もしくは ppp などの擬似インターフェイス) に接続されたインターフェイスから取得したアドレスから、ローカルネットワークに接続されたインターフェイスに IPv6 プレフィックスが割り当てられます。
   
  +
DHCPv6 ではポート 546 への UDP 接続を受け入れる必要があります。[[nftables]] ベースのファイアウォールでは {{ic|/etc/nftables.conf}} 内の input チェイン内に以下のように一行追加することで設定可能です:
=== dibbler を使う ===
 
   
  +
table inet filter {
[http://klub.com.pl/dhcpv6/ Dibbler] はポータブルな DHCPv6 クライアントであり、プレフィックス委譲に使うことができます。[[AUR]] の {{AUR|dibbler}} でインストール可能です。
 
  +
chain input {
 
  +
udp dport dhcpv6-client accept
{{ic|dibbler}} を使用する場合、{{ic|/etc/dibbler/client.conf}} を編集して下さい:
 
  +
...
 
  +
}
log-mode short
 
  +
...
log-level 7
 
# use the interface connected to your WAN
 
iface "WAN" {
 
ia
 
pd
 
 
}
 
}
 
{{Tip|詳しくは {{ic|dibbler-client(8)}} の man ページを見て下さい。}}
 
   
 
=== dhcpcd を使う ===
 
=== dhcpcd を使う ===
181行目: 213行目:
 
この設定は WAN インターフェイス ({{ic|WAN}}) からプレフィックスを要求して内部インターフェイス ({{ic|LAN}}) に委譲します。{{ic|/64}} が発行される場合、コメントアウトされている {{ic|ia_pd instruction}} を使う必要があります。また、WAN インターフェイス ({{ic|WAN}}) 以外の全てのインターフェイスでルーター要請は無効になります。
 
この設定は WAN インターフェイス ({{ic|WAN}}) からプレフィックスを要求して内部インターフェイス ({{ic|LAN}}) に委譲します。{{ic|/64}} が発行される場合、コメントアウトされている {{ic|ia_pd instruction}} を使う必要があります。また、WAN インターフェイス ({{ic|WAN}}) 以外の全てのインターフェイスでルーター要請は無効になります。
   
{{Tip|{{ic|dhcpcd(8)}} と {{ic|dhcpcd.conf(5)}} の man ページも参照。}}
+
{{Tip|{{man|8|dhcpcd}} と {{man|5|dhcpcd.conf}} の man ページも参照。}}
   
 
=== WIDE-DHCPv6 を使う ===
 
=== WIDE-DHCPv6 を使う ===
208行目: 240行目:
   
 
{{Tip|詳しくは {{ic|dhcp6c(8)}} と {{ic|dhcp6c.conf(5)}} の man ページを読んで下さい。}}
 
{{Tip|詳しくは {{ic|dhcp6c(8)}} と {{ic|dhcp6c.conf(5)}} の man ページを読んで下さい。}}
  +
  +
=== systemd-networkd ===
  +
  +
アップストリーム(wan)とダウンストリーム(lan)のインターフェイスを両方設定してください。これで、DHCPv6 クライアントが実行中のインターフェイスで DHCPv6-PD が有効化されます。委譲されたプレフィックスはダウンストリームのネットワークに IPv6 ルータ広告によって配布されます。
  +
  +
{{hc|/etc/systemd/network/wan.network|2=
  +
[Network]
  +
# ipv4 と ipv6 の両方の場合は、'ipv6' ではなく 'yes' を使用してください
  +
DHCP=ipv6
  +
}}
  +
  +
{{hc|/etc/systemd/network/lan.network|2=
  +
[Network]
  +
IPv6SendRA=yes
  +
DHCPv6PrefixDelegation=yes
  +
}}
  +
  +
=== 他のクライアント ===
  +
  +
[[dhclient]] もプレフィックスをリクエストできます。しかし、プレフィックスやその一部をインターフェイスに割り当てるには ''dhclient'' exit スクリプトを使う必要があります。例を上げると、https://github.com/jaymzh/v6-gw-scripts/blob/master/dhclient-ipv6。
  +
  +
== NAT64 ==
  +
  +
[[Wikipedia:NAT64]] は IPv6 移行技術であり、NAT を使用して IPv6 のみのホストが IPv4 のホストと通信できます。
  +
  +
Linux カーネルは NAT64 をネイティブにサポートしていませんが、NAT64 のサポートを追加するパッケージがいくつかあります:
  +
  +
* {{App|Jool|Linux 用の SIIT と NAT64|https://www.jool.mx/|{{AUR|jool-dkms}}, {{AUR|jool-tools}}}}
  +
* {{App|TAYGA|NAT64 デーモン(未メンテナンス)|http://www.litech.org/tayga/|{{AUR|tayga}}}}
   
 
== Comcast の IPv6 ==
 
== Comcast の IPv6 ==
216行目: 277行目:
 
# dhclient -P -v enp3s0
 
# dhclient -P -v enp3s0
   
The {{ic|-P}} argument grabs a lease of the IPv6 prefix only. {{ic|-v}} writes to {{ic|stdout}} what is also written to {{ic|/var/lib/dhclient/dhclient6.leases}}:
+
{{ic|-P}} 引数は IPv6 プレフィックスのリースだけを取得します。{{ic|-v}} {{ic|stdout}} に書き込みを行います。{{ic|/var/lib/dhclient/dhclient6.leases}} にも書き込みが行われます:
   
 
Bound to *:546
 
Bound to *:546
228行目: 289行目:
 
XMT: | | X-- '''IAPREFIX 1234:5:6700:890::/64'''
 
XMT: | | X-- '''IAPREFIX 1234:5:6700:890::/64'''
   
  +
{{ic|IAPREFIX}} は必須の値です。CIDR スラッシュの前の {{ic|::1}} を置き換えてプレフィックスを実際のアドレスにしてください:
{{ic|IAPREFIX}} is the necessary value. Substitute {{ic|::1}} before the CIDR slash to make the prefix a real address:
 
   
 
# ip -6 addr add 1234:5:6700:890::1/64 dev enp3s0
 
# ip -6 addr add 1234:5:6700:890::1/64 dev enp3s0
237行目: 298行目:
   
 
=== 機能を無効にする ===
 
=== 機能を無効にする ===
 
{{Warning|IPv6 スタックを無効化すると特定のプログラムが動作しなくなってしまう可能性があります: {{bug|46297}}。}}
 
   
 
カーネル行に {{ic|1=ipv6.disable=1}} を追加すると IPv6 スタック全体が無効化されるので、問題が発生している場合の対処法として使うことができます。詳しくは[[カーネルパラメータ]]を見て下さい。
 
カーネル行に {{ic|1=ipv6.disable=1}} を追加すると IPv6 スタック全体が無効化されるので、問題が発生している場合の対処法として使うことができます。詳しくは[[カーネルパラメータ]]を見て下さい。
251行目: 310行目:
 
...
 
...
 
net.ipv6.conf.''nicN''.disable_ipv6 = 1
 
net.ipv6.conf.''nicN''.disable_ipv6 = 1
  +
  +
設定を反映させるためには、{{ic|systemd-sysctl.service}}を[[Systemd#ユニットを使う|再起動]]します。
  +
  +
{{bc|# systemctl restart systemd-sysctl.service}}
   
 
無効にするインターフェイスはちゃんと全て確認してください。sysctl の設定を適用する場合、{{ic|all.disable_ipv6}} の無効化は既に立ち上がっているインターフェイスには適用されないためです。
 
無効にするインターフェイスはちゃんと全て確認してください。sysctl の設定を適用する場合、{{ic|all.disable_ipv6}} の無効化は既に立ち上がっているインターフェイスには適用されないためです。
268行目: 331行目:
 
==== dhcpcd ====
 
==== dhcpcd ====
   
''dhcpcd'' は (無害ですが) IPv6 のルーター要請を送信し続けます。これを無効にするには、{{ic|dhcpcd.conf (5)}} [[man ページ]]に書かれているように、以下を {{ic|/etc/dhcpcd.conf}} に追加してください:
+
''dhcpcd'' は (無害ですが) IPv6 のルーター要請を送信し続けます。これを無効にするには、{{man|5|dhcpcd.conf}} [[man ページ]]に書かれているように、以下を {{ic|/etc/dhcpcd.conf}} に追加してください:
   
 
noipv6rs
 
noipv6rs
281行目: 344行目:
 
==== ntpd ====
 
==== ntpd ====
   
[[Systemd#ドロップインスニペット]] に書いてあるように、systemd が {{ic|ntpd.service}} を起動する方法を変更します:
+
[[Systemd#ドロップインファイル]] に書いてあるように、systemd が {{ic|ntpd.service}} を起動する方法を変更します:
   
 
# systemctl edit ntpd.service
 
# systemctl edit ntpd.service
   
ドロップインスニペットが作成されデフォルトの {{ic|ntpd.service}} の代わりに実行されます。{{ic|-4}} フラグは ntp デーモンによって IPv6 が使われるのを防ぎます。以下をドロップインスニペットに記述してください:
+
ドロップインファイルが作成されデフォルトの {{ic|ntpd.service}} の代わりに実行されます。{{ic|-4}} フラグは ntp デーモンによって IPv6 が使われるのを防ぎます。以下をドロップインファイルに記述してください:
   
 
[Service]
 
[Service]
292行目: 355行目:
   
 
最初に {{ic|ExecStart}} を消去して、次に {{ic|-4}} フラグを使って置き換えます。
 
最初に {{ic|ExecStart}} を消去して、次に {{ic|-4}} フラグを使って置き換えます。
  +
  +
==== GnuPG ====
  +
  +
''dirmngr'' の設定ファイルで IPv6 を無効化してください:
  +
  +
{{hc|~/.gnupg/dirmngr.conf|
  +
disable-ipv6
  +
}}
  +
  +
そして、{{ic|dirmngr.service}} ユーザユニットを [[Systemd#ユニットを使う|再起動]] してください。
  +
  +
==== sshd ====
  +
  +
{{ic|sshd_config}} に以下の行を追加して、''sshd'' が IPv4 を使うようにしてください:
  +
  +
{{hc|/etc/ssh/sshd_config|
  +
AddressFamily inet
  +
}}
  +
  +
そして、{{ic|sshd.service}} を再起動してください。
  +
  +
==== systemd-timesyncd ====
  +
  +
時々、[[systemd-timesyncd]] は IPv6 が無効化されているにも関わらず IPv6 のタイムサーバーに問い合わせようとします。その結果、システムクロックを同期できずに以下の様なエラーが記録されます:
  +
  +
systemd-timesyncd[336]: Failed to set up connection socket: Address family not supported by protocol
  +
  +
以下のように、''Status'' エントリの IPv6 アドレスに対して接続を試みたことが {{ic|systemd-timesyncd}} の[[Systemd#ユニットを使う|ユニットステータス]]に表示されるでしょう:
  +
  +
Status: "Connecting to time server [2001:19f0:8001:afd:5400:1ff:fe9d:cba]:123 (2.pool.ntp.org)"
  +
  +
{{Bug|59806}} によると、"2." ntp.org プールのみが IPv6 を提供します。なので、この問題を回避するには {{ic|/etc/systemd/timesyncd.conf}} ファイル内の NTP と FallbackNTP エントリから {{ic|2.arch.pool.ntp.org}} と {{ic|2.pool.ntp.org}} を削除してください。
  +
  +
==== systemd-networkd ====
  +
  +
[[networkd]] ではインターフェイスごとに IPv6 を無効化できます。ネットワークユニットの {{ic|[Network]}} セクションに {{ic|1=LinkLocalAddressing=ipv4}} または {{ic|1=LinkLocalAddressing=no}} が指定されている場合、networkd はマッチするインターフェイスで IPv6 を設定しません。
  +
  +
ただし、上記のオプションを使用している場合でも、IPv6 がシステム全体で無効化されていないとき networkd はルーター広告を受け取ることを期待します。(sysctl や ip6tables の設定によって) インターフェイスに IPv6 のトラフィックが来ないと、インターフェイスは設定中状態で待機し続け、ネットワークが完全に設定されるまで待機するサービスがタイムアウトしてしまう可能性があります。この問題を回避するには、{{ic|[Network]}} セクションに {{ic|1=IPv6AcceptRA=no}} オプションも設定してください。
   
 
== 参照 ==
 
== 参照 ==
297行目: 398行目:
 
* [https://www.kernel.org/doc/Documentation/networking/ipv6.txt IPv6] - kernel.org ドキュメント
 
* [https://www.kernel.org/doc/Documentation/networking/ipv6.txt IPv6] - kernel.org ドキュメント
 
* [http://www.ipsidixit.net/2012/08/09/ipv6-temporary-addresses-and-privacy-extensions/ IPv6 temporary addresses] - 一時アドレスとプライバシー拡張についての概要
 
* [http://www.ipsidixit.net/2012/08/09/ipv6-temporary-addresses-and-privacy-extensions/ IPv6 temporary addresses] - 一時アドレスとプライバシー拡張についての概要
* [http://tldp.org/HOWTO/Linux+IPv6-HOWTO/x513.html IPv6 prefixes] - a summary of prefix types
+
* [http://tldp.org/HOWTO/Linux+IPv6-HOWTO/ch03s02.html IPv6 prefixes] - プリフィックスタイプの概要
* [http://tldp.org/HOWTO/Linux+IPv6-HOWTO/proc-sys-net-ipv6..html net.ipv6 options] - カーネルパラメータのドキュメント
+
* [http://tldp.org/HOWTO/Linux+IPv6-HOWTO/ch11s02.html net.ipv6 options] - カーネルパラメータのドキュメント

2022年4月14日 (木) 20:21時点における最新版

関連記事

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) を参照。

connman

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

[global]
IPv6.privacy=preferred

安定したプライベートアドレス

別の選択肢として、安定したプライベート IP アドレス (RFC 7217) があります。これにより、インターフェイスの MAC アドレスを公開せずに、ネットワーク内で安定した IP を実現できます。

カーネルにキー (例:wlan0) を生成させるには、次のように設定します。

# sysctl net.ipv6.conf.wlan0.addr_gen_mode=3

インターフェイスを停止してから、ip addr show dev wlan 0 の実行後、各 IPv6 アドレスの横に stable-privacy が表示されます。カーネルはこのインターフェースの IP アドレスを生成するために、128ビットの秘密鍵を生成しています sysctl net.ipv 6.conf.wlan 0.stable_secret この値を保持するため、/etc/sysctl.d/40 ipv6.conf に次の行を追加します。

# Enable IPv6 stable privacy mode
net.ipv6.conf.wlan0.stable_secret = <output from previous command>
net.ipv6.conf.wlan0.addr_gen_mode = 2
ノート: not を使用して IPv6 アドレスを取得している場合、stable-privacy フラグはこの IP アドレスに割り当てられます。

NetworkManager

上記の設定は NetworkManager には適用されませんが、NetworkManager はデフォルトで安定したプライベートアドレスを使用します。[1][2]

固定 IP アドレス

スタティックアドレスを使用すると、セキュリティが向上する場合があります。たとえば、ローカルルーターが近傍検索または radvd (RFC 2461) を使用している場合、インタフェースには自動的にその MAC アドレスに基づくアドレスが割り当てられます (IPv6 のステートレス自動構成を使用) これは、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 のみに接続している場合は、IPv6 DNS サーバーを確認する必要があります。例:
DNS=('6666:6666::1' '6666:6666::2')
プロバイダから IPv6 DNS を提供されていない場合は、 resolv.conf の記事から選択できます。

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 プレフィックスが割り当てられます。

DHCPv6 ではポート 546 への UDP 接続を受け入れる必要があります。nftables ベースのファイアウォールでは /etc/nftables.conf 内の input チェイン内に以下のように一行追加することで設定可能です:

table inet filter {
  chain input {
    udp dport dhcpv6-client accept
    ...
  }
...
}

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 ページを読んで下さい。

systemd-networkd

アップストリーム(wan)とダウンストリーム(lan)のインターフェイスを両方設定してください。これで、DHCPv6 クライアントが実行中のインターフェイスで DHCPv6-PD が有効化されます。委譲されたプレフィックスはダウンストリームのネットワークに IPv6 ルータ広告によって配布されます。

/etc/systemd/network/wan.network
[Network]
# ipv4 と ipv6 の両方の場合は、'ipv6' ではなく 'yes' を使用してください
DHCP=ipv6
/etc/systemd/network/lan.network
[Network]
IPv6SendRA=yes
DHCPv6PrefixDelegation=yes

他のクライアント

dhclient もプレフィックスをリクエストできます。しかし、プレフィックスやその一部をインターフェイスに割り当てるには dhclient exit スクリプトを使う必要があります。例を上げると、https://github.com/jaymzh/v6-gw-scripts/blob/master/dhclient-ipv6。

NAT64

Wikipedia:NAT64 は IPv6 移行技術であり、NAT を使用して IPv6 のみのホストが IPv4 のホストと通信できます。

Linux カーネルは NAT64 をネイティブにサポートしていませんが、NAT64 のサポートを追加するパッケージがいくつかあります:

  • Jool — Linux 用の SIIT と NAT64
https://www.jool.mx/ || jool-dkmsAUR, jool-toolsAUR
  • TAYGA — NAT64 デーモン(未メンテナンス)
http://www.litech.org/tayga/ || taygaAUR

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.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

設定を反映させるためには、systemd-sysctl.service再起動します。

# systemctl restart systemd-sysctl.service

無効にするインターフェイスはちゃんと全て確認してください。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 フラグを使って置き換えます。

GnuPG

dirmngr の設定ファイルで IPv6 を無効化してください:

~/.gnupg/dirmngr.conf
disable-ipv6

そして、dirmngr.service ユーザユニットを 再起動 してください。

sshd

sshd_config に以下の行を追加して、sshd が IPv4 を使うようにしてください:

/etc/ssh/sshd_config
AddressFamily inet

そして、sshd.service を再起動してください。

systemd-timesyncd

時々、systemd-timesyncd は IPv6 が無効化されているにも関わらず IPv6 のタイムサーバーに問い合わせようとします。その結果、システムクロックを同期できずに以下の様なエラーが記録されます:

systemd-timesyncd[336]: Failed to set up connection socket: Address family not supported by protocol

以下のように、Status エントリの IPv6 アドレスに対して接続を試みたことが systemd-timesyncdユニットステータスに表示されるでしょう:

Status: "Connecting to time server [2001:19f0:8001:afd:5400:1ff:fe9d:cba]:123 (2.pool.ntp.org)"

FS#59806 によると、"2." ntp.org プールのみが IPv6 を提供します。なので、この問題を回避するには /etc/systemd/timesyncd.conf ファイル内の NTP と FallbackNTP エントリから 2.arch.pool.ntp.org2.pool.ntp.org を削除してください。

systemd-networkd

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

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

参照