ESPRESSObinでDS-Lite

armボード[ESPRESSObin](http://espressobin.net/)で、DS-Liteを使うルータを作成した記録。

![2018-01-03 20.43.41.jpg](https://qiita-image-store.s3.amazonaws.com/0/94627/0264939b-6646-0da4-0cfe-d9e9da8fa71e.jpeg)


## まずポチる
自分の場合は、米amazonで[ポチりました](https://www.amazon.com/gp/product/B06Y3V2FBK/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)。ついでに、[12V電源](https://www.amazon.com/gp/product/B013CWOCHE/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)と[32GBマイクロSDカード](https://www.amazon.com/gp/product/B0148S2WUU/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)も一緒に。USB給電もできますが、SATAデバイスを使う場合は、12V電源を使わないと、SATAの電源が12Vなのでこれが給電できないのではないかと思います。

## OSインストール
OSには、Ubuntu16.04LTSを使用。[ここ](http://wiki.espressobin.net/tiki-index.php?page=Creating+Ubuntu+filesystem#Ubuntu_16.04.3_LTS)を参考に、マイクロUSBへイメージをコピーします。

## シリアルコンソール
起動の様子は、Linuxからだと、Kermitを使ってシリアルコンソールにつなげてみることができます。

```
(別OSから) $ sudo apt install ckermit
(別OSから) $ sudo kermit
C-Kermit 9.0.302 OPEN SOURCE:, 20 Aug 2011, for Linux+SSL+KRB5 (64-bit)
 Copyright (C) 1985, 2011,
  Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
(/root/) C-Kermit>
(/root/) C-Kermit>set line /dev/ttyUSB0
(/root/) C-Kermit>set speed 115200
/dev/ttyUSB0, 115200 bps
(/root/) C-Kermit>set carrier-watch off
(/root/) C-Kermit>set flow-control none
(/root/) C-Kermit>set handshake none
(/root/) C-Kermit>set prefixing all
(/root/) C-Kermit>set streaming off
(/root/) C-Kermit>set parity none
(/root/) C-Kermit>connect
Connecting to /dev/ttyUSB0, speed 115200
 Escape character: Ctrl-\ (ASCII 28, FS): enabled
Type the escape character followed by C to get back,
or followed by ? to see other options.
----------------------------------------------------
(ここでESOPRESSObinの電源ON)
```

## 不安定
自分の場合は、マイクロSDカードから起動後、すぐカーネルクラッシュして全然安定しませんでした。なので、試しにUSBメモリから起動したところ、嘘のように安定しました。

SDカードへOSをインストールしたときと動揺の手順でUSBメモリへOSをインストールし、[こちら](
http://wiki.espressobin.net/tiki-index.php?page=Boot+from+removable+storage+-+Ubuntu#USB_device_2)の手順に従い、USBから起動します。

USB起動をデフォルトで行うようにするには、`run bootusb`の前に、`save`を打てば良いです。

## カーネルビルド
その後、メインラインのkernel-4.14からSDカードもサポートされるようになったので、今ではメインラインのカーネルをビルドして、SDカードから起動して使用しています。

## DS-Lite
### ネットワークデバイス設定
ネットワークに接続するには、まずデバイスの設定が必要です。ESPRESSObinのネットワークデバイスは、通常のEthernetデバイスではなく、スイッチデバイスが使われているためちょっと特殊です。

eth0上にwanというデバイスを構築します。また、内部ネットワーク用に、lan0を作ってブリッジを設定します。`/etc/network/interface`は次のとおりです。

```
auto eth0
iface eth0 inet static
      address 0.0.0.0
      mtu 3000

auto wan
iface wan inet static
      address 192.168.0.2
      netmask 255.255.255.0
      gateway 192.168.0.1

auto lan0
iface lan0 inet static
      address 0.0.0.0

#auto lan1
#iface lan1 inet static
#      address 0.0.0.0

auto br0
iface br0 inet static
      address 192.168.10.1
      network 192.168.10.0
      netmask 255.255.255.0
      broadcast 192.168.10.255
      dns-domain hoge.fuga.com
      bridge_ports lan0 lan1
```

これは、DHCPでなくスタティックアドレスの設定例です。なお、Mac addressは、同じものが割り振られるようです。私は、lan1を有効にしたらマックアドレスが被っているせいか、おかしな動きをしたので有効にしていません。

## IPv6の取得

ipv6のアドレスの取得には、dibbler-clientというものを使用しました。

```
$ sudo apt install dibbler-client
```

設定(`/etc/dibbler/client.conf`)は、以下の通りです。

```
log-mode short
log-level 7
 
iface wan {
# ask for address
    ia
    pd
}
```

確か、サービスを有効にしてIPアドレスを取得したのだと思います。

```
$ sudo service dibbler-client start
```

これで、IPv6がwan側に設定されるので、メモします。確か、ifconfigで見たと思います。

```
$ ifconfig wan
wan       Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx  
          inet6 addr: yyyy::yyyy:yyyy:yyyy:yyyy/64 Scope:Link
          inet6 addr: xxxx:xxxx:xxxx:x:xxxx:xxxx:xxxx:xxxx/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12662357 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6227358 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:13480241728 (13.4 GB)  TX bytes:1420375188 (1.4 GB)
```
この中のinet6...Scope:Globalのほうが、外部ネットワークに接続されているipv6のアドレスです。

defaut gwは、`traceroute6`で調べました。

```
 traceroute6 www.google.co.jp
traceroute to www.google.co.jp (2404:6800:400a:806::2003), 30 hops max, 80 byte packets
 1  zzzz:zz:zzzz:z:zzz:zzzz:zzzz:zzzz (zzzz:zz:zzzz:z:zzz:zzzz:zzzz:zzzz)  0.612 ms  0.699 ms  0.849 ms
 2  * * *
 3  * * *
 4  * * *
  :
```

このipv6のアドレスは半固定らしく、変わることもあるようですが、これを固定アドレスで先程のinterfaceに設定してしまいました。これは自己責任でお願いします。何かいい方法があったら教えてください。


```
auto wan
iface wan inet6 static
      address xxxx:xxxx:xxxx:x:xxxx:xxxx:xxxx:xxxx
      netmask 64
      gateway zzzz:zz:zzzz:z:zzz:zzzz:zzzz:zzzz
```

IPv4→IPv6の変換の部分は、`/etc/network/if-up.d/000iptunnel`などとして書くのが本当のような気がしますが、うまく行かなかったので、`/etc/rc.local`に書きました。下に出てくるIPx6のxxxのアドレスは、グローバルアドレスと同じになります。

```
REMOTE='2404:8e00::feed:100'
LOCAL='xxxx:xxxx:xxxx:x:xxxx:xxxx:xxxx:xxxx'
#echo $LOCAL

# IPIP6 tunnel linkup
ip -6 tunnel add ip6tnl1 mode ip4ip6 remote $REMOTE local $LOCAL dev wan
ip link set dev ip6tnl1 up

ifconfig ip6tnl1 mtu 3000

# IPv4 routing
route add default dev ip6tnl1
```

これで、設定は完了です。リブートしてもつながることを確認しましょう。

この設定で、私の場合は一番いいときで200Mbpsくらい出ます。