実家で録画サーバーを動かし、その管理のためにVPNサーバーを設置していました。
そして、最近引っ越しをして僻地で家にアクセスしようと思った際に繋がらなかった…というわけではないのですが、タイトル通り不思議な状態になったお話です。
本編で詳しく設定する前に簡単に状況だけ説明しておくと、WindowsのWireGuardでVPNを有効化して、普通につながった状態になります。ここで、目的の録画管理ページ(システム)であるEPGStationにWindows PCを用いてアクセスしようとしたところそのページが見れない状態でした。ここから色々調査していくと、タイトルのようによくわからない状態で非常に躓いたお話です。
ネットワークガチ勢の方なら常識なのかもしれませんが、調べてもこういった症状の話がほとんどなかったので記事にしようと思った次第です。
結論を先に書くと、原因はMTU(Maximum Transmission Unit)というものにありました。これは多くのVPNソフトで設定できることなので、私が利用していたWireGuardに限らずあり得る話になります。
数年前、研究関連で「P4」というネットワーク関係の話をやったことがあり、その際にかじった程度の勉強しかしていません。ですので、説明に変なところがあるかもしれませんが、ご容赦いただけると幸いです。
目次
状況と症例
まず始めに、求めている情報がこの記事が適当なのかを確認してみます。一部冒頭のリード文と被るところがあると思いますがご容赦ください。
まず、私は遠方の実家にVPNサーバーを立てています。VPNはWireGuardを用いています。当時は動作確認として外部ネットワークを用いたかったので、DoCoMoの回線を使い問題なく動作することを確認しました。また、外部に出て公衆WiFiを使ってPCでも動作を確認して、使う準備は万端…のはずでした。
しかし、いざ引っ越し、引いている回線を使ったところ、VPNのハンドシェイクは正常に行えているものの、ブラウザでは見れるサイトと見れないサイトがあること気づきます。DNSサーバーへアクセスできていないのかと考え、色々コマンドをうって確認してみますが問題ありませんでした。
WAN側に出ていくものならDNSサーバーの設定とかもあるしとりあえずLAN内に接続してみようということになり、録画ページをブラウザで開くと、これまた繋がらず。
SSH接続は?ということでSSH接続を行うと問題なく接続できます。DNSの問題ではない…?ということで謎になっていきいます。
共有ファイルはどうなっているか確認すると、共有フォルダへのアクセスはできました。その中にある写真ファイルを読み込もうとすると、ファイルが開けません。権限の問題の可能性が万が一にもあったら嫌なので、ファイルをVPN越しにクライアントにダウンロードしようとすると、ダウンロードができません。ファイルの伝送を見た感じだと通信がタイムアウトしている状態のようです。現に大きさの小さいテキストファイルなら非常に時間がかかりましたがコピーできました。
つまり、単純に回線速度がどこかでボトルネックが発生して遅くなっている可能性があると考えました。
しかし、ここで不可解な点に気づきます。iPhoneやAndroidの端末でVPN接続をすると録画管理ページを非常にスムーズに開けます。共有ファイルもスムーズに見れます。PCならそもそも開けない状態なのになぜでしょうか。回線は同じWiFiを使っているはずなのにです。
ここで、状況をまとめてみます。
- PCだと見れるサイトと見れないサイトがある
- PCで共有フォルダにアクセスすると非常に低速
- SSH接続は問題なくできる
- iPhoneやAndroidのモバイル端末なら問題が発生しない
検討がつきません。何が悪いのでしょうか。特定のウェブページなら見れる、見れないという話はいつぞに聞いたことがあったので調べてみます。
疑ってみたこと: IPv6環境
まず、結論的にはこのパートは無駄なのですが、人によってはこういった原因もあるかもしれないので、備忘録や参考ついでに残しておきます。
これは、特定のサイトは見れて、特定のサイトは見れないという状態に考えられることです。
まず、見出しにあるようにIPv6が悪さをしている可能性があるのですが、これは現在普及してるサイトの多くはIPv4環境のみで動作するようになっており、IPv6に対応したWebサイトが少ないことが原因です。なので、IPv6にしか対応しない環境だと、IPv4のサイトが見れないので問題の症状を引き起こす可能性があります。
しかし、この現象を考えるとおかしな点があり、私が設定しているDNSレコードはIPv4のAレコードしか設定しておらず、IPv6で動作しようがないのです。実際、IPv6に対応したYouTubeを開こうとしても開けなかったので別の原因だと判断しました。
モバイルデバイスだと繋がる…?
今回の状態を沼にしているのは間違いなくこれで、何故かモバイルデバイスなら問題なく全てのコンテンツが機能しています。設定ファイルの生成は全て同じ方法で行っているので、設定に違いは殆どないというのも謎を深めています。
これを利用して条件を切り分けるとすると、OS間に差があるというよりも、周辺環境に問題があると考えました。WindowsPCならファイアウォールやWindowsDefenerがあるので、通信を妨害しうるものと言えばこれだろうという感じで無効化して検証してみましたが、効果はありませんでした。
やはりつながるサイトと繋がらないサイトがあることが腑に落ちない私は、IPv6かIPv4を使うかの選択が内部で行われててそれが正しく機能していないのではないかと思いました。
なので、PCのネットワークアダプターの設定でIPv6を無効化してみましたが、やはり効果はありませんでした。
MTUの設定に気づいた理由
私の場合はWireGuardをpivpn経由で入れたのもあり、WireGuardの設定を細かく知らなかったので、1から導入する前提で調べていました。
すると、人によっては設定ファイルでMTUを設定しているのを見つけました。で、その設定を真似てみても上手く動かないので「やっぱこれじゃないよな~」なんて思っていたのですが、すると、別の値でMTUの設定を行っている人を見つけました。
MTUの値とは何で決めるのかということを疑問に思いました。WireGuardのMTUに関して検索したところ、以下のページを発見。
-GitHub-
https://gist.github.com/nitred/f16850ca48c48c79bf422e90ee5b9d95
このページによると、一方のMTUを固定して、もう一方のMTUを変化させるとどのような変化が発生するかを調べていました。このページ内のグラフを見ると、上りの速度がほぼ0になってることがわかります。つまり、適切なMTUの値でないと、殆ど通信できなくなることがわかりました。
三度目の正直ということで調査に乗りだします。
まず、MTUというのは冒頭に書いた通りMaximum Transmission Unitの略です。で、これは何かを説明すると、日常的に扱うデータはいくつもの小さな「パケット」と呼ばれるものに分解されて送受信してます。昔に聞いたであろう「パケット」とは本来はこのことを指します。で、このパケットというのがどれだけ大きくて良いかを決めたものがMTUになります。
MTU値を超えたパケットはさらに分割をするのですが、その分パフォーマンスが下がるのと、TCPプロトコルではそもそも分割禁止のデータがあったりします。また分割されたデータは悪意のある攻撃に用いたりできるので、伝送経路のどこかで棄てられることがあります。なのでMTUが適切に設定されていないと繋がらなくなったり、殆ど速度がでないようになります。
このMTUですが、Ethernetの標準規格では1500バイトが採用されているらしいですが、プロバイダによって使われている値が異なります。
そして、VPNを利用する際にはヘッダーを追加する必要があるため実際のMTUに対して、どれくらいヘッダーで使うかを考慮した値を入れなければならないのです。
ちなみに、VPNのMTU設定に関するトラブルとして日経クロステックや日本通信ネットワーク株式会社のサイトに記載があります。
MTUの設定と確認
はじめに、今接続している回線のMTUを確認します。
pingコマンドで確認できますが、面倒なので以下の外部サイトで確認してしまいます。
https://www.speedguide.net/analyzer.php
このページで確認すると私の環境の場合、1434と出ました。この値がMTUになるわけではなく、上述したヘッダーの分を考慮して値を用意する必要があります。
このヘッダーの容量は環境によって変わり、私が使っているWireGuardの場合でIPv6環境なら80バイト、IPv4なら60バイトという仕様なので、IPv4環境の場合、1434-60=1374という形で最適であろう形を求めることができます。
この値を設定ファイルに反映してInterfaceの部分を以下のように追記します。
[Interface]
PrivateKey = PKey_phrase
Address = 10.6.0.2/24
DNS = 8.8.8.8, 8.8.4.4
MTU = 1374
この状態で接続すれば問題なく接続できるようになりました。
もしこれでも繋がらないようならもう少しMTUの値を落とすと繋がるようになることもあるかと思います。書いたように、攻撃でも使えるという性質上、経路上のどこかで棄てられる可能性があるので、今接続している回線以外のどこかでそうなっている可能性があるからですね。
私の場合はこれで解決できましたが、ネットワークは複雑なので、これ以外の可能性もあるでしょう。
まとめ
一部サイトが見れないという状態で、SSH接続はできる、共有ファイルは遅くて殆ど見れない、でもモバイルデバイスなら問題なく使えるという、とても不可解な状態になったVPN(WireGuard)の原因を突き止めて対処した話でした。
事前に別回線を使って動作検証を行ってたのにも関わらず非常に躓いたのですが、MTUのことに気づくことができ、問題なく使えるようになりました。また、WiireGuardのヘッダー容量を例として最適なMTU値を求め方を紹介しました。
モバイルデバイスでのみ上手く動作した理由は謎ですが、モバイル版WreGuardは設定がAutoのときは特殊な動作をするかデフォルト値が低めに設定されているのかもしれません。
今回のようなケースの場合は、動作確認を行った後、遠方で使おうと思ったときに使えないとなって対処法を知らないと面倒なので覚えておこうと思いました。
以上です、お読みいただきありがとうございました。