Vyatta改めVyOSでDS-Liteを使う(IIJmio+フレッツIPoE)

IIJmioでDS-Liteが使えるようになったというのをちらほら見かけてて気になったので自宅のネット回線で使ってみました。

DS-Liteってなにか

これに関しては、IIJのてくろぐの記事 とかを見れば充分かと。IPv6に移行していくに向けて、途中経路はIPv6のみで、IPv4を使う方法としてIPv4 over IPv6なIPIPトンネルを張って、キャリア側のCGN経由でグローバルに抜けれるようにするというものです。こうすることで、とりあえず、自宅のルータより外のネットワークはIPv6 reachableでさえあればよくなるのでIPv6に移行しやすくなるよね、という話ですね。

上記ブログ記事の通り、DS-Liteにしたからといって特に劇的に何かが変わるわけではないんですが、現状、フレッツを使っていると、PPPoEでグローバルに抜けるより、IPoEでIPv6つかって通信するほうがあきらかにレイテンシも良いんですよね。あと、ハイスピードタイプ使ってるのでDS-LiteであればIPv4でも下りが1Gbps使えるようになるという書かれている通りのメリットがあります。

あと、PPPoEって認証失敗したりとか、不意の電源オフ後に再接続するのにキャリア側のタイムアウト待たないとダメだったりと、リモートで再起動して接続失敗して死亡というのが多いイメージ(あくまでイメージで、ちゃんとやればあまり起こらなくもなりそうだけど)で、IPv6の場合はリンクアップさえしていればRAでアドレスとれるので、その後のIPIPトンネルもまあ相手が落ちてない限り、起動さえすれば接続されそうなよく分からない安心感もあるような。

どうでもいいけど、名前が任天堂のアレとかぶりすぎてて、検索しづらいのが一番ツライ。いまのところ、日本語情報ならDS-Lite対応してるのがIIJmioだけなのでDS-Lite iijとか入れれば大抵フィルタできるのでいいのですが……

VyOSでの実際の設定

SEILでの接続例は公式にも紹介されていますし、YAMAHA RTXシリーズとかの設定例もあるっぽいんですが、どうもVyOSでやってみたみたいな設定はあまり例がなさそうなので載せてみます。

といっても、基本はIPv4 over IPv6なIPIPトンネルが張れればそれでOKなのでそんな難しいことはまったくありません。

ハマリどころは、IPIPトンネルの接続先がgw.transix.jpと指定されている(今はたぶん共通ですが、設定内容は IIJmio FiberAcces/NFの設定情報 から確認できます。)のですが、このホスト名、8.8.8.8とか、適当なv4なアドレスのDNSサーバで引くとIP引けず、フレッツ経由のDHCPv6で取得できるv6なアドレスのDNSサーバ経由でないとそもそもアドレスが引けません。結果的にはトンネル接続先にはホスト名使えないのであまり意味はないんですが、ここで名前ひけないとビビりますよね、という。

設定例は下記のような形です。

interfaces {
   ethernet eth0 {
       address dhcpv6
       dhcpv6-options {
           parameters-only
       }
       duplex auto
       hw-id xx:xx:xx:xx:xx:xx
       ipv6 {
           address {
               autoconf
           }
           disable-forwarding
           dup-addr-detect-transmits 1
       }
       mtu 1500
       smp_affinity auto
       speed auto
   }

   tunnel tun0 {
       encapsulation ipip6
       local-ip [my-local-ipv6]
       mtu 1500
       remote-ip 2404:8e00::feed:100
   }
}
protocols {
   static {
       interface-route 0.0.0.0/0 {
           next-hop-interface tun0 {
           }
       }
       }
}

設定のポイントは下記でしょうか。

  • DHCPv6でDNSサーバの情報をもらって設定するべし
  • アドレス自体はRA経由で取得する形で若干トリッキーになっています。ひかり電話で契約している場合はひかり電話ルータがDHCPv6サーバとして配ってくれたりするので、素直にDHCPv6でアドレスを取るのがいいかと思います。正直、ここはこれでうまくいったのでこうしていますが、結構自信が無い部分。ひかり電話の契約ある/なしで動作変わるとかあるようでよく分からん。
  • tun0としてトンネルインターフェースを作って、encapsulationでipip6を指定します
  • local-ipはeth0に割り当てられるアドレスを指定。あ、eth0が外側のNICです。実際はeth1が居てローカルネットワークにつながっています。
  • remote-ipは上記のgw.transix.jpのIPアドレスを指定。設定時はIPが2つ返ってきましたが、とりあえず1つだけを使っています
  • NATやマスカレードする必要がないので、単純にstatic-routeを指定します。要は全部のパケット(デフォルトルートとして)をtun0に向けるだけです。

local-ipはフレッツ IIJmio IPoEでは半固定なので変わる可能性は一応ありますが、かなり頻度は低いのでまあそのまま書いちゃってます。remote-ipは本来はgw.tansix.jpをホスト名で指定できるとよいのですが、今はVyOS(というか、iproute2ですかね。)ではIPアドレス指定しかできないようなのでアドレスを手書きしています。ここはホスト名指定できるようになるといいですねー。

こうすることで、普通にIPv4パケットをVyOS動いてるマシンに投げつければIIJ側でNATしてグローバルに出て行けるはずです。

雑感その他

で、実際の速度。とりあえずいくつかの速度測定サイト(speedtest.netとか)で測ると、たしかに下りで400Mbpsとか、500Mbpsみたいな値を観測できます。正直、これが見れただけで楽しかった。

実感として常に速度速いなーと思うようなことはないですが、日常でも巨大なファイルダウンロードするケースなんかではたまに30MB/sとか出ることがあります。まあPPPoE設定するのよりは全然楽なので、基本DS-Lite使えるならそれで良いじゃんというところ。

設定しているうちに構成イメージを咀嚼できて気づくのが明らかにルータの負荷軽くなるなぁという点。要はグローバルなアドレス宛の通信を特にソースアドレス書き換えることもなくIPIPトンネルの先のgw.transix.jpにルーティングするだけです。いままでのようにIPマスカレード等をする必要すらなくなります。BUFFALO WXR-1900DHPがDS-Lite対応として紹介されてますがこのルータは高級な感じでDS-Liteのために買う気はまったく起きませんが、上記ブログ記事でも書かれているように、DS-Lite方式が広まりさえすれば、もっと廉価なやつでも充分に対応できるだろうし、対応ブロードバンドルータ増えるといいっすねぇ。

問題があるとすれば、記事で書かれているとおり、こちらのルータ側ではグローバルアドレスを持たなくなるし、CGNなのでDNAT設定させてくれるわけもないので、外から自宅のマシン等にリーチはまったくできなくなります。まあ、でも生活の大半はIPv6で、基本はIPv6で直接 or さくらVPSともトンネル張ってるのでそもそもグローバルIPを直に指定して接続することのない私の環境では特に問題にならないので放置してます。

想像できるケースでもっとも微妙だろうと思われるのはUPnPとかNAT-PMPを使ってるケースだろうなぁという気がします。具体的にはBack to My Mac活用してるとかかな。これもVPNとか張れば別に問題ないはずなんだけど、まあそういうのできる人ばっかりではないということで。ここの解決策に関しては、今はDS-Liteを使っていてもPPPoEも同時に張れるので、ポリシールーティングを適当に設定してあげれば外から来たパケットはPPPoE経由で戻せばなんとかなるような気がしますが、とりあえずVyOSはUPnPはデフォルトだと動かないですし、割愛。

DS-Lite、面倒なことを全部キャリアがやってくれる感じで良いですね、という結論。

余談Gentooで設定するときにはnetifrのスクリプト修正が必要な件

DS-Lite使うにあたって、会社でもIIJmioの契約があるのでそちらはGentooでつないでみたときに気づいたところを一点。

とりあえずつなぐのは、このPDF を参照すればコマンド例とか載ってるので割とさくっとつながります。こちらもgw.transix.jpではなくIP指定しか無理とかありますが。

で、Gentooの流儀に合わせて設定を書く場合にひとつ問題があって、/etc/conf.d/netに書けばいいのかなということで、下記のような感じで書いてみます。

iptunnel_ip6tnl1="mode ip4ip6 remote 2404:8e00::feed:100 local [my-local-ip]"
mtu_ip6tnl1="1500"
routes_ip6tnl1="default dev ip6tnl1"
config_ip6tnl1="null"

しかし、このままだと成功しないです。mode指定でv6系(ipコマンドで-6を渡すかどうかを決める系)ではipip6,ip6ip6しか現状では対応してない模様。/lib/netifrc/net/iproute2.shが設定ファイルを処理してるスクリプトなのでipip6とかで検索すると見つけられます。なので、iproute2_pre_start()のなかで、

[ "${tunnel##mode ipip6}" != "${tunnel}" ] && ipproto='-6'
[ "${tunnel##mode ip6ip6}" != "${tunnel}" ] && ipproto='-6'

となっている部分を

[ "${tunnel##mode ipip6}" != "${tunnel}" ] && ipproto='-6'
[ "${tunnel##mode ip6ip6}" != "${tunnel}" ] && ipproto='-6'
[ "${tunnel##mode ip4ip6}" != "${tunnel}" ] && ipproto='-6'

と変更してしまいましょう。 これで、上記設定で、/etc/init.d/net.ip6tnl1をnet.loのシンボリックリンクとして作っておけば/etc/init.d/net.ip6tnl1 startとかやればトンネル接続が確立して、ルーティングが変更されます。restartはどうもうまくいかなくて、別途 ip -6 tunnel del ip6tnl1を実行しないとダメっぽくてここもたぶん/lib/netifr以下を調整すればいいような気がします。 と、これだけやればGentooでもDS-Liteはさくっとつかえるようになるので、あとはこいつにむかってパケットを投げつけるだけ(IPパケットのルーティングなんかがされるように、net.ipv4.ip_forwardは1にしたりはしておかないとダメですが)

ってここまででふともしかしてmode ipip6と指定しても動くのではないかというのが書いてて疑問になったのでまた機会があれば試すということで…