OpenIndiana(多分Solaris11でも)でDSLiteを動かす。

# OpenIndiana(多分Solaris11でも)でDSLiteを動かす。
## 1.こんな変な設定をする動機
自宅の回線はIPv4もIPv6もPPPoE接続で使っているんだけど、近頃夜中の回線速度の劣化がひどい。（IPv6も）加えて、OpenIndianaのパッケージミラー(http://pkg.illumos.jp/openindiana.org/en/index.shtml) を立てているんだけどMasterとのSyncが遅いと処理が止まってしまう。（一定の転送速度以下になると処理が終了する残念な仕様）

ということで、PPPoEからの卒業を画策し、IPoEのプロバイダー探しに出かけたんだけど、あんまり良さげなのがない。
（単品で１０００円以下ぐらいで追加できればよかったんだけどね。）

結局IIJmio FiberAccess/NF 月額２０００円 （さらにその後IIJ mio光+IPoE オプションに加入）に落ち着きました。
携帯をIIJ mioを利用しているので割り引かれるしね。
IIJのIPoEはMFのTransixサービスの卸なのでIPv4はDSLiteでの提供になります。

次にDSLiteの終端をどこでやるかを考えたのですが。今の自宅のルータはCisco８４１MというCEF有効にするとIPv6での通信がパケロスする欠陥機。
また、VRFがIPv6に対応してないので、既存のIPv6回線を生かしたまま終端するのは難しそうでした。

よくよく考えると、DSLite自体はすごく単純なプロトコルで、IPv4-in-IPv6が使えれば繋がります。
で、もう直接サーバで終端しちゃえばよく無い？という結論に至り、OpenIndianaでDSLiteの終端をすることにしました。

## 2. IPv6接続の設定
IPv6 Autoconfigの設定は単純で、IFがtransix0の場合は

```bash
$ pfexec ipadm create-if transix0
$ pfexec ipadm create-addr -T addrconf -p stateless=yes,stateful=no transix0/v6addr
```

アドレスとルーティングの確認は

```bash
$ pfexec ipadm show-addr
ADDROBJ           TYPE     STATE        ADDR
lo0/v4            static   ok           127.0.0.1/8
lo0/v6            static   ok           ::1/128
transix0/v6addr   addrconf ok      fe80::8:20ff::df8b/10
transix0/v6addr   addrconf ok      2409:10:20:400:8::fe3e:df8b/64

$ netstat -rn

Routing Table: IPv4
  Destination           Gateway           Flags  Ref     Use     Interface
-------------------- -------------------- ----- ----- ---------- ---------
127.0.0.1            127.0.0.1            UH        2         56 lo0

Routing Table: IPv6
  Destination/Mask            Gateway                   Flags Ref   Use    If
--------------------------- --------------------------- ----- --- ------- -----
::1                         ::1                         UH      2       0 lo0
2409:10:20:400::/64         2409:10:20:400:8::fe3e:df8b U       2       0 transix0
fe80::/10                   fe80::8:20ff::df8b      U       4       2 transix0
default                     fe80::212:e2ff::40f4    UG      2       0 transix0
```

ここで、トンネルのソースIPになるアドレスをstaticで設定します。
プレフィックスは/64なので適当なアドレスをつけてしましょう。

```bash
$ pfexec ipadm create-addr -T static -a 2409:10:20:400::100/64 transix0/v6static
$ pfexec ipadm show-addr
ADDROBJ           TYPE     STATE        ADDR
transix0/v6static static ok  2409:10:20:400::100/64
```
Autoconfigで割り当てられたIPでも通信できるのですが、reboot時にiptunインターフェースが立ち上がらない現象にあたりました。

## 3. DSLiteの設定
残念ながらSolarisはAFTRの接続はドメイン名での接続をサポートしておらず、IPアドレス指定で指定する必要があります。
AFTRのIPv6アドレスは[公式のNVR500の設定](http://www.mfeed.ad.jp/transix/ds-lite/contents/yamaha_nvr500.html)に載ってました。

ipv4 over ipv6 interface設定例

```bash
// pfexec dladm create-iptun -T ipv6 -a local=<Solaris側のIPv6アドレス>,remote=<AFTRのIPv6アドレス> <作成するインターフェース名>
$ pfexec dladm create-iptun -T ipv6 -a local=2409:10:20:400::100,remote=2404:8e00::feed:101 dslite0 
$ pfexec dladm show-iptun
LINK            TYPE  FLAGS  LOCAL               REMOTE
dslite0         ipv6  --     2409:10:20:400::100 2404:8e00::feed:101
```

IFができたので、IPv4アドレスを振ります。

```bash
$ pfexec ipadm create-if dslite0
$ pfexec ipadm create-addr -T static -a local=192.168.0.2,remote=192.168.0.1 dslite0/v4
root@oi-userland:~# ipadm show-addr dslite0/v4
ADDROBJ           TYPE     STATE        ADDR
dslite0/v4        static   ok           192.168.0.2->192.168.0.1
```

最後にルーティングを書けば完成です。

```bash
$ pfexec route -p add default 192.168.0.1
add net default: gateway 192.168.0.1
add persistent net default: gateway 192.168.0.1
$ ping 8.8.8.8
8.8.8.8 is alive
$ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 40 byte packets
 1  * * *
 2  14.0.9.65 (14.0.9.65)  3.865 ms  3.485 ms  3.411 ms
 3  14.0.8.66 (14.0.8.66)  3.743 ms  3.890 ms 14.0.8.78 (14.0.8.78)  4.035 ms
 4  210.173.176.243 (210.173.176.243)  4.539 ms  4.236 ms  3.977 ms
 5  108.170.242.193 (108.170.242.193)  4.448 ms  4.926 ms  4.401 ms
 6  216.239.43.23 (216.239.43.23)  5.226 ms 209.85.251.219 (209.85.251.219)  4.849 ms 108.170.236.171 (108.170.236.171)  4.644 ms
 7  8.8.8.8 (8.8.8.8)  4.410 ms  4.610 ms  4.424 ms
```

##