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

OpenWrtでIPv6インターネット(+IPv4インターネットも)を使えるようにする覚書。
この設定で、WindowsやUbuntu、iOSでIPv6アドレスが自動割当され通信できている。
(2020/12/03追記)
IPv4 over IPv6設定を追加。なお、公開サーバはPPPoEのIPv4で通信するように構築。
(2020/12/23追記)
ポートを240個使えるようにする設定を追加。

■ 前提

フレッツ光回線(コラボ回線:我が家はビッグローブ光→OCN光)でIPv6オプションがついてる。
OCN光にしたけど、設定方法は特に変わらなかった。

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

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

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

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

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

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

参考
OpenWrt Project: IPv6

SSHでOpenWrtに接続し、/etc/config/dhcpを修正する。

vi /etc/config/dhcp
...
config dhcp 'lan'
...
        option dhcpv6 'server'
        option ra_management '1'
        option ra 'relay'
        option ndp 'relay'

...

config dhcp 'wan6'
        option dhcpv6 'server'
        option ra 'relay'
        option ndp 'relay'
        option master '1'

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

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

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

参考
OpenWrtでv6プラス(MAP-E)接続する手順 – いぇいいぇい

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

  1. [LuCI] mapパッケージ、iptables-mod-ipoptパッケージをインストールする。
  2. OpenWrtを再起動する。
  3. [LuCI] WAN6のCustom delegated IPv6-prefixを設定する。
    IPv6アドレスが「2222:aaaa:bbbb:cccc:dddd:eeee:ffff:gggg/64」だったら
    「2222:aaaa:bbbb:cccc::/56」を設定する。
  4. [LuCI] 新しいインターフェースを作成する。
    名前:wanmap
    プロトコル:MAP / LW4over6

    ※インターフェースを作成した後、詳細設定画面が出てくるが設定が反映されないので(不具合だと思う)、Dismissを押す。(後程SSHで設定する)
  5. [LuCI] Save & Applyする。
  6. [SSH] /etc/iproute2/rt_tablesを修正しルートテーブルを追加する。
vi /etc/iproute2/rt_tables
200     map
  1. [SSH] /etc/firewall.userを修正する。
vi /etc/firewall.user
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet  0 -j MARK --set-mark 10
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet  1 -j MARK --set-mark 11
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet  2 -j MARK --set-mark 12
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet  3 -j MARK --set-mark 13
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet  4 -j MARK --set-mark 14
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet  5 -j MARK --set-mark 15
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet  6 -j MARK --set-mark 16
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet  7 -j MARK --set-mark 17
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet  8 -j MARK --set-mark 18
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet  9 -j MARK --set-mark 19
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 10 -j MARK --set-mark 20
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 11 -j MARK --set-mark 21
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 12 -j MARK --set-mark 22
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 13 -j MARK --set-mark 23
iptables -t nat -A PREROUTING -m statistic --mode nth --every 15 --packet 14 -j MARK --set-mark 24

iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet  0 -j MARK --set-mark 10
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet  1 -j MARK --set-mark 11
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet  2 -j MARK --set-mark 12
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet  3 -j MARK --set-mark 13
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet  4 -j MARK --set-mark 14
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet  5 -j MARK --set-mark 15
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet  6 -j MARK --set-mark 16
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet  7 -j MARK --set-mark 17
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet  8 -j MARK --set-mark 18
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet  9 -j MARK --set-mark 19
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 10 -j MARK --set-mark 20
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 11 -j MARK --set-mark 21
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 12 -j MARK --set-mark 22
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 13 -j MARK --set-mark 23
iptables -t nat -A OUTPUT -m statistic --mode nth --every 15 --packet 14 -j MARK --set-mark 24
  1. /lib/netifd/proto/map.shを修正し、マークの設定を追加する。
vi /lib/netifd/proto/map.sh
...
        json_add_array firewall
...
          else
+           local mark=10
            for portset in $(eval "echo \$RULE_${k}_PORTSETS"); do
              for proto in icmp tcp udp; do
                json_add_object ""
                  json_add_string type nat
                  json_add_string target SNAT
                  json_add_string family inet
                  json_add_string proto "$proto"
+                 json_add_string mark "$mark"
...
             json_close_object
              done
+             mark=`expr $mark + 1`
            done
          fi
...
  1. MAP-E設定値を取得する。

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

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

#export LEGACY=1ではなく、export LEGACY=1となっている場合は/lib/netifd/proto/map.shを修正する。

vi /lib/netifd/proto/map.sh
...
#export LEGACY=1
export LEGACY=1
...
  1. [SSH] /etc/config/networkを修正する。
    インターフェースの設定値は前項で算出した値を使う。
    また、無線ルータからのIPv4通信はIPv4 over IPv6を使うようにルーティングを設定する。
vi /etc/config/network
...
config interface 'wanmap'
        option proto 'map'
        option type 'map-e'
        option peeraddr '2222:aaa:bbb:1::1:ccc'
        option ipaddr '111.222.0.0'
        option ip4prefixlen '15'
        option ip6prefix '2222:aaaa::'
        option ip6prefixlen '31'
        option ealen '25'
        option psidlen '8'
        option offset '4'
        option encaplimit 'ignore'
        option metric '10'
        list tunlink 'wan6'

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. [LuCI] ファイアウォールのゾーンWANに、WANMAPインターフェースを追加する。
  2. [LuCI] WAMMAPインターフェースをスタートする。
    PPPoEのIPv4アドレスとは別のIPがもらえればOK。
  3. OpenWrtを再起動する。

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

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

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