Posted at

EdgeRouter X (ER-X) で ndppd を動かす

EdgeRouter X (ER-X) で、ndppd で NDP Proxy (Buffalo や NEC のルーターで ND プロキシと呼ばれているやつ) を実現させる。これにより、ひかり電話がなく /64 な IPv6 が割り当てられる環境 1 で、IPv6 を LAN 内に割り当てる。

手元の PC で ndppd を clone してくる。

git clone https://github.com/DanielAdolfsson/ndppd.git

ここから、ndppd を ER-X で動かすために、ndppd のバイナリを用意する。ER-X はリトルエンディアンな MIPS を搭載しているので、Mac や Windows の X86_64 な環境でコンパイルして、EdgeRouter へコピーしても動かない。

ER-X でソースを clone して コンパイルまでできたら楽だが、ER-X はメモリもストレージも貧弱なので g++ のビルド環境を導入できなさそう。

今回は Mac の Docker 上の Ubuntu へ mips コンパイラを入れて、そこでスタティックリンクでビルドしたものを ER-X にコピーすることにした。

docker run -v $PWD/ndppd:/ndppd -it --rm ubuntu

# clone してきた ndppd を docker コンテナにマウントして起動

ubuntu に入ったら apt を更新して、 g++-mipsel-linux-gnumake をいれる。前者一つ入れれば、ビルドに必要なものはすべて揃う。不要なものも入ってきそうだけど、ひとまずビルドさえできればいいので..

apt-get update -y

apt-get install -y g++-mipsel-linux-gnu make

ndppd に同梱の Makefile を編集して g++ のかわりに/usr/bin/mipsel-linux-gnu-g++ をつかってコンパイルするように。 CXX を書き換えてもうまく行かなかったので、直接書き換えた。

ひとまず mipsel でコンパイルできれば良いと思って、Makefile を強引に書き換えた。こんな感じ:


Makefile

diff --git a/Makefile b/Makefile

index 00ca22b..fe5bd52 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
@@ -13,7 +13,7 @@ PKG_CONFIG ?= pkg-config

OBJS = src/logger.o src/ndppd.o src/iface.o src/proxy.o src/address.o \

ifdef WITH_ND_NETLINK
LIBS = `${PKG_CONFIG} --libs glib-2.0 libnl-3.0 libnl-route-3.0` -pthread
@@ -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


Docker の ubuntu には vim などが入っていないから、Mac で書き換えてもいい。終わったら make

make

<中略>

file ndppd && % du -h ndppd
ndppd: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=8
76400b1bee62008acfb23259d1079577a8f8cec, not stripped

3.1M ndppd

できた。スタティックリンクしたのでなかなか大きい。

あとはこれを scp を使って EdgeRouter に持っていく。





  1. ひかり電話を契約していると /64 よりも小さい Prefix でくるらしく、これ分割して /64 などにして、EdgeRouter からの RA で LAN 内に引き込めるらしい? (未確認)