「IPv6」の版間の差分
(同期) |
(→他のプログラム: 英語版に同期) |
||
(6人の利用者による、間の19版が非表示) | |||
4行目: | 4行目: | ||
[[pt:IPv6]] |
[[pt:IPv6]] |
||
[[ru:IPv6]] |
[[ru:IPv6]] |
||
− | [[zh- |
+ | [[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 |
|
[[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 |
|
他のファイアウォールフロントエンド (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 OUTPUT -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 |
||
− | 詳しくは |
+ | 詳しくは {{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 |
|
PPPoE に [[netctl]] を使っている場合、netctl の設定に以下を追加してください: |
PPPoE に [[netctl]] を使っている場合、netctl の設定に以下を追加してください: |
||
− | + | 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|{{ |
+ | {{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 |
||
− | + | {{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 のルーター要請を送信し続けます。これを無効にするには、{{ |
+ | ''dhcpcd'' は (無害ですが) IPv6 のルーター要請を送信し続けます。これを無効にするには、{{man|5|dhcpcd.conf}} [[man ページ]]に書かれているように、以下を {{ic|/etc/dhcpcd.conf}} に追加してください: |
noipv6rs |
noipv6rs |
||
281行目: | 344行目: | ||
==== ntpd ==== |
==== ntpd ==== |
||
− | [[Systemd#ドロップイン |
+ | [[Systemd#ドロップインファイル]] に書いてあるように、systemd が {{ic|ntpd.service}} を起動する方法を変更します: |
# systemctl edit ntpd.service |
# systemctl edit ntpd.service |
||
− | ドロップイン |
+ | ドロップインファイルが作成されデフォルトの {{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/ |
+ | * [http://tldp.org/HOWTO/Linux+IPv6-HOWTO/ch03s02.html IPv6 prefixes] - プリフィックスタイプの概要 |
− | * [http://tldp.org/HOWTO/Linux+IPv6-HOWTO/ |
+ | * [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::/64
。prefix
ブロックは宣言したいプレフィックスの数だけ繰り返し用いることができます。
ゲートウェイも 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_tempaddr
や default.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
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
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 と 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
) 以外の全てのインターフェイスでルーター要請は無効になります。
WIDE-DHCPv6 を使う
WIDE-DHCPv6 は Dynamic Host Configuration Protocol for IPv6 (DHCPv6) のオープンソース実装で、KAME プロジェクトによって開発されました。AUR の wide-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; }; };
wide-dhcpv6 クライアントを起動・有効化するには以下のコマンドを使います。WAN
は WAN に接続しているインターフェイスに置き換えてください:
# systemctl enable/start dhcp6c@WAN.service
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 デーモン(未メンテナンス)
Comcast の IPv6
Motorola SURFBoard 6141 や Realtek RTL8168d/8111d で dhcpcd -4
や dhcpcd -6
が機能することを確認しています。どちらか片方なら動作しますが、両方のプロトコルとアドレスを単一のインターフェイスで使用するデュアルスタックは上手くいきません (-4
を先に実行した場合、たとえインターフェイスをリセットしたとしても、-6
コマンドが機能しなくなります。コマンドを実行したとき、NIC には /128 アドレスが付与されます)。以下のコマンドを試してください:
# dhclient -4 enp3s0 # dhclient -P -v enp3s0
-P
引数は IPv6 プレフィックスのリースだけを取得します。-v
は stdout
に書き込みを行います。/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 の無効化
機能を無効にする
カーネル行に 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.org
と 2.pool.ntp.org
を削除してください。
systemd-networkd
networkd ではインターフェイスごとに IPv6 を無効化できます。ネットワークユニットの [Network]
セクションに LinkLocalAddressing=ipv4
または LinkLocalAddressing=no
が指定されている場合、networkd はマッチするインターフェイスで IPv6 を設定しません。
ただし、上記のオプションを使用している場合でも、IPv6 がシステム全体で無効化されていないとき networkd はルーター広告を受け取ることを期待します。(sysctl や ip6tables の設定によって) インターフェイスに IPv6 のトラフィックが来ないと、インターフェイスは設定中状態で待機し続け、ネットワークが完全に設定されるまで待機するサービスがタイムアウトしてしまう可能性があります。この問題を回避するには、[Network]
セクションに IPv6AcceptRA=no
オプションも設定してください。
参照
- IPv6 - kernel.org ドキュメント
- IPv6 temporary addresses - 一時アドレスとプライバシー拡張についての概要
- IPv6 prefixes - プリフィックスタイプの概要
- net.ipv6 options - カーネルパラメータのドキュメント