IPv6

提供: ArchWiki
2022年4月14日 (木) 20:21時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎他のプログラム: 英語版に同期)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

関連記事

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 オプションも設定してください。

参照