OpenWrt 23.05.5をルータとして構築しているネットワークにおいてはグローバルユニークアドレス(GUA: global unique address)とユニークローカルアドレス (ULA: unique local address)の同時運用を避けた方が良い。 将来、OpenWrtのバージョンが上がった際に挙動が修正されているか確認するためのメモを残しておく。
設定項目やドキュメントを見落としている可能性もあるが、どうやらバージョン23.05.5ではルータ配下のネットワークのノード(ホスト)がGUAとULA両方を保持することを想定して実装されていないようだ。 細かい設定は省くが、以下のように二者択一のようだった。
- ノードがGUA(IPv4におけるグローバルIPアドレスのようなもの)を得てインターネットと通信できる状態にすると、ULAで互いに通信できなくなる。
- ULAで互いに通信できるようにすると、NATなしでインターネットと通信ができなくなる。
OpenWrtのWikiにも以下のような記述がある。
Bugs have been reported in how OpenWrt handles both GUAs and ULAs assigned on a network in some circumstances, so it is preferable to disable ULA assignment unless it is necessary.
[OpenWrt Wiki] IPv6 troubleshooting
共通の前提条件や背景
- IPv6への移行を進めるため、積極的にIPv6を利用したい。
- IPv6とIPv4のデュアルスタックで構築している。
- ネットワーク内にサーバが存在するため、変化しない固定のIPv6アドレスとしてULAを設定したい。
- 複数のVLANが存在し、ULAでは対応するサブネットIDを割り当てている。
- インターネットサービスプロバイダ(ISP: internet service provider)からGUA用に
/64の1つのプレフィックスしかもらえない。 - IPv6では積極的にはネットワークアドレス変換(NAT: network address translation)、Linux用語ではIPマスカレードを行わないという思想に従い、NATは使わない。
前者の状況の説明
ルータ広告(RA: router advertisement)やDHCPv6(dynamic host configuration protocol for IPv6)でルータ管理下のホスト全てがGUAを取得できる。 全てのノードがインターネットと通信できる。
LAN側のinterfaceにULAを設定している。 ノードにもULAを設定している。
tcpdumpで確認すると以下の挙動が分かる。
- OpenWrt側に付加したULAでICMPv6(internet control message protocol for IPv6)の近隣広告(NA: neighbor advertisement)もRAも送信されない。
- 明示的にルータ要請(RS: router solicitation)、近隣要請(NS: neighbor solicitation)を送信しても反応がない。
- OpenWrtが配下のノードのULAをneighborとして認識していない。pingなどを行おうとするとDestination Unreachableになる。
GUAならば全てRFC通りに動作しているように見える。
後者の状況の説明
RAに対し、ULAのprefixを応答してしまう。 結果として、ルータ配下のノードがGUAを設定できない。 ただし、ULAに対するNS、NAは機能し、ルータ側からホストのULAへのpingが通る。
NATの設定をしていないから、IPv6でインターネットと通信できない。
サブネットIDが違うULAとの通信が完全に機能するか否かは未確認
現状の妥協案
GUAでインターネットと通信できることを優先する。 LAN内のノード間の通信はIPv4のプライベートアドレスで行う。