Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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 内に引き込めるらしい? (未確認) 

ikai
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away