ZOOT NATIVE (DS-Lite)でネット接続

目次

インターリンク(Interlink)がZOOT NATIVEという IPv6 IPoE サービスを開始しました。この方式にするとIPv4 の PPPoE よりも速くなる(遅くならない)という話なので試してみました。

ZOOT NATIVE は基本的に IPv6 のサービスですが、今回はトンネルを作成して IPv4 で Internet に接続してみます。

IPv6 で通信するための設定方法は、IPv6 と IPv4 のデュアルスタックで接続にあります。この方法は、ひかり電話契約のないユーザにオススメの方法です。ひかり電話契約がある場合は、DHCPv6-PD で IPv6 のサブネットワークを作成のように素直にネットワークを接続する方法もあります。

環境

  • フレット光ネクスト ファミリー・ハイスピードタイプ(NTT 西日本)
  • ひかり電話オプション契約あり
  • Raspberry Pi B+ Raspbian(Debian jessei)

Raspberry Pi の内蔵 Ethernet(eth0)に LAN を接続し、USB 2.0 接続の 100BASE-TX Ethernet アダプター(eth1)にフレッツ光ネクストのルータ(PPPoE ブリッジ機能を有効)を接続しています。

パソコンの Ubuntu 16.04 でも、ここで紹介した方法で接続できました。

ZOOT NATIVE の申し込み

申し込みは、インターリンクの Web ページから簡単に行えました。ただし事前に次のものを準備しておく必要があります。

  • クレジットカード
  • フレッツ光のお客様 ID とアクセスキー(注 1)

4 月 5 日の朝に申し込んで、翌 4 月 6 日の朝に使用できるようになったというメールが届きました。

設定方法

Raspberry Pi を通信の中継だけでなく一般的な市販ルータが持つ DNS 機能とアドレスの自動割当機能を持たせます。そのため IPv6 上で IPv4 を使う DS-Lite トンネルの作成以外に、DNS や DHCP サーバ用の設定が入っています。

DNS(unbound)をインストール

まず最初に LAN の DNS(キャッシュ)となるunboundをインストールします。ISP の DNSを使用できるならば、このステップは不要です。

$ sudo apt-get install unbound

unboundは、/etc/unbound/unbound.conf.d/にある*.conf を起動時に設定ファイルとして読み込みます。そこでunbound-local.confというファイルを作成して設定を書き込みます。

/etc/unbound/unbound.conf.d/unbound-local.conf

server:
    #interface: 0.0.0.0
    interface: 127.0.0.1
    interface: 10.0.0.254
    access-control: 10.0.0.0/24 allow

IPv6 のアドレスには bind しないで、LAN と自分自身からの問い合わせにのみ答えるようにしました。

ルータのアドレスを固定

ルータの IPv4 アドレスは、LAN 内のデフォルトルートとなるので固定されている必要があります。そこで DHCP クライアントを停止して、LAN に接続している eth0 の IPv4 アドレスを指定します。

まずは DHCP クライアントを停止します(注 2)。

$ sudo systemctl stop dhcpcd.service
$ sudo systemctl disable dhcpcd.service

固定アドレスは、/etc/network/interfacesに設定ます。アドレスと同時にルータ自身が参照する DNS(自分自身)を指定します。

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
 address 10.0.0.254
 netmask 255.255.255.0
 dns-nameservers 127.0.0.1
 dns-search example.jp

これで再起動してもアドレスは変わらず、常に同じ IPv4 アドレスを使うようになります。

トンネルの出口確認

IPv4 で通信できるようにする DS-Lite トンネルの設定には、トンネルの出口に当たるゲートウェイ(AFTR(注 3))の IPv6 アドレスが必要です。

AFTR の IPv6 アドレスは、NVR510 の設定マニュアルに書かれていました。ただしこのアドレスは固定ではなく予告なく変更されることがあるそうなので、接続できなくなった場合は設定を変更する必要があります(注 4)。

私は NTT 西日本を使っているので、AFTR として2404:8e01::feed:100または2404:8e01::feed:101を使用します。

実際に AFTR と通信できるかping6コマンドで確認しておきます。

$ ping6 -c 2 2404:8e01::feed:100
PING 2404:8e01::feed:100(2404:8e01::feed:100) 56 data bytes
64 bytes from 2404:8e01::feed:100: icmp_seq=1 ttl=58 time=5.26 ms
64 bytes from 2404:8e01::feed:100: icmp_seq=2 ttl=58 time=4.97 ms

--- 2404:8e01::feed:100 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 4.978/5.120/5.262/0.142 ms

ufw をインストール

