企業ネットワークのIPv6対応が本格化してきた一方で、「IPv4のファイアウォールは万全なのにIPv6の設定は後回し」という現場を何度も見てきました。IPv6を有効にした瞬間、これまで築いてきたIPv4のセキュリティ境界が事実上無効化されるリスクがあります。
この記事では、IPv6移行・デュアルスタック環境で見落とされがちな脅威と、ip6tables・firewalldを使った実践的な防御設定を現場目線で解説します。ネットワーク機器の設定変更に不安がある方も、ステップごとに確認できる構成にしていますので、ぜひ最後まで読んでみてください。
IPv6とは?IPv4との主な違いとセキュリティへの影響
IPv6(Internet Protocol version 6)は、IPv4のアドレス枯渇問題を解決するために設計された次世代インターネットプロトコルです。IPv4の32ビット(約43億アドレス)に対し、IPv6は128ビット(約340澗個)のアドレス空間を持ちます。
セキュリティ観点での主な違いは次の通りです。
| 項目 | IPv4 | IPv6 | 注意点 |
|---|---|---|---|
| アドレス解決 | ARP | NDP(近隣探索プロトコル) | NDPスプーフィングに注意 |
| NAT | 一般的に使用 | 原則不要 | 端末が直接公開されるリスク |
| ICMP | 任意でブロック可 | ICMPv6は一部が必須 | 過剰ブロックで通信障害が発生 |
| アドレス自動設定 | DHCPが主流 | SLAAC(ステートレス)も使用 | 管理外デバイスの自動参加リスク |
特に重要なのは「NATがなくなる」という変化です。IPv4では家庭や企業のルーターがNATを行い、内部ネットワークのIPアドレスが外部から直接見えない構成が一般的でした。IPv6ではグローバルアドレスが端末に直接付与されるため、ファイアウォールの設定が不十分だと内部の端末がインターネットに直接露出する可能性があります。
「NATがセキュリティの壁になっていた」という側面は設計上の副産物ではありましたが、IPv6ではその前提が崩れます。ファイアウォールの明示的な設定が以前にも増して重要です。
IPv6移行で見落とされがちな3つの脅威
1. デュアルスタック環境での「IPv4だけ守っている」落とし穴
多くの企業では、IPv4とIPv6の両方が有効な「デュアルスタック」構成を使っています。この環境でよくあるのが「iptablesは万全に設定したが、ip6tablesはデフォルトのまま」というケースです。
攻撃者の視点から見ると、IPv4のファイアウォールをくぐれない場合でも、IPv6経路が開いていれば侵入できます。OSやルーターがIPv6に対応していながら設定を忘れていると、思わぬ穴を作ることになります。
まず現状確認から始めましょう。
# IPv6アドレスが割り当てられているか確認 ip -6 addr show # ip6tablesの現在のルールを確認(ルールが空=無防備) sudo ip6tables -L -n -v # firewalldでIPv6の状態確認(AlmaLinux/RHEL系) sudo firewall-cmd --info-zone=public | grep -i ipv6
デュアルスタック環境では、IPv4とIPv6の両方で同等のセキュリティポリシーを適用することが大原則です。「IPv4は守れているからOK」は危険な思い込みです。
2. NDP(近隣探索プロトコル)を悪用したスプーフィング攻撃
NDP(Neighbor Discovery Protocol)は、IPv6でIPアドレスとMACアドレスを対応付けるプロトコルです。IPv4でいうARPに相当しますが、同様の偽装攻撃(NDPスプーフィング)が存在します。
攻撃者が同一セグメントに侵入した場合、偽のNeighbor Advertisement(NA)メッセージを送ることで、通信を自分のデバイスに誘導する中間者攻撃が可能です。
対策として、スイッチやルーターで「RA Guard(ルーターアドバタイズメントガード)」や「DHCPv6ガード」を有効にすることが推奨されます。エンタープライズ向けスイッチ(Cisco Catalystシリーズ、Juniper EXシリーズ等)はこれらの機能を持つものが多く、セキュリティを意識した調達時の選定ポイントになります。
Linuxホスト側では、カーネルパラメータでRA(ルーターアドバタイズメント)の受け入れを制御することもできます。
# ルーターアドバタイズメントの受け入れを無効化(静的設定環境向け) # /etc/sysctl.conf に追記 net.ipv6.conf.all.accept_ra = 0 net.ipv6.conf.default.accept_ra = 0 # 設定を即時反映 sudo sysctl -p
ただし、DHCPv6やSLAACでアドレスを取得する環境では、この設定を有効にすると通信が途絶えます。静的にIPv6アドレスを設定しているサーバー環境に適した手順です。
3. ICMPv6を過度にブロックして自滅するケース
IPv4ではICMPをブロックしても基本的な通信は維持できますが、ICMPv6はIPv6通信の根幹を支えているため、過剰なブロックは深刻な通信障害を引き起こします。
通信に必要な主なICMPv6タイプは以下の通りです。
・タイプ1(宛先到達不能): パケット配送エラーの通知に必須
・タイプ2(パケット過大): Path MTU Discovery(経路最大転送単位)に必須
・タイプ3(時間超過): TTL超過の通知に使用
・タイプ4(パラメーターエラー): ヘッダー不正の通知に必須
・タイプ128/129(echo要求・応答): pingの動作に使用
・タイプ133~137(NDP関連): ルーター探索・近隣探索に必須
これらを誤ってすべてブロックすると、大きなパケットが届かなくなる・ルーター探索ができなくなるなどの障害が発生します。「ICMPv6は必要なタイプだけ許可し、残りはドロップ」が正しいアプローチです。
ip6tablesで基本的なIPv6フィルタリングを設定する
ip6tablesはLinuxのIPv6パケットフィルタリングツールです。IPv4用のiptablesと同様のコマンド体系で使えますが、ICMPv6の扱いが異なる点に注意が必要です。
1. デフォルトポリシーの設定
すべてのチェーンのデフォルトポリシーをDROPに設定し、必要なものだけ許可するホワイトリスト方式を採用します。
# デフォルトポリシーをDROPに設定(作業前に既存の接続が切れないか確認すること) sudo ip6tables -P INPUT DROP sudo ip6tables -P FORWARD DROP sudo ip6tables -P OUTPUT ACCEPT # 確立済み接続・関連パケットを許可(既存セッションの継続のために必須) sudo ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ループバックインターフェースを許可 sudo ip6tables -A INPUT -i lo -j ACCEPT
2. 必須のICMPv6タイプを許可する
通信に必要なICMPv6タイプを個別に許可します。この設定を省略するとネットワークが正常に機能しなくなるため、必ず設定してください。
# 必須ICMPv6の許可(宛先到達不能・パケット過大・時間超過・パラメーターエラー) 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 # NDP(近隣探索・ルーター探索)の許可 sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT # pingの許可(必要に応じて。ブロックしても通信は維持される) sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
3. サービスポートの制御とルールの保存
SSHなど必要なサービスのポートだけを許可し、ルールを永続化します。
# SSH(22番ポート)を許可 sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT # Webサーバー(80, 443)を許可する場合 sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT # ルールの保存(Ubuntu/Debian系) sudo ip6tables-save | sudo tee /etc/iptables/rules.v6 # ルールの保存(CentOS/RHEL/AlmaLinux系: iptables-servicesパッケージ利用時) sudo service ip6tables save # 設定確認 sudo ip6tables -L -n -v --line-numbers
設定変更後は、別のSSHセッションを開いた状態でテストするか、リモート作業の場合は「一定時間後に自動でルールをフラッシュするタイマー」をあらかじめ仕掛けておくと、設定ミスによるロックアウトを防げます。
firewalldでIPv6セキュリティを管理する
firewalldはRHEL系Linux(CentOS、AlmaLinux、Rocky Linuxなど)で標準採用されているファイアウォール管理ツールです。IPv4/IPv6の両方を一元管理できるため、ip6tablesを直接操作するよりも設定ミスが起きにくい点が特徴です。
1. IPv6対応の確認とゾーン設定
# firewalldのバージョン確認 sudo firewall-cmd --version # 現在のゾーン設定を確認 sudo firewall-cmd --get-active-zones # publicゾーンで許可されているサービスを確認 sudo firewall-cmd --zone=public --list-all # 特定のIPv6サブネットのみ許可する場合 sudo firewall-cmd --zone=trusted --add-source=2001:db8::/32 --permanent sudo firewall-cmd --reload
firewalldはバックエンドでnftables(またはiptables)を使用しており、IPv6のICMPv6必須タイプは自動的に許可されます。ただし、追加の制限を加える場合は動作確認を必ず行ってください。
2. 不要なサービスの無効化と棚卸し
firewalldのデフォルト設定では、用途によっては不要なサービスが許可されていることがあります。定期的に棚卸しを行い、不要なものは削除します。
# 許可されているサービスをすべて確認 sudo firewall-cmd --zone=public --list-services # MDNSが不要なWebサーバーでは削除(ローカルネットワーク探索プロトコル) sudo firewall-cmd --zone=public --remove-service=mdns --permanent # cockpitポート(9090)が不要な場合は削除 sudo firewall-cmd --zone=public --remove-service=cockpit --permanent sudo firewall-cmd --reload # 変更後の確認 sudo firewall-cmd --zone=public --list-all
Linuxファイアウォールの詳細な設定手順については、姉妹サイトLinuxMaster.JPでも解説しています。firewalldやnftablesの基礎から学びたい方はあわせてご覧ください。
中小企業でも今日からできること
技術的な設定を解説しましたが、情シスが1人の中小企業でも段階的に取り組める対策を優先度順にまとめます。
| 優先度 | 対策 | 難易度 |
|---|---|---|
| 最優先 | 現状確認(IPv6が有効か・ip6tablesにルールがあるか) | 低(コマンド確認のみ) |
| 最優先 | 使わない環境ではIPv6を無効化する | 低(sysctl設定1行) |
| 高 | ip6tables / firewalldでIPv6フィルタリングを設定する | 中(本記事の手順参照) |
| 高 | IPv4とIPv6のポリシーが同等かを確認する | 低(既存ルールと比較) |
| 中 | RA Guard・DHCPv6ガード対応スイッチへの更新を検討する | 高(機器更新が必要) |
| 中 | ip6tables / firewalldルールの定期棚卸し(四半期に1回) | 低(リストコマンドで確認) |
「そもそもIPv6が必要かどうか」を確認することも重要です。クラウドサービスやISPの設定でIPv6が自動的に有効になっているケースがあります。まずは`ip -6 addr show`で現在の状態を確認しましょう。
使う予定がなければ無効化するのが最も安全な対策です。
# IPv6を無効化する(/etc/sysctl.confに追記) # 変更点: デフォルト状態のIPv6有効設定を明示的に無効化 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 # 設定を即時反映 sudo sysctl -p # 無効化を確認(出力がなければ無効化成功) ip -6 addr show
ただし、クラウド環境(AWS EC2など)ではIPv6を無効化するとメタデータサービスへのアクセスに影響する場合があります。クラウド環境では環境依存の確認が必要です。
よくある誤解と注意点
「IPv6は将来の話だから今は関係ない」
クラウドサービス(AWS、GCP、Azure)のVPCやEC2インスタンスでは、設定によってIPv6が自動的に有効になっていることがあります。オンプレミスに限らず、クラウド環境でも確認が必要です。ISPからの接続でも、気づかないうちにIPv6が有効になっているケースがあります。
「IPv6を有効にしてもIPv4のポリシーは変わらないから安全」
デュアルスタックではIPv4とIPv6が独立して動作します。IPv4のルールは維持されますが、IPv6側のルールは別途設定が必要です。「IPv4は守れているからOK」は誤りです。IPv6経路から侵入される可能性があります。
「ICMPv6はすべてブロックすれば安全」
IPv4と異なり、ICMPv6はプロトコルの根幹を支えています。必須タイプをブロックすると、MTU Discoveryが機能せず大きなパケットが届かない、NDPが動かずルーター探索ができないなどの深刻な障害が発生します。「最小権限でもICMPv6の必須タイプは許可する」が正しいアプローチです。
「プライベートIPv6アドレス(fc00::/7)なら外部に見えない」
ユニークローカルアドレス(ULA)はNATを使わなければ外部に出ません。しかし内部ネットワーク内での侵害には有効に使われます。外部露出は防げますが、内部脅威対策は別途必要です。外部に見えないことと、内部で安全であることは別の話です。
本記事のまとめ
IPv6セキュリティ対策のポイントを整理します。
| 脅威・課題 | 対策 | 難易度 |
|---|---|---|
| IPv4だけを守っている(IPv6が無防備) | ip6tables / firewalldで同等のポリシーを設定 | 低~中 |
| NDPスプーフィング(ARP詐称のIPv6版) | RA Guard・DHCPv6ガード対応スイッチの導入 | 高 |
| ICMPv6の過剰ブロックによる通信障害 | 必須タイプ(タイプ1,2,3,4,128,129,133~137)を許可 | 中 |
| SLAACによる管理外デバイスの自動参加 | accept_ra=0で外部RAを無効化、またはDHCPv6管理 | 低 |
| IPv6が不要なのに有効になっている | sysctl.confでdisable_ipv6=1を設定 | 低 |
IPv6は「将来の技術」ではなく、すでに多くの環境で稼働しています。「IPv4と同じ感覚でIPv6も守れている」という思い込みを捨て、まずは`ip -6 addr show`と`sudo ip6tables -L -n -v`で現状を確認することから始めましょう。現状を把握してから設定を進めれば、大きなリスクは回避できます。
IPv6以外にも、見落としているセキュリティリスクがありませんか?
「何から手を付けるべきかわからない」「情シス1人でどこまで対応できるか不安」——そんな現場の声に応える実践的なセキュリティ情報をお届けしています。
正しいセキュリティ知識を体系的に身につけたい方へ、メルマガで実践的なセキュリティ対策ノウハウをお届けしています。
