EdgeRouter XのIPv6対応(ひかり電話なし)

EdgeRourer Xを買ってから、ずっとやろうと思ってやっていませんでしたが、ようやくIPv6を使用するための設定をしました。

(設定してから記事にするまでにも間があいてしまいました)

備忘録としてやったことをまとめます。
本記事には試行錯誤の過程をすべて記載しております。
記載されている設定は、IPv6を使えるようにする最小限の設定ではない点にご注意ください。

(2021/01/03 追記) saveコマンドが抜けていたため追記。

IPv6のファイアウォール設定

参考ページ: EdgeRouterでIPoE(IPv6)インターネットを接続を行う(ひかり電話あり) – nosense

EdgeRouterにログインし、下記のコマンドを実行する。

configure
set firewall ipv6-name WANv6_IN default-action drop
set firewall ipv6-name WANv6_IN description 'WAN inbound traffic forwarded to LAN'
set firewall ipv6-name WANv6_IN enable-default-log
set firewall ipv6-name WANv6_IN rule 10 action accept
set firewall ipv6-name WANv6_IN rule 10 description 'Allow established/related sessions'
set firewall ipv6-name WANv6_IN rule 10 state established enable
set firewall ipv6-name WANv6_IN rule 10 state related enable
set firewall ipv6-name WANv6_IN rule 20 action drop
set firewall ipv6-name WANv6_IN rule 20 description 'Drop invalid state'
set firewall ipv6-name WANv6_IN rule 20 state invalid enable
set firewall ipv6-name WANv6_LOCAL default-action drop
set firewall ipv6-name WANv6_LOCAL description 'WAN inbound traffic to the router'
set firewall ipv6-name WANv6_LOCAL enable-default-log
set firewall ipv6-name WANv6_LOCAL rule 10 action accept
set firewall ipv6-name WANv6_LOCAL rule 10 description 'Allow established/related sessions'
set firewall ipv6-name WANv6_LOCAL rule 10 state established enable
set firewall ipv6-name WANv6_LOCAL rule 10 state related enable
set firewall ipv6-name WANv6_LOCAL rule 20 action drop
set firewall ipv6-name WANv6_LOCAL rule 20 description 'Drop invalid state'
set firewall ipv6-name WANv6_LOCAL rule 20 state invalid enable
set firewall ipv6-name WANv6_LOCAL rule 30 action accept
set firewall ipv6-name WANv6_LOCAL rule 30 description 'Allow IPv6 icmp'
set firewall ipv6-name WANv6_LOCAL rule 30 protocol ipv6-icmp
set firewall ipv6-name WANv6_LOCAL rule 40 action accept
set firewall ipv6-name WANv6_LOCAL rule 40 description 'allow dhcpv6'
set firewall ipv6-name WANv6_LOCAL rule 40 destination port 546
set firewall ipv6-name WANv6_LOCAL rule 40 protocol udp
commit
save  # 2021/01/03 追記
exit

pppdの置き換え

IPv6 PPPoEが正しく動くようにする。
参考ページ: EdgeRouterでIPv6 PPPoEが正しく接続できない問題を解決する - もやし日誌

/sbin/pppdをパッチをあてたものに置き換える。

ファームウェアを更新すると置き換えたファイルは消えてしまうため、上記手順を再度実行する。

EdgeRouterにIPv6アドレスを自動で割り当てるための設定

参考ページ: EdgeRouter設定メモ: IPv6/IPoE + DS-Liteでインターネット高速化 - stop-the-world

EdgeRouterにログインし、下記のコマンドを実行する。

configure
set interfaces ethernet eth0 ipv6 address autoconf
commit
save  # 2021/01/03 追記
exit

ndppdの配置

ひかり電話がない環境でもLAN内にIPv6アドレスを割り当てるために、ndppdを配置する。

ndppdのクロスコンパイル

参考ページ: EdgeRouter X (ER-X) で ndppd を動かす - Qiita

EdgeRouterで動作するように、Dockerを用いてクロスコンパイルする。

git clone https://github.com/DanielAdolfsson/ndppd.git
docker run -v $PWD/ndppd:/ndppd -it --rm ubuntu  # 本コマンドでコンテナ内に入るので、以降のコマンドはコンテナ内で実行する
apt-get update -y
apt-get install -y g++-mipsel-linux-gnu make vim  # vimはMakefileを修正するためにインストールした
cd /ndppd/
vim Makefile  # 修正内容は下記"Makefileの修正内容"を参照
make

Makefileの修正内容

$ git diff Makefile
diff --git a/Makefile b/Makefile
index 00ca22b..f044009 100644
--- a/Makefile
+++ b/Makefile
@@ -1,11 +1,11 @@
 ifdef DEBUG
 CXXFLAGS ?= -g -DDEBUG
 else
-CXXFLAGS ?= -O3
+CXXFLAGS ?= -O3 -static
 endif

-PREFIX  ?= /usr/local
-CXX     ?= g++
+PREFIX  ?= /ndppd/local
+CXX     ?= /usr/bin/mipsel-linux-gnu-g++
 GZIP    ?= /bin/gzip
 MANDIR  ?= ${DESTDIR}${PREFIX}/share/man
 SBINDIR ?= ${DESTDIR}${PREFIX}/sbin
@@ -37,13 +37,13 @@ ndppd.conf.5.gz:
        ${GZIP} < ndppd.conf.5 > ndppd.conf.5.gz

 ndppd: ${OBJS}
-       ${CXX} -o ndppd ${LDFLAGS} ${OBJS} ${LIBS}
+       /usr/bin/mipsel-linux-gnu-g++ -o ndppd -static ${LDFLAGS} ${OBJS} ${LIBS}

 nd-proxy: nd-proxy.c
-       ${CXX} -o nd-proxy -Wall -Werror ${LDFLAGS} `${PKG_CONFIG} --cflags glib-2.0` nd-proxy.c `${PKG_CONFIG} --libs glib-2.0`
+        /usr/bin/mipsel-linux-gnu-g++ -o nd-proxy -Wall -Werror ${LDFLAGS} `${PKG_CONFIG} --cflags glib-2.0` nd-proxy.c `${PKG_CONFIG} --libs glib-2.0`

 .cc.o:
-       ${CXX} -c ${CPPFLAGS} $(CXXFLAGS) -o $@ $<
+       /usr/bin/mipsel-linux-gnu-g++ -c ${CPPFLAGS} $(CXXFLAGS) -o $@ $<

 clean:
        rm -f ndppd ndppd.conf.5.gz ndppd.1.gz ${OBJS} nd-proxy

EdgeRouterに設置

コンパイルしたndppdをEdgeRouterに転送し、配置する。

ndppdの設定

ndppdの設定ファイルを設置する。
ndppdの起動スクリプトで設定ファイルを指定しない場合のファイルパスは、/etc/ndppd.conf

sudo su -
vi /config/user-data/ndppd/ndppd.conf  # 下記の内容を記述

ndppd.conf

proxy eth0 {
   router no
   timeout 500
   autowire yes
   keepalive yes
   retries 3
   ttl 30000
   rule ::/0 {
      iface switch0
   }
}

proxy switch0 {
   router yes
   timeout 500
   autowire yes
   keepalive yes
   retries 3
   ttl 30000
   rule ::/0 {
      auto
   }
}

自動起動設定

ndppdが自動で起動するように、2つのスクリプトを設置する。
参考ページ: Set up IPv6 without Prefix Delegation | Ubiquiti Community

LAN内の機器にIPv6アドレスを割り当てるための設定

参考ページ: EdgeRouter X (ER-X) で IPv6 IPoE + DS-Lite するまで - Qiita