ルータなので不要な通信を制限します。そのため通信を制限するufwをインストールします。ufwを使用しない場合は、IPv4 をインターフェイス間で転送するように/etc/sysctl.confを編集して IPv4 をルーティングするようにします。

$ sudo apt-get install ufw

/etc/ufw/ufw.conf

ENABLED=yes

# allow ssh connection
# これがないとRaspberry PiにLANからsloginできなくなる。
ufw allow 22/tcp

IPv4 をルーティングするように設定します。また必要ならば不要な通信を制限する設定を追加します。

/etc/ufw/sysctl.conf

net/ipv4/ip_forward=1

/etc/default/ufw

DEFAULT_FORWARD_POLICY="ACCEPT"
DEFAULT_INPUT_POLICY="DROP"
DEFAULT_OUTPUT_POLICY="ACCEPT"

転送ルーティングのポリシーを ACCEPT にすることは通常危険ですが、トンネル出口でアドレス変換が行われていて外から入ってくる通信はないので良いことにしました(注 5)。

ufwの自分宛ルーティングポリシーは DROP となっています。そこで/etc/ufw/before.rulesを編集して、LAN から DNS(port 53)への通信を許可する次のルールを最後の COMMIT の前に追加します。

# 以下を追加する。
# Accpet for DNS from LAN
-A ufw-before-input -i eth0 -p udp --dport 53 -j ACCEPT
-A ufw-before-input -i eth0 -p tcp --dport 53 -j ACCEPT

ufwの設定がすんだら、DS-Lite で IPv4 をトンネルするために必要なモジュールを起動時に読み込むように設定ます。

/etc/modules

ip6_tunnel

ここまできたら、一旦再起動して設定を反映させておきます。

DS-Lite トンネルを作成

DS-Lite トンネルは、DS-Lite(RFC6333)対応ルータを Linux (Raspberry Pi) で作るのシェルスクリプトを使って作成します。

/etc/network/dig-tunnel.sh

#!/bin/bash
# Ref. http://techlog.iij.ad.jp/contents/dslite-raspi

# gw.transix.jp
REMOTE='2404:8e01::feed:100'

#IFACE='eth1'
IFACE=1

# get my IPv6 address
for i in (seq 0 9); do
 LOCAL=`ip -6 addr show IFACE scope global |grep inet6 | awk '{print 2}'`
 if [[ LOCAL != '' ]]; then
  break
 fi

 sleep 1
done

if [[ LOCAL == '' ]]; then
 exit
else
 echo LOCAL
fi

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

# IPv4 routing
route delete default
route add default dev ip6tnl1

それでは実際にスクリプトを起動してトンネルを掘ってみます。

$ sudo ifconfig up eth1
$ sudo /etc/network/dig-tunnel.sh eth1

トンネルが掘れているか確認します。

$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.254/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link
       valid_lft forever preferred_lft forever
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1
    link/tunnel6 :: brd ::
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet6 2409:xxx::xxxx/64 scope global mngtmpaddr dynamic
       valid_lft 14125sec preferred_lft 12325sec
    inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link
       valid_lft forever preferred_lft forever
5: ip6tnl1@eth1: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1452 qdisc noqueue state UNKNOWN group default qlen 1
    link/tunnel6 2409::xxx peer 2404:8e01::feed:100
    inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link
       valid_lft forever preferred_lft forever

$ netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         *               0.0.0.0         U         0 0          0 ip6tnl1
10.0.0.0        *               255.255.255.0   U         0 0          0 eth0

$ ping -c 2 www.yahoo.co.jp
PING edge.g.yimg.jp (183.79.248.252) 56(84) bytes of data.
64 bytes from 183.79.248.252: icmp_seq=1 ttl=59 time=4.35 ms
64 bytes from 183.79.248.252: icmp_seq=2 ttl=59 time=4.92 ms

--- edge.g.yimg.jp ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 4.357/4.640/4.924/0.291 ms

トンネルの自動作成

問題なく接続できることを確認したら、起動した時に自動的にトンネルを掘ってルータとして機能するようにします。

トンネル作成は、/etc/network/interfacesに設定ます。

# これまでの設定に追加
auto eth1
iface eth1 inet manual
 pre-up /sbin/ifconfig eth1 up
 post-up /etc/network/dig-tunnel.sh eth1

ここで再起動して自動的にトンネルが掘れているか確認します。

DHCP サーバをインストール

最後に LAN 内の端末を自動設定できるように DHCP サーバをインストールします。

$ sudo apt-get install isc-dhcp-server

/etc/default/isc-dhcp-server

# eth0(LAN)にのみDHCPサーバとして働く。
#INTERFACES=""
INTERFACES="eth0"

/etc/dhcp/dhcpd.conf

#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;
option domain-name "example.jp";
option domain-name-servers 10.0.0.254;
option routers 10.0.0.254;

