IPv6の仕組みとLinuxでのネットワーク設定入門

※本記事にはプロモーションを含む場合があります。
- IPv6は128ビットのアドレス空間を持ち、理論上は約3.4×10の38乗個のアドレスを扱えるとされています
- SLAACによる自動設定に対応していれば、ケーブル接続からわずか数秒〜1分程度でネットワークに参加できる場合があります
- Linuxでの設定はipコマンドによる一時設定と、設定ファイルによる永続設定の2系統に分かれます
- /64が標準的なサブネットサイズとされ、それより小さい割り当ては非推奨とされています(RFC 5375)
- ip6tablesまたはnftablesでのファイアウォール設計を怠ると、IPv6経路からの不正アクセスを許すリスクが高まります
なぜIPv6が必要なのか?
IPv6は1998年にIETFによって標準化された次世代のインターネットプロトコルです。開発の背景にあったのは、IPv4アドレスの枯渇問題でした。IANA(Internet Assigned Numbers Authority)は2011年にIPv4アドレスの中央在庫を使い切ったと報告しており、その後も各地域レジストリの在庫が段階的に減少を続けてきたとされています(出典: IANA IPv4 Exhaustion Report 2011)。
Googleが公開しているIPv6接続統計では、世界全体のIPv6経由アクセス比率はここ数年で40%台前半に達しているとされています。国や通信事業者によって普及率には差があり、モバイル回線を中心にIPv6化が先行している地域も少なくありません。
IPv6導入の主な理由は以下の通りです。
- グローバルIPアドレスの枯渇問題の解決
- SLAAC(Stateless Address Autoconfiguration)による運用コスト削減
- IPsecの標準実装によるセキュリティ機能の向上
- ヘッダーフォーマットの簡素化によるルーティング効率の向上
- IoTやモバイル端末など、新しいアプリケーションへの対応
移行にあたっては、IPv6とIPv4に直接の互換性がないという点を押さえておく必要があります。両者は別プロトコルとして扱われるため、既存のIPv4環境をそのままIPv6に読み替えることはできません。移行技術としては、IPv4とIPv6を同時稼働させる「デュアルスタック」、IPv6パケットをIPv4網でカプセル化する「トンネリング」、双方のプロトコルを変換する「トランスレーション」の3種類が代表的です。中でもデュアルスタックは既存インフラを活かしつつ段階的に移行できるため、多くの現場で採用されているとされています。実際の移行プロジェクトでは、検証環境の構築から本番切り替えまでに数週間〜90日程度の計画期間を確保するケースが一般的です。
IPv4との違いを比較
IPv6とIPv4の違いを整理すると、単なるアドレス桁数の増加にとどまらないことが分かります。以下の比較表で主要な違いをまとめました。
| 特徴 | IPv4 | IPv6 |
|---|---|---|
| アドレス空間 | 32ビット(約43億アドレス) | 128ビット(約3.4×10の38乗アドレス) |
| ヘッダー構造 | 可変長ヘッダー(オプションフィールドあり) | 固定長ヘッダーでルータ処理を高速化 |
| 自動設定 | 手動設定またはDHCP必須 | SLAACにより即座にネットワーク接続が可能 |
| セキュリティ | IPsecはオプション実装 | IPsecが標準実装され暗号化通信が容易 |
| マルチキャスト | 限定的なサポート | 効率的なグループ通信に対応 |
特に注目すべきはヘッダー構造の違いです。IPv4のヘッダーはオプションフィールドを含む可変長構造のため、ルータ側での処理負荷が増えやすい傾向があります。一方IPv6は固定長ヘッダーを採用しており、ルータでのパケット処理段数が理論上は数十%削減されるとされています。これにより大規模なバックボーンネットワークでの転送効率が向上します。
アドレス空間の拡大についても具体的に見ておきます。IPv6の128ビットという空間は、単純計算で地球上の全人口1人あたり約6.6×10の23乗個のアドレスを割り当てられる規模です。これにより、従来はプライベートIPとNATで運用せざるを得なかった家庭内のIoT機器やセンサー類にも、個別のグローバルアドレスを付与することが現実的になりました。2023年時点で、Linux・Windows・macOSといった主要OSとほとんどのネットワーク機器はデュアルスタックに対応しているとされています(出典: IETF RFC 4213)。
アドレス表記のルール
IPv6アドレスは128ビットを16ビットずつ8つのグループに分割し、それぞれを16進数4桁で表記します。各グループはコロン(:)で区切られ、合計すると32文字の16進数を8組のコロン区切りで表す形になります。
具体的な表記ルールは以下の4点です。
- 各グループは16進数(0-9、a-f)で表記する
- グループ内の先行ゼロは省略できる
- 連続するゼログループは「::」で1回だけ省略できる
- アルファベットの大文字・小文字は区別されない
| 表記例 | 展開形 | 説明 |
|---|---|---|
| 2001:0db8:0000:0000:0000:ff00:0042:8329 | 2001:db8:0:0:0:ff00:42:8329 | 先行ゼロを省略した形 |
| 2001:db8::ff00:42:8329 | 2001:db8:0:0:0:ff00:42:8329 | 連続ゼロを「::」で省略 |
| ::1 | 0:0:0:0:0:0:0:1 | ループバックアドレス(IPv4の127.0.0.1に相当) |
| fe80::1 | fe80:0:0:0:0:0:0:1 | リンクローカルアドレス |
注意しておきたいのは、「::」による省略は1つのアドレスにつき1回しか使えないという点です。もし2箇所に使ってしまうと、どこからどこまでが省略された部分か一意に特定できなくなります。設定ファイルへの手入力時にこの表記ミスが発生すると、疎通確認からトラブルシューティングまで1時間以上のロスにつながるケースもあるため、コピー&ペーストや自動生成ツールの活用が推奨されています。
アドレスの種類と用途
IPv6アドレスは用途によって、ユニキャスト・マルチキャスト・エニーキャストの3種類に大別されます。ユニキャストは単一インターフェース宛て、マルチキャストは複数インターフェースへの同時送信、エニーキャストは複数インターフェースのうち最も近い1台への送信に使われます。実務でもっとも扱う頻度が高いのはユニキャストで、さらに以下のサブタイプに分類されます。
| アドレスタイプ | プレフィックス | 用途 | 例 |
|---|---|---|---|
| グローバルユニキャスト | 2000::/3 | インターネット上でルーティング可能 | 2001:db8:1234::1 |
| リンクローカル | fe80::/10 | 同一リンク内でのみ有効 | fe80::a9f:1234:5678:9abc |
| ユニークローカル | fc00::/7 | ローカルネットワーク内のプライベート用途 | fc00:1234::1 |
| ループバック | ::1/128 | ローカルホスト間通信 | ::1 |
グローバルユニキャストのプレフィックスである2000::/3は、128ビット空間全体のうち上位3ビットで区切られる範囲、すなわち全アドレス空間の12.5%に相当します。それだけでも従来のIPv4全体をはるかに上回る規模のアドレスが確保されている計算です。
リンクローカルアドレス(fe80::/10)は同一リンク内での通信にのみ使われ、ルーティングテーブルには載りません。これはインターフェースの起動時に自動生成されるため、グローバルアドレスの設定有無にかかわらず必ず存在します。
サブネットの表記にはプレフィックス長を使います。例えば「2001:db8:1234::/48」は最初の48ビットがネットワーク部、「2001:db8:1234:5678::/64」は最初の64ビットがネットワーク部という意味です。推奨されるプレフィックス長の目安は、ISPから割り当てられるグローバルアドレスが/48、ローカルネットワークがSLAACの標準サイズである/64、サーバーやルータの単一アドレスが/128です。/64のサブネット1つで収容できるホスト数は理論上約1.8×10の19乗台にのぼり、事実上枯渇の心配がありません。/64未満のサブネット割り当てはSLAACが正常に機能しなくなるなどの問題があるため、非推奨とされています(出典: RFC 5375)。
Linuxでの設定手順は?
Linuxサーバーで実際にIPv6を設定する際の代表的な流れを、確認から永続化まで順を追って解説します。
- 現在のネットワーク状態を確認する
# ネットワークインターフェースの一覧 ip link show # IPv6アドレスの確認 ip -6 addr show # IPv6ルーティングテーブルの確認 ip -6 route show # IPv6接続性のテスト ping6 ipv6.google.com出力例は次のようになります。eth0がUP状態であること、グローバルIPv6アドレスとリンクローカルアドレスが両方表示されることを確認します。
2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000 inet6 2001:db8:1234::1/64 scope global valid_lft forever preferred_lft forever inet6 fe80::a9f:1234:5678:9abc/64 scope link valid_lft forever preferred_lft forever - ipコマンドで一時的に設定する
再起動すると消える一時設定ですが、動作検証には便利です。
# IPv6アドレスの追加 sudo ip -6 addr add 2001:db8:1234::1/64 dev eth0 # 設定の確認 ip -6 addr show eth0 # 設定の削除 sudo ip -6 addr del 2001:db8:1234::1/64 dev eth0 - 設定ファイルで永続化する
ディストリビューションごとに設定ファイルの場所が異なります。Debian/Ubuntu系では/etc/network/interfacesを編集します。
auto eth0 iface eth0 inet6 static address 2001:db8:1234::1 netmask 64RHEL/CentOS系では/etc/sysconfig/network-scripts/ifcfg-eth0に以下を記載します。
DEVICE=eth0 BOOTPROTO=none ONBOOT=yes IPV6INIT=yes IPV6ADDR=2001:db8:1234::1/64 IPV6_DEFAULTGW=2001:db8:1234::ffffsystemd-networkdを使う場合は/etc/systemd/network/10-eth0.networkに以下を記載します。
[Match] Name=eth0 [Network] Address=2001:db8:1234::1/64 Gateway=2001:db8:1234::ffff - ネットワークサービスを再起動する
設定ファイル編集後は、対応するサービスを1回再起動して反映させます。
# Debian/Ubuntu sudo systemctl restart networking # RHEL/CentOS sudo systemctl restart network # systemd-networkd sudo systemctl restart systemd-networkd
リモートサーバーで作業する場合、再起動のタイミングでSSH接続が切れる可能性があるため、コンソールアクセス手段を確保してから作業するようにします。
ルーティングとFW設定
IPv6ルーティングの設定では、デフォルトゲートウェイと静的ルートを定義します。一時的な設定は次のコマンドで行えます。
# デフォルトゲートウェイの一時設定
sudo ip -6 route add default via 2001:db8:1234::ffff dev eth0
# 特定ネットワーク宛ての静的ルート追加
sudo ip -6 route add 2001:db8:5678::/48 via 2001:db8:1234::1234 dev eth0
# ルーティングテーブルの確認
ip -6 route showsystemd-networkdで永続化する場合は、先ほどの.networkファイルに[Route]セクションを追記します。
[Route]
Destination=2001:db8:5678::/48
Gateway=2001:db8:1234::1234ファイアウォールの設定はip6tables(IPv6専用)またはnftablesで行います。ip6tablesの基本設定例は以下の通りです。
# 既存ルールの確認
sudo ip6tables -L -n -v
# ポリシーの初期化
sudo ip6tables -F
sudo ip6tables -X
sudo ip6tables -Z
# デフォルトポリシーの設定
sudo ip6tables -P INPUT DROP
sudo ip6tables -P FORWARD DROP
sudo ip6tables -P OUTPUT ACCEPT
# ループバックとESTABLISHED接続の許可
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# ICMPv6の許可(必須、最低6種類設定するのが一般的)
sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT
# SSHとWebサービスの許可
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPTICMPv6は近隣探索プロトコル(NDP)にも使われるため、全遮断するとリンク内通信そのものが機能しなくなります。ICMPv6を誤って遮断した結果、原因調査から復旧まで2時間以上を要した、という事例は珍しくありません。近年はiptablesより柔軟なnftablesが推奨される場面も増えており、/etc/nftables.confに次のようなルールセットを記述します。
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
iif "lo" accept
ct state established,related accept
meta l4proto icmpv6 accept
tcp dport 22 accept
tcp dport { http, https } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}本番環境にファイアウォール設定を適用する前は、以下のチェックリストで確認しておくと事故を防ぎやすくなります。
- □ 現在のルールをバックアップ(ip6tables-save等)で保存したか
- □ SSH用ポート(22番など)を許可ルールに含めたか
- □ ICMPv6の主要タイプを許可し、NDPを塞いでいないか
- □ コンソールまたはVPN経由で復旧できる経路を確保したか
- □ ルール適用後、別セッションで疎通確認を行ったか
デュアルスタック構築手順
デュアルスタックはIPv4とIPv6を同一インターフェースで同時に稼働させる、もっとも一般的な移行方式です。既存のIPv4インフラを活かしたまま段階的に移行できる点が評価されており、追加のライセンス費用が発生しないため、実質0円で導入できるケースが多いのも特徴です。
- IPv4・IPv6を同時に一時設定する
sudo ip addr add 192.168.1.100/24 dev eth0 sudo ip -6 addr add 2001:db8:1234::100/64 dev eth0 sudo ip route add default via 192.168.1.1 sudo ip -6 route add default via 2001:db8:1234::ffff - Debian/Ubuntuで永続化する
auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 iface eth0 inet6 static address 2001:db8:1234::100 netmask 64 gateway 2001:db8:1234::ffff - RHEL/CentOSで永続化する
DEVICE=eth0 BOOTPROTO=none ONBOOT=yes IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 IPV6INIT=yes IPV6ADDR=2001:db8:1234::100/64 IPV6_DEFAULTGW=2001:db8:1234::ffff - 両プロトコルの疎通を確認する
ping 8.8.8.8 ping6 2001:4860:4860::8888 curl -6 ifconfig.co curl ifconfig.co
ISPからIPv6プレフィックスが払い出されている場合は、ネイティブIPv6接続を組める点も押さえておきます。必要な情報は、割り当てプレフィックス(例:2001:db8:1234::/48)、デフォルトゲートウェイ、DNSサーバーの3点です。SLAAC(Stateless Address Autoconfiguration)を有効にすれば、ルータ広告を受信するだけで自動的にアドレスが払い出され、RHEL系ではIPV6_AUTOCONF=yes、Debian系ではiface eth0 inet6 autoの1行で設定できます。SLAACによるアドレス取得は通常数秒〜数十秒で完了するとされています。
ISPがIPv6を提供していない場合は、Hurricane Electric Tunnel Brokerなどのトンネルブローカーを使ってIPv6接続を確立する方法もあります。サイト上でアカウントを作成し、自宅などのIPv4グローバルアドレスを登録すると、IPv6エンドポイントが払い出されます。Linux側では以下のようにsitトンネルインターフェースを作成します。
sudo ip tunnel add he-ipv6 mode sit remote 2001:470:1f11:586::1 local 198.51.100.100 ttl 255
sudo ip link set he-ipv6 up
sudo ip -6 addr add 2001:470:1f11:586::2/64 dev he-ipv6
sudo ip -6 route add default dev he-ipv6よくある質問
Q1. IPv6を設定するとIPv4は使えなくなりますか?
使えなくなることはありません。多くの環境ではデュアルスタックとしてIPv4とIPv6を同時に稼働させるため、既存のIPv4通信に影響を与えずにIPv6を追加できます。
Q2. SLAACとDHCPv6はどちらを使うべきですか?
アドレスの自動割り当てだけで十分な環境ではSLAACがシンプルです。DNSサーバー情報など細かい制御が必要な場合はDHCPv6、あるいはSLAACとDHCPv6の併用(ステートレスDHCPv6)が選ばれる傾向にあります。
Q3. ping6コマンドが通らない原因は何が考えられますか?
ICMPv6がファイアウォールで遮断されている、リンクローカルアドレスしか付与されていない、ルーティングが未設定、といった要因が代表的です。ip -6 addr showとip -6 route showで状態を1つずつ確認します。
Q4. /64より小さいサブネットを割り当ててもよいですか?
技術的には設定できますが、SLAACが正常に動作しなくなる可能性があるため、RFC 5375では/64を標準サイズとし、それ未満は非推奨としています。
Q5. ip6tablesとnftablesはどちらを選ぶべきですか?
既存環境でip6tablesの運用実績が長い場合は無理に移行する必要はありません。新規構築であれば、ルール記述が柔軟でIPv4/IPv6を1つの設定にまとめられるnftablesが近年推奨される傾向にあります。
インフラやクラウド構築の設定は稼働環境によって差が出やすいため、本番環境に反映する前には検証環境での動作確認を行うようにします。掲載しているコマンドや設定値は執筆時点の各種公式ドキュメントをもとにしており、最新の仕様は各ベンダーの公式情報もあわせて確認してください。
本記事はInfra Academy編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。 編集ポリシーはこちら




