IPv4 over IPv6設定その1


# 概要

DS-Lite対応ルーター無しに、[インターリンンク](https://www.interlink.or.jp/)の[ZOOT NATIVE](https://www.interlink.or.jp/service/zootnative/)によるIPv4 over IPv6接続を使用する手順について説明します。

# インターリンク ZOOT NATIVE

[インターリンンク](https://www.interlink.or.jp/)の[ZOOT NATIVEサービス](https://www.interlink.or.jp/service/zootnative/)紹介抜粋

> 「ZOOT NATIVE」はNTT東日本・西日本の「フレッツ光」対応のサービスです。
> 次世代のネットワーク（IPv6 IPoE接続）の「DS-Lite（Dual-Stack Lite）」方式を採用。
> 「DS-Lite」はIPv6のネットワークを経由してIPv4通信を行う（IPv4 over IPv6）規格です。
> IPv4、IPv6の両方で「高速で安定的な通信」ができる新しいインターネット接続サービスです。

# 前提

以下が契約済であること。

- フレッツ・V6オプション
- ZOOT NATIVE

# IPv6アドレスの割り当て

Linux KernelでIPv6が有効になっていれば、特に設定することなくIPv6アドレスが割り当てられます。
以下はRealtekのイーサネットを使った場合の例です。
ネットワークデバイス名はeth0とします。

```
# /sbin/modprobe r8169
# ip link set eth0 up
```

しばらく待つと以下のようにIPv6アドレスが割り当てられます。
この方法ではMACアドレスを元にIPv6アドレスが構成されます。

```
# /sbin/ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet6 xxxx:xxx:xx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global dynamic mngtmpaddr
       valid_lft 14342sec preferred_lft 12542sec
    inet6 xxxx::xxxx:xxxx:xxxx:xxxx/64 scope link
       valid_lft forever preferred_lft forever
```

GoogleのIPv6のDNSサーバにpingが通ります。

```
# ping6 -nc1 2001:4860:4860::8888
PING 2001:4860:4860::8888 (2001:4860:4860::8888): 56 data bytes
64 bytes from 2001:4860:4860::8888: icmp_seq=0 ttl=115 time=21.004 ms
--- 2001:4860:4860::8888 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 21.004/21.004/21.004/0.000 ms
```

# DS-Lite IPv4 over IPv6接続

DS-LiteのIPv4 over IPv6接続サービスは、LinuxではIPv6トンネリングを設定することで使用することができます。
設定に必要な情報は、自身のIPv6アドレスと、IPトンネルの対向側のIPv6アドレスです。
ZOOT NATIVEの対向側のアドレスは「gw.transix.jp」になります。

> 参考:[SEIL/x86の設定マニュアル](https://faq.interlink.or.jp/faq2/View/wcDisplayContent.aspx?id=233)
> 
> ```
> interface tunnel0 tunnel dslite gw.transix.jp
> ```

但し、IPトンネリングの設定ではDNS名ではなくIPv6アドレスが必要になります。

正しくはDNSでIPv6アドレスを取得するべきですが、ここではひとまず、現時点のgw.transix.jpのIPv6アドレスの1つである、`2404:8e01::feed:100`を使用します。

ローカルのIPv6アドレスがxxxx:xxx:xx:xxxx:xxxx:xxxx:xxxx:xxxxの場合、以下のように設定します。

```
# ip tunnel add dslite mode ipip6 remote 2404:8e01::feed:100 localxxxx:xxx:xx:xxxx:xxxx:xxxx:xxxx:xxxx encaplimit none dev eth0
# ip link set dslite up
```

- dslite: IPトンネルデバイスのデバイス名です。名前は任意に指定できます。
- mode ipip6: IPv4 over IPv6用のトンネリング設定を表します。

:::note warn
2022/4/12追記
今までIPv4とIPv6の性能比較をしていなかったのですが、Encapsulation limitオプション（encaplimit）がとても重要なことがわかりました。
Linuxではデフォルトは4になっていますが、デフォルトのままだと、IPv4はIPv6の半分にも満たない性能になります。
制限なしの「none」にすることで、ほぼ性能劣化は発生しなくなりました。
:::

なお、リンクアップさせていますが、以下のようにトンネルデバイスのstateはUPにならずUNKOWNとなります。問題はありません。

```
4: dslite@eth0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1452 qdisc noqueue state UNKNOWN group default qlen 1000
    link/tunnel6 xxxx:xxx:xx:xxxx:xxxx:xxxx:xxxx:xxxx peer 2404:8e01::feed:100 permaddr xxxx:xxxx:xxxx::
    inet6 xxxx::xxxx:xxxx:xxxx:xxxx/64 scope link
       valid_lft forever preferred_lft forever
```


このdsliteをデフォルトルートに設定します。

```
ip route replace default dev dslite
```

GoogleのIPv4のDNSサーバにpingが通ります。

```
# ping -nc1 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=119 time=18.481 ms
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 18.481/18.481/18.481/0.000 ms
```

以上の通り、DL-Lite対応ルーターを使用せずに、IPv4 over IPv6の接続ができました。

課題は以下です。

- MACアドレスベースでIPv6アドレスを設定していること。
- gw.transix.jpのIPv6アドレスは変更される可能性があること。

特にgw.transix.jpのIPv6アドレスが変更されると通信ができなくなるため、変更に応じてIPトンネリング設定を再設定する必要があります。これらをDHCPv6を使用して解決します。

『[IPv4 over IPv6接続その2](https://qiita.com/bamboo23/items/8f9f80ef2fc19439c036)』で説明します。