subnet 10.0.0.0 netmask 255.255.255.0 {
  pool {
    range 10.0.0.1 10.0.0.10;
  }
}

通信速度を測定

Raspberry Pi B+をルータとした DS-Lite 接続でどのくらいの速度が出るかBNR スピードテストでテストしてみました。

Ras Pi Ubuntu 16.04 IPv4 PPPoE
22.53Mbps(n=3) 91.02Mbps(n=6) 88.54Mbps(n=2)

テストは一番スピードが出ると予想される早朝に測定しました。Ras Pi と Ubuntu 16.04 は ZOOT NATIVE で、IPv4 PPPoE は ZOOT NEXT の結果です。

Raspberry Pi B+をルータにした場合は、USB 2.0 接続の Ethernet アダプターが 100BASE-TX のためか CPU の性能が律速なのか、DS-Lite トンネルの性能をフルには発揮できていないようです。

フレッツ光ネクストのハイスピードタイプは PPPoE の通信速度に制限がかけられているという話で、DS-Lite にするとその制限がなくなり本来の IPv6 による通信速度に近づくという話でした。しかし今回は、DS-Lite による通信では、期待された PPPoE を大きく越えるような高速な通信はできませんでした。

DS-Lite トンネルと PPPoE であまり差がなかった原因は、ルータにしているパソコンの性能が律速になっている可能性はあります。しかしこのパソコンは Core 2 Duo マシンで、速度測定中の負荷を見てもそれほど忙しくしているようには見えません。

ZOOT NATIVE はオススメ?

スピード命で固定の IPv4 アドレスが不要ならば、ZOOT NATIVE オススメかな。でも積極的に ZOOT NEXT から乗り換えるという程でもないかな。

ゴールデンタイムは ZOOT NATIVE の圧勝

残念ながら私の環境では PPPoE を大きく越える通信速度は見られませんでした。ただし DS-Lite によるトンネルのメリットは、最高速度だけでなくゴールデンタイムでも通信速度が低下しないという点です。

多くの人がネットを使うだろう土曜日の夜に ZOOT NEXT(PPPoE)と ZOOT NATIVE(IPoE + DS-Lite)で通信速度を測定してみました。なおルータには Raspberry Pi ではなく、Ubuntu 16.04 マシンを使用しています。

回線 平日の早朝 土曜日の夜
ZOOT NEXT 98.6Mbps(n=3) 3.37Mbps(n=8)
ZOOT NATIVE 83.4Mbps(n=3) 86.8Mbps(n=8)

このように PPPoE である ZOOT NEXT に見られた夜間の速度低下が全く見られませんでした。信じられなくて、NETX と NATIVE を交互に 8 回も測定してしまいました。ただし速度低下が見られなかったのは、まだサービス開始から時間が経っていないのユーザが少ないからという可能性があります。

ZOOT NEXT のままで十分

ZOOT NATIVE の欠点は、IPv4 の固定アドレスオプションが無いことです。また接続料金が倍になります。

ZOOT NEXT ZOOT NATIVE
1,080 円 2,160 円

現在の通信速度に問題があるならば、料金が倍になったとしてもこれよりも高い設定の ISP は普通にあるので乗り換える価値は非常にあります。しかし夜間に通信速度が低下するとは言っても、Hulu などで動画を見るのに全く支障がありません(注 6)。今回測定してみて初めてこんなに速度が低下するのかと気がついたくらいです。

そうすると普通に使える速度なら満足で IPv6 の通信が不要なうちは、積極的に ZOOT NATIVE に切り替える理由は見当たらない気がします。ZOOT NATIVE は常にフルスピードを求めるユーザ向けということでしょうか。せっかく 2 ヶ月の無料体験期間を設けてくれているのにごめんなさい。

参照と脚注

  1. フレッツ光のお客様 ID とアクセスキーは、フレッツ光を申し込んだ時の書類に記載されていました。
  2. 単純に固定アドレスを使いたいだけの場合は、DHCP クライアントを停止する必要はありません。/etc/dhcpcd.confに固定アドレスを使用するための設定を加えるだけで十分です。今回は、トンネルを掘るシェルスクリプトを起動したかったのでこのようにしました。
  3. AFTR は、Address Family Transition Routerの略。
  4. AFTR の IPv6 のアドレスが変わった時、IPv6 での通信だけで新しい AFTR を探せるのかな?
  5. 外から入ってくる通信は、全て出て行った通信への返信なのでルータを通過させて問題はない。
  6. ZOOT NEXT と AsahiNet は問題ありませんが、WakWak を使っていた時は非常に通信速度が落ちて動画配信サービスをまともには使えませんでした。