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-gnu
と make
をいれる。前者一つ入れれば、ビルドに必要なものはすべて揃う。不要なものも入ってきそうだけど、ひとまずビルドさえできればいいので..
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 を強引に書き換えた。こんな感じ:
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 に持っていく。
-
ひかり電話を契約していると
/64
よりも小さい Prefix でくるらしく、これ分割して/64
などにして、EdgeRouter からの RA で LAN 内に引き込めるらしい? (未確認) ↩