構成図

設定

  • ここでは タイムゾーン, NTP, ファイアウォールなどの設定は省きます

1. ER-4に接続する

  1. CONSOLE にコンソールケーブルを繋ぐ
  2. PuTTY などからシリアル接続、以下設定
    • Serial line
      • COM3 (COM番号はデバイスマネージャー -> ポート(COMとLPT)から確認)
    • Speed
      • 115200
    • Connection type
      • Serial
  3. 接続出来たら初期パスワードでログイン
    • id
      • ubnt
    • password
      • ubnt

2. WAN から割り当てられているIPv6アドレスを取得する

IPv6 を自動で割り当てられるように設定する

configure
set interfaces ethernet eth0 ipv6 address autoconf
commit
exit

10分程度待つと IPv6 アドレスが降ってくるので、このアドレスをメモしておく

show interfaces
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface    IP Address                        S/L  Description
---------    ----------                        ---  -----------
eth0         192.168.1.1/24                    u/u
             XXXX:XXXX:XXXX:XXXX:YYYY:YYYY:YYYY:YYYY/64
eth1         -                                 u/D
eth2         -                                 u/D
eth3         -                                 u/D
...

next hop に設定する対向ルータのリンクローカルアドレスもメモしておく (fe80:: から始まるアドレス)

show ipv6 neighbors | grep eth0
fe80::21f:6cff:YYYY:YYYY dev eth0 lladdr 00:1f:6c:27:12:c5 router REACHABLE

3. DS-Lite の設定

IPv6 が割り当てられた状態では静的割当でエラーになったりするので消しておく

sudo ip addr flush dev eth0

IPIP トンネルの設定

configure
delete interfaces ethernet eth0 ipv6
# 割り当てられた IPv6 アドレス
set interfaces ethernet eth0 address XXXX:XXXX:XXXX:XXXX:YYYY:YYYY:YYYY:YYYY/64
set interfaces ipv6-tunnel v6tun0 encapsulation ipip6
# 割り当てられた IPv6 アドレス (/64 なし)
set interfaces ipv6-tunnel v6tun0 local-ip XXXX:XXXX:XXXX:XXXX:YYYY:YYYY:YYYY:YYYY
# transix の AFTR
set interfaces ipv6-tunnel v6tun0 remote-ip 2404:8e00::feed:102
set interfaces ipv6-tunnel v6tun0 mtu 1500
set interfaces ipv6-tunnel v6tun0 multicast disable
set protocols static interface-route 0.0.0.0/0 next-hop-interface v6tun0
# 対向ルータのリンクローカルアドレス
set protocols static route6 ::/0 next-hop fe80::21f:6cff:YYYY:YYYY interface eth0
set interfaces ipv6-tunnel v6tun0 ttl 64
commit; save
exit

ここまでで IPv4 での ping が通るようになる

ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=60 time=5.05 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=60 time=3.43 ms
...

4. DHCP, DNS の設定

configure
set system name-server 2001:4860:4860::8888
set system name-server 2001:4860:4860::8844
set system name-server 8.8.8.8
set system name-server 8.8.4.4

set service dhcp-server disabled false
set service dhcp-server hostfile-update disable
set service dhcp-server shared-network-name LAN1 authoritative enable
set service dhcp-server shared-network-name LAN1 subnet 192.168.1.0/24
set service dhcp-server shared-network-name LAN1 subnet 192.168.1.0/24 default-router 192.168.1.1
set service dhcp-server shared-network-name LAN1 subnet 192.168.1.0/24 dns-server 8.8.8.8
set service dhcp-server shared-network-name LAN1 subnet 192.168.1.0/24 dns-server 8.8.4.4

delete interfaces ethernet eth0 address
set interfaces ethernet eth0 address dhcp

commit; save
exit

5. ND Proxy (ndppd) の設定

以下を参考に行いました。本当に情報が少なく、正直この記事がなければ出来なかったので感謝します。

ndppd を MIPS64 向けにビルドする

# amd64 な環境を用意する
docker run -it amd64/ubuntu bash

# make に必要なものを揃える
apt -y install g++-mips64-linux-gnuabi64 vim git make

# ndppd を落としてビルド
git clone -b master https://github.com/DanielAdolfsson/ndppd.git
cd ndppd
cp Makefile Makefile-edge
vim Makefile-edge
# Makefile を以下のように設定する
"""
PREFIX = /config/ndppd/local
CXX = /usr/bin/mips64-linux-gnuabi64-g++
LDFLAGS = -static
"""

