OpenWrt(21.02)でIPv6インターネットを使う

OpenWrtでIPv6インターネット(+IPv4インターネットも)を使えるようにする覚書。
この設定で、WindowsやUbuntu、iOSでIPv6アドレスが自動割当され通信できている。

■ 前提

フレッツ光回線(コラボ回線:我が家はOCN光)でIPv6オプションがついてる。

デュアルスタック構成にする。

公開サーバのIPv4通信はPPPoEとし、無線ルータからのIPv4通信はIPv4 over IPv6(MAP-E)で通信する構成する。

OpenWrtは21.02を使用。インターフェースはLAN、WAN、WAN6があるものとする。
WANはPPPoEでIPv4接続できている状態とする。

ネットワーク構成は下記の通り。

端末LANのIP
OpenWrt192.168.1.1
公開サーバ192.168.1.2
無線ルータ192.168.1.3

[LuCI]はブラウザからログインして設定、[SSH]はSSHでログインして設定する。

■ WAN6をIPv6で通信できるように設定

  1. [LuCI] LANインターフェースを設定する。
    [DHCP Server][IPv6 Settings]
    RA-Service:relay mode
    DHCPv6-Service:server mode
    NDP-Proxy:relay mode
  2. [LuCI] WAN6インターフェースを設定する。
    [General Settings]
    Protocol:DHCPv6 client

    [DHCP Server][IPv6 Settings]
    Designated master:チェック
    RA-Service:relay mode
    DHCPv6-Service:relay mode
    NDP-Proxy:relay mode
  3. [LuCI] Save & Applyする。

OpenWrtを再起動して配下の端末にIPv6アドレスが配布されるのを確認。
下記のような接続確認サイトでIPv6で接続できていることを確認。

参考
IPv6 test – IPv6/4 connectivity and speed test

■ IPv4 over IPv6で通信できるように設定

  1. [LuCI] mapパッケージ、iptables-mod-ipoptパッケージをインストールする。
  2. OpenWrtを再起動する。
  3. [LuCI] 新しいインターフェースを作成する。
    名前:wan6pd
    プロトコル:Static address

    OpenWrtのLANインターフェースのIPv6アドレスを「2222:aaaa:bbbb:cccc::1/64」とした場合、
    下記のような設定をする。
    [General Settings]
    IPv6 address:2222:aaaa:bbbb:cccc::1001
    IPv6 gateway:2222:aaaa:bbbb:cccc::1
    IPv6 routed prefix:2222:aaaa:bbbb:cccc::/56
  4. [LuCI] Save & Applyする。
  1. MAP-E設定値を取得する。

http://ipv4.web.fc2.com/map-e.html

現在のIPv6アドレスを入力して「計算」を押すと必要な設定値が算出される。超便利な謎サイト。ありがてえ。

  1. [LuCI] 新しいインターフェースを作成する。
    名前:wanmap
    プロトコル:MAP / LW4over6

    [General Settings]
    Type:MAP-E
    下記設定値は上記で取得した値を使用する。
    BR / DMR / AFTR
    IPv4 prefix
    IPv4 prefix length
    IPv6 prefix
    IPv6 prefix length
    EA-bits length
    PSID-bits length
    PSID offset

    [Advanced Settings]
    Tunnel Link:wan6pd
    Use legacy MAP:チェック
  2. [LuCI] Save & Applyする。
  3. [LuCI] ファイアウォールのゾーンWANに、WAN6PDインターフェースとWANMAPインターフェースを追加する。
  1. [Luci] ファイヤーウォールのカスタムルールを設定する。

参考
map-e | Pastebin | Teknik

カスタムルールスクリプト作ってくれた人に感謝!
IPとPSIDは、MAP-E設定値 で算出した値を使用する。
OCNとその他のV6プラスでは設定値が異なる模様。

units1=63 #V6plus:15 OCN:63
units2=1024 #V6plus 4096 OCN:1024
IP4='xxx.xxx.xxx.xxx'
PSID='x'
TUNDEV='map-wanmap'


iptables -t nat -F PREROUTING
iptables -t nat -F OUTPUT
iptables -t nat -F POSTROUTING

rule=1
while [ $rule -le $units1  ] ; do
  mark=`expr $rule + 16`
  pn=`expr $rule - 1`
  portl=`expr $rule \* $units2 + $PSID \* 16`
  portr=`expr $portl + 15`

  iptables -t nat -A PREROUTING -m statistic --mode nth --every $units1 --packet $pn -j MARK --set-mark $mark
  iptables -t nat -A OUTPUT -m statistic --mode nth --every $units1 --packet $pn -j MARK --set-mark $mark

  iptables -t nat -A POSTROUTING -p icmp -o $TUNDEV -m mark --mark $mark -j SNAT --to $IP4:$portl-$portr
  iptables -t nat -A POSTROUTING -p tcp -o $TUNDEV -m mark --mark $mark -j SNAT --to $IP4:$portl-$portr
  iptables -t nat -A POSTROUTING -p udp -o $TUNDEV -m mark --mark $mark -j SNAT --to $IP4:$portl-$portr
  rule=`expr $rule + 1`
done
  1. [SSH] /etc/iproute2/rt_tablesを修正しルートテーブルを追加する。
vi /etc/iproute2/rt_tables
200     map
  1. [SSH] /etc/config/networkを修正する。
    無線ルータからのIPv4通信はIPv4 over IPv6を使うようにルーティングを設定する。
vi /etc/config/network
...
config rule
        option src '172.16.1.3/32'
        option lookup 'map'

config route
        option table 'map'
        option interface 'wanmap'
        option target '0.0.0.0'
        option netmask '0.0.0.0'
  1. OpenWrtを再起動する。

下記のような接続確認サイトでIPv4アドレスを確認。
無線ルータ配下の端末は、MAP-Eで取得したIPv4アドレスで通信していることを確認。
公開サーバは、PPPoEのIPv4アドレスで通信していることを確認。

参考
IPv6 test – IPv6/4 connectivity and speed test

v6プラス利用判定
OCN | 接続環境確認
IPv4 over IPv6でつながっていると「〇 v6プラスつかっています」と表示される。※JPNE系
OCN系は確認すると「IPoE方式」と表示される。