「IPv6」の版間の差分
(「NAT64」を追加) |
(→他のプログラム: 英語版に同期) |
||
(同じ利用者による、間の1版が非表示) | |||
298行目: | 298行目: | ||
=== 機能を無効にする === |
=== 機能を無効にする === |
||
− | |||
− | {{Warning|IPv6 スタックを無効化すると特定のプログラムが動作しなくなってしまう可能性があります: {{bug|46297}}。}} |
||
カーネル行に {{ic|1=ipv6.disable=1}} を追加すると IPv6 スタック全体が無効化されるので、問題が発生している場合の対処法として使うことができます。詳しくは[[カーネルパラメータ]]を見て下さい。 |
カーネル行に {{ic|1=ipv6.disable=1}} を追加すると IPv6 スタック全体が無効化されるので、問題が発生している場合の対処法として使うことができます。詳しくは[[カーネルパラメータ]]を見て下さい。 |
||
357行目: | 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 ==== |
==== systemd-networkd ==== |
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 - カーネルパラメータのドキュメント