# make
make -f Makefile-edge

ホストに戻って出来上がった ndppd を取ってくる

docker ps
CONTAINER ID   IMAGE          COMMAND   CREATED      STATUS              PORTS     NAMES
e1667963bed6   amd64/ubuntu   "bash"    4 days ago   Up About a minute             happy_morse

docker cp happy_morse:/ndppd/ndppd .

file を見て以下のようになっていればok

file ndppd
ndppd: ELF 64-bit MSB executable, MIPS, MIPS64 rel2 version 1 (GNU/Linux), statically linked, BuildID[sha1]=593de2ff76b5d02db60642f450af9cac728389c5, for GNU/Linux 3.2.0, not stripped

ER-4 へ ndppd を転送する

sftp ubnt@192.168.1.1
> put ndppd /

ndppd の設定

ndppd を配置し実行権限を与える

mv /ndppd /config/ndppd/local/sbin/ndppd
chmod +x /config/ndppd/local/sbin/ndppd

ndppd.conf
rule には割り当てられた IPv6 のインターフェースID部を0にしたものを設定する

cat << 'EOF' > /config/ndppd/ndppd.conf
proxy eth0 {
    router no
    timeout 500
    autowire yes
    keepalive yes
    retries 3
    ttl 30000
    rule XXXX:XXXX:XXXX:XXXX::/64 {
        iface eth1
    }
}

proxy eth1 {
    router yes
    timeout 500
    autowire yes
    keepalive yes
    retries 3
    ttl 30000
    rule XXXX:XXXX:XXXX:XXXX::/64 {
        auto
    }
}
EOF

ER-4 起動時に ndppd が実行されるように post-config.d に起動用スクリプトを作成する

cat << 'EOF' > /config/scripts/post-config.d/ndppd.sh
#!/bin/vbash
# copy to this file into
# /config/scripts/post-config.d/
/config/ndppd/ndppd.initscript start
EOF

cat << 'EOF' > /config/ndppd/ndppd.initscript
#!/bin/sh

# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing.
if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then
set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script
fi

DESC="NDP Proxy Daemon"
PIDFILE=/run/ndppd.pid
CONFIGFILE=/config/ndppd/ndppd.conf
DAEMON=/config/ndppd/local/sbin/ndppd
DAEMON_ARGS="-d -c $CONFIGFILE -p $PIDFILE"
EOF

chmod +x /config/scripts/post-config.d/ndppd.sh
chmod +x /config/ndppd/ndppd.initscript

ndppd を起動

/config/scripts/post-config.d/ndppd.sh

# 起動確認
ps ax | grep ndppd
 3130 ?        Ss     0:20 /config/ndppd/local/sbin/ndppd -d -c /config/ndppd/ndppd.conf -p /run/ndppd.pid
 6690 pts/0    S+     0:00 grep ndppd

6. IPv6 RA の設定

configure
set interfaces ethernet eth1 ipv6 address autoconf
set interfaces ethernet eth1 ipv6 address eui64 XXXX:XXXX:XXXX:XXXX::/64
set interfaces ethernet eth1 ipv6 dup-addr-detect-transmits 1
set interfaces ethernet eth1 ipv6 router-advert cur-hop-limit 64
set interfaces ethernet eth1 ipv6 router-advert link-mtu 1500
set interfaces ethernet eth1 ipv6 router-advert managed-flag false
set interfaces ethernet eth1 ipv6 router-advert max-interval 600
set interfaces ethernet eth1 ipv6 router-advert other-config-flag true
set interfaces ethernet eth1 ipv6 router-advert prefix ::/64
set interfaces ethernet eth1 ipv6 router-advert prefix ::/64 autonomous-flag true
set interfaces ethernet eth1 ipv6 router-advert prefix ::/64 on-link-flag true
set interfaces ethernet eth1 ipv6 router-advert prefix ::/64 valid-lifetime 2592000
set interfaces ethernet eth1 ipv6 router-advert reachable-time 0
set interfaces ethernet eth1 ipv6 router-advert retrans-timer 0
set interfaces ethernet eth1 ipv6 router-advert send-advert true
commit; save

7. 確認

ここまでの設定で eth1 に接続された端末で IPv6 が使えるようになっているはずなので、ipv6-test.com などで確認。

参考