LoginSignup
12
13

More than 3 years have passed since last update.

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

Posted at

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

12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13