10Gbpsの回線を2本導入して快適なはずの自宅のインターネット回線で、ある日、特定のWebサイトだけやたらと不安定なことに気づきました。
- ログインが高確率でタイムアウトする。再試行すると成功する。
- それ以外の画面遷移も、3回に1回位の確率で、10秒以上かかったりタイムアウトする。
解決までの記録です。
少し切り分けてみる
まずは当然ながら、ブラウザ・PC・ルーター・ネットワーク・対象サイトなどを切り分けていきます。
対象サイトの障害?
最初はサイト側の問題かと思って気にしていなかったのですが、数ヶ月経っても改善せず、問い合わせてもシステム障害は確認されていないとのこと。
- 2回線あるうちのフレッツ光クロスの回線でだけ発生しており、auひかりの回線では発生していない。
- フレッツ光クロスの回線では、別ブラウザはもちろん別PCからでも同じ現象が発生する。
- フレッツ光クロスの回線では、時間帯を問わず発生する。
- 環境はすべて有線LAN接続で、フレッツ光についてはHGWに直結しており、無線などの問題はない。
対象サイトは悪くなく、なんとなく、フレッツ光クロス側の回線が怪しくなってきます。
宅内環境の問題?
レンタルのONUやHGWを電源抜き差ししたり、ファームアップデートを確認したりしましたが、特に現象に変化は見られません。
回線の問題?
フレッツ光の工事故障情報には、気になる記載はありません。そもそも数ヶ月続くとも考えにくい。
また別のサイトでは問題が発生せず、安定しています。
時間帯を問わず、スピードテストサイトでも帯域・pingレイテンシ・ジッター・パケロスなどに悪化は見られません。
v6プラスの問題?
この回線ではv6プラスを使っています。
試しに別のv6プラスを使っている環境(都道府県をまたぐのであまり参考にはならない)から試してみましたが、問題ありませんでした。流石にv6プラス全体がおかしいということはなかった。
エビデンスを集める
詳細が不明ながら、自宅ではなくNTTやJPNEのネットワーク、またはその先の経路に原因がある可能性が高そうです。
再現条件を明確にしないと問い合わせしても意味は薄そうなので、自分の初歩的なミスがないかの確認も含めて、簡単なスクリプトを組んで問題を整理してみます。
telnetでログを取る
本当はpingやtracerouteの結果を集めたかったのですが、対象サーバがHTTPSしか応答してくれず、あまり人様のサーバに頑張ったポートスキャン仕掛けてもよろしくないですし、HTTPSで接続確立するための時間を測定することにします。
どうやるか迷ったのですが、 "echo \"close\" | timeout 5 telnet -b #{BIND} #{HOST} 443"
といったコマンドの実行時間を測定することにしました。 BIND
は複数NICでどれを使うかを指定するIPアドレス、 HOST
は宛先Webサーバのホスト名です。
def ping
t1 = Time.now
stdout, stderr, status = Open3.capture3("echo \"close\" | timeout 5 telnet -b #{BIND} #{HOST} 443")
t2 = Time.now
ms = ((t2 - t1) * 1000).round(1)
if stdout =~ /Connected/
stdout =~ /Trying ([\d\.]+)/
puts "success #{ms} #{$1}"
else
puts "failed to connect #{ms} #{stdout}"
end
end
あまり正確な測定ではないですが、傾向が分かれば良いのです。5分ごとに10回くらい接続してみました。5秒間応答がなければタイムアウト扱いです。また、ついでにtelnetするので宛先サーバのIPアドレスも記録しています。これで、例えばラウンドロビンで特定IPのサーバだけ調子悪いとかあるのかな?と思いましたが、フレッツ・au回線どちらのパターンでもサーバ側は常に同一のIPアドレスでした。
HTTPS接続の確立にそんな何百msもかからないだろうということで、1秒を超えたら黄色くしてみたらこんな感じ。これはひどい。表示範囲にタイムアウトはありませんでしたが、コネクション確立だけでこれだけかかるなら、より複雑なPOSTとかで数十秒かかっても不思議はないでしょう多分。
フレッツ光クロス/v6プラス回線での結果
同じスクリプトをauひかりの回線で実行した結果はこんな感じでした。普通こうですよね...
au回線での結果
切り分け用に他のサーバのログも取る
その瞬間にPCやネットワーク全体が不調だったケースを除外したいので、全く同じスクリプトを別サイト宛に動かしておきました。
flets | auひかり |
---|---|
やはり、他のサイトでは特に問題ありません。
問い合わせる~解決
途中経路が悪いようにしか見えないので、ISP(enひかり)に問い合わせました。
enひかりさん、問い合わせにちゃんと対応してくれて、好感度が高いです。何を問い合わせても「ルーターに近づけろ」としか言わないGoogleさんとは違う。最初に必要な情報をしっかりと提供すれば、「電源抜いて」とか「ルーター初期化して」とかのテンプレやり取りで何日も浪費することなく、具体的な相談ができます。なお基本電話ベース。
何度かの往復や簡易診断の結果、以下のような回答をもらいました。
- NTT東日本からチェックする簡易診断では、特に問題はない。
- JPNEに確認したが、それらしい障害はない。
- ONUの交換といった対応をやってみることは可能だが、故障でなかった場合は料金がかかる。
まあ、そうですよね。
そういえば?
ここで、ふと思い出しました💡
- 問題が起きるようになったのは2023年4月頃からだった気がする。
- その頃に、割り当てられているグローバルIPv4アドレスが変わった記憶がある。
- 当時のスピードテストサイトのスクショを見る限り、IPv6プレフィックスも変わっている。
つまり、4月頃に何らかの理由でIPアドレスの再割り当てがあり、その際によくわからないハズレを引いたのでは、という仮説が成り立ちます。それなら、再度割り当てを変更してもらってガチャを回し直せば良いのでは...
再割り当てを起こすには?
この仮説を元に、再度ISPに相談してみました。
フレッツ光(おそらくクロスもネクストも同じ)で割り当てられるIPv6アドレスは半固定で、時間経過やONU再起動ではあまり変わりませんが、以下のようなタイミングで変化するようです。
- ONUやHGWを交換した場合
- NTT側で設備工事があった場合
- NTT側で手続きが必要なタイプのオプション変更をした場合(固定IPの契約や解除、VNEの変更、ひかり電話の契約や解除など)
つまり、 なにかオプションを申し込めば良さそう です。例えば、固定IPを申し込んですぐ解約するとか。
enひかりの優秀なところは、複数のVNE(v6プラスとXpass)を選べるところです。以前からv6プラスとXpassの速度比較したいなと思っていたので、ちょうど良い機会だということでXpassへの変更を申し込みました。切り替え事務手数料2,200円なり。
Xpassに切り替える
Xpassへの切り替えは簡単です。電話でお願いしますといえばそれで完了、翌月の請求が2,200円増えるだけです。
申し込んでから数時間で、v6プラスの回線が切断され、その後1時間位?でXpassから降ってくるIPv6アドレスに切り替わりました。30分ほどで、IPv4アドレスも割り振られました。ダウンタイムが気になる方は予備回線を用意しておくか、日時指定で申し込むと良いと思います。
解決した!
わくわくしながら再測定すると...
フレッツ光/Xpass回線の結果
バッチリ解決しました。良かった良かった。
pingレイテンシがわずかに改善
思わぬ副産物で、pingレイテンシがv6プラス→Xpass変更で0.5msほど改善しました。ラッキー。ただ、グラフ化したサンプルが少なく詳細未確認ですがIPv4の最悪値は微妙にブレる様になったかも?ジッターもわずかに増えたかもしれません。これはアンラッキー。
グラフがちょん切れている左側がv6プラス、右側がXpassです。
その後数ヶ月使っていますが、speedtest結果では帯域はv6プラスと大差なく、良いサーバを選べば時間帯を問わず下りで5~8Gbpsくらいは出ます。上りは若干落ちたかも?2~5Gbpsくらい。上述の通りpingレイテンシが僅かに改善、気になる不安定さはなく、全体的に快適です。ブランド力でJPNEに劣るから心配していましたが、アルテリア悪くない。
終わりに
ということで、結局何が悪かったのかははっきりとはわかりませんが、VNEの変更により解決しました。
複雑なインターネットの、途中経路になにかトラブルがあったんでしょう多分。そういうこともあるんだなということで、フレッツ光を使うならIPガチャの存在を認識しておきつつ、困ったときのためにVNEを切り替えられるプロバイダはおすすめです!