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

OpenWrtでIPv6インターネット(+IPv4インターネットも)を使えるようにする覚書。
この設定で、WindowsやUbuntu、iOSでIPv6アドレスが自動割当され通信できている。
(2020/12/03追記)
IPv4 over IPv6設定を追加。なお、公開サーバはPPPoEのIPv4で通信するように構築。
(2020/12/23追記)
ポートを240個使えるようにする設定を追加。
■ 前提
フレッツ光回線(コラボ回線:我が家はビッグローブ光)でIPv6オプションがついてる。
デュアルスタック構成にする。
公開サーバのIPv4通信はPPPoEとし、無線ルータからのIPv4通信はIPv4 over IPv6(MAP-E)で通信する構成する。
OpenWrtは19.07を使用。インターフェースはLAN、WAN、WAN6があるものとする。
WANはPPPoEでIPv4接続できている状態とする。
ネットワーク構成は下記の通り。
端末 | LANのIP |
---|---|
OpenWrt | 192.168.1.1 |
公開サーバ | 192.168.1.2 |
無線ルータ | 192.168.1.3 |
■ WAN6を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でログインして設定する。
- [LuCI] mapパッケージ、iptables-mod-ipoptパッケージをインストールする。
- OpenWrtを再起動する。
- [LuCI] WAN6のCustom delegated IPv6-prefixを設定する。
IPv6アドレスが「2222:aaaa:bbbb:cccc:dddd:eeee:ffff:gggg/64」だったら
「2222:aaaa:bbbb:cccc::/56」を設定する。 - [LuCI] 新しいインターフェースを作成する。
名前:wanmap
プロトコル:MAP / LW4over6
※インターフェースを作成した後、詳細設定画面が出てくるが設定が反映されないので(不具合だと思う)、Dismissを押す。(後程SSHで設定する) - [LuCI] Save & Applyする。
- [SSH] /etc/iproute2/rt_tablesを修正しルートテーブルを追加する。
vi /etc/iproute2/rt_tables
200 map
- [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
- /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 ...
- 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 ...
- [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'
- [LuCI] ファイアウォールのゾーンWANに、WANMAPインターフェースを追加する。
- [LuCI] WAMMAPインターフェースをスタートする。
PPPoEのIPv4アドレスとは別のIPがもらえればOK。 - OpenWrtを再起動する。
下記のような接続確認サイトでIPv4アドレスを確認。
無線ルータ配下の端末は、MAP-Eで取得したIPv4アドレスで通信していることを確認。
公開サーバは、PPPoEのIPv4アドレスで通信していることを確認。
参考
IPv6 test – IPv6/4 connectivity and speed test
v6プラス利用判定
IPv4 over IPv6でつながっていると「〇 v6プラスつかっています」と表示される。