DNSの応答が遅いと思ったら、フレッツのIPv6網が原因だった?

PCを新調したおかげで、なにかの操作をしてから反応するまでのレイテンシが良くなったのですが、そのせいで、今まであまり気にしていなかった部分のレイテンシが気になるようになりました。

今日はその1つ、DNSの応答速度の改善の話です。

私の家庭のネットワーク環境

私の家では、ネット回線にフレッツ光を使っており、市販のルータの代わりに Linux PC をルーター(兼、各種サーバー)として動作させています。


このルーターはLANの口を2口持っており、片方はPPPoEでプロバイダと接続し、もう片方で家庭内ローカルのLANを構築して、他のPCやPS3などとつながっています。また、ルーターは家庭内LAN向けに、DHCPDNSを提供しています。登録済みの自分のPCをLANに繋ぐと、DHCPMACアドレスを見て、DNSに名前が登録されている固定アドレスが割り当て、そうでなければダイナミックに適当なアドレスを割り当てるようになっています。IPアドレスローカルアドレスなので、名前も外のDNSに告知するわけにはいきませんから、ルーターDHCPがクライアントに伝えるDNSルーター自身となるように設定されていて、ルーターDNSはローカルな名前解決を行い、ローカルな名前でなければプロバイダのDNSにリレーして聞きに行くようにしています。

……。わかりにくいですね。すみません。まぁ、今回はそこが本題ではないので流してください。

ともかく、PPPoEでプロバイダに接続するのも、一般のインターネットのサーバーのDNS引きをするのも、そのルーターマシンとなっている Linux PC なわけです。

フレッツのIPv6

Fletsは数年前から実験的にIPv6のアドレスを配っているため、このルーターPCにもIPv6のアドレスが振られます。ローカルなネットワークは隔離されていて、IPv6接続はローカルリンクのみなので、フレッツスクエアv6などのサイトにはクライアントPCからはアクセスできません。それをやるためには、最近のルーターが対応している「IPv6パススルー機能」を、ルーターPCにも実装してやる必要があるわけですが、面倒なのでやっていません。

だって、苦労してその機能を実装しても、見れるのはNTTのサービス用サーバーだけなんですよ?

そうなんです。これ、結構しらない人が多いと思いますが(というか私が知らなかっただけ?)、NTTから割り振られたIPv6アドレスを使っても、インターネットにある一般のIPv6のサーバーには接続できません。踊る亀は見られないんです。

図にするとこんな感じです。

これでは一般のサイトにはIPv6パケットは届きませんね。実は、NTTのIPv6アドレス割り当てのページをよく読むと、こうなっているということがわかります。(引用中の強調の装飾は私が付け足したものです)

Bフレッツ契約回線に対して、IPv6アドレスの割り当てを実施いたします。
※ 本アドレスはNTT東日本が今後提供するサービスでの利用を目的に割り当てるものであり、インターネット接続等で利用することはできません。

BフレッツにおけるIPv6アドレス割り当ての実施について|フレッツ公式|NTT東日本

意訳すると、「アドレスは割り当てる。けど、NTTのサービスにしか繋がらんよ」となります。

フレッツ IPv6 の罠

上記で引用したページには「その他注意事項など」という名前で別のページへのリンクがあり、そのページには以下のような記述があります。

インターネット上には、IPv6IPv4の両方で公開されているホームページが存在しており、このようなホームページへアクセスする場合には、初回表示に数十秒かかる場合がございます(初回表示以降は端末のキャッシュ機能により表示遅延はなくなります)。

BフレッツのIPv6アドレス割り当てに関する注意事項|フレッツ公式|NTT東日本

そうなんです。クライアントPCはグローバルに繋がっていると思しきIPv6アドレスを持っていたら、普通そちらを使って接続しようとします。そして、つなぎに行ってみて、繋がらないことがわかったら(普通、タイムアウト時間は秒オーダー)諦めて、IPv4で繋ぎにいき、始めて接続に成功します。

私のネットワーク環境の場合、各クライアントPCはグローバルなIPv6アドレスを持っていないので問題ありませんが、ルーターはアドレスを持っているうえ、クライアントからのDNSを中継しているので、DNSの名前解決する際のネットワークアクセスで頻繁に待ちが起きてしまうことになります。

とにかく、使えないIPv6アドレスを持っていると無駄に待ちが発生してしまいます。で、その解決策としてNTTが示したのは……

【対処方法1】
「フレッツIPv6セットアップツール」をインストールすることで回避可能です。

【対処方法2】
IPv6をはずすことで回避可能です。設定手順は、以下のとおりです。

デスヨネー。

セットアップツールの方は確認していませんが、IPv6無効化をするだけか、せいぜい、ルート設定をいじってNTTアドレスのみIPv6に流れるように設定する程度でしょう。

私は、当面フレッツ独自なサービスはいらないので、ルーターのIPv6設定を切ってしまいました。

Linux で IPv6のアドレス割り当てを無視する

やりかたは幾つかあり、強引なところでは Linux カーネルIPv6 機能全体を殺してしまうこともできます。ただ、素直なのは、NTTから飛んでくる IPv6 アドレスの割り当てを単に無視することでしょう。

具体的には、 /etc/sysctl.conf に以下を追記します。(Debian/Ubuntuディストリビューションなら、下記の内容で /etc/sysctl.d/ に新規ファイルを作成する方が良いです。私はCentOSなので直接編集しますが。)

net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0

ここにこう書いておくと、init がシステム起動時に最初に処理するスクリプトである /etc/rc.sysinit の中で sysctl コマンドが実行され、設定値が /proc/sys/net/ipv6/conf/all/accept_ra などに設定されます。このタイミングでデフォルト設定されていれば、その後で eth0 などが沸いてきた時にこの設定を引き継ぐので、各インターフェースに設定して回る必要は無いんじゃないかという算段です。

再起動し、ifconfig で Scope:Global な inet6 が設定されていないことが確認できれば設定完了です。"Scope:Link"のIPv6は残っているはずですが、問題ありません。念をいれるなら、ping を打ってみたり、デフォルトルートの設定を見てみたりするのも良いでしょう。

$ ping6 flets-v6.jp
connect: Network is unreachable
$ /sbin/route --inet6 | grep "^::/"
(何も表示されない)

一時的に有効無効を切り替えたいなら以下のようにすることも可能だと思いますが、あまり出番は無いと思います。

# /sbin/sysctl -w net.ipv6.conf.eth0.accept_ra="1"
(echo "1" > /proc/sys/net/ipv6/conf/eth0/accept_ra  と同義)