okayurisotto.net

私が好きでやったことが他の人のためにもなったらお得かも!

フィルタリングなどの病棟Wi-Fiの理不尽をTailscaleで回避する

  1. 📝

はじめに

以前、2週間ほど入院しなければならないことがあり、私はM1 MacBook Airを暇潰し用に持って行きました。ノートパソコンは貴重品であるため、その持ち込みや使用について看護師さんからはあまりよい顔をされませんでしたが、黙認してもらえました。スマホだけでなくノートパソコンも使える入院生活です。だいぶマシな生活を送れるのではないかと考えました。

私が入院した病棟にはフリーWi-Fiがあって、それを使えば通信量を気にせずインターネットが使えます。ありがたいことです。しかし残念なことに、病棟Wi-Fiにはいくつかの致命的な欠点がありました……。

FortiGateによるフィルタリングが厳しい

私はMisskey.ioというSNSを利用しています。これは分散型SNS実装の一つであるMisskeyを利用したSNSで、Twitterの先行きが怪しい今、移行先として注目を集めています。しかしこのMisskey.ioですが、病棟ではうまく動きませんでした。投稿に添付された画像などのメディアがうまく表示されないことが高頻度であったのです。何が原因なのでしょうか?

分散型SNSというのは、インターネット上にある複数のサーバーが連合し、協調して動くことによって一つの巨大なSNSを構築しているようなものです。そして投稿に添付されたメディアは、Misskey.ioではなく連合先の、また別のサーバーで動いているSNSのメディアでした。

連合先のサーバーで何か不調が起きているのではないかと考えた私は、その連合先のサーバーのURLに直接アクセスしてみることにしました。すると……なんと、FortiGateというフィルタリングによってそのサーバーへのアクセスは禁止されていたのです! つまりメディアが読み込めなかったのは、私のデバイスとそのサーバーの通信の間に入ったFortiGateによってブロックされていたためなのです。

pingのパケットが確定でロスする

Appleシリコンを搭載したMacBookでは、PlayCoverというアプリを使うことで、iOS向けアプリを動かすことができる場合があります。非公式な方法になるため何があっても自己責任な上、iOSアプリのIPAファイルを手に入れるには少し苦労させられるため、あまり大きな声で勧められるものではありませんが……。しかし、Appleシリコンというパフォーマンスのよいプロセッサを搭載したノートパソコンでiOS向けのゲームがプレイできるというのはとても魅力的です。

そういうわけで私は事前にMacBook Airに『原神』や『崩壊:スターレイル』をインストールしておいて、入院中の暇潰しに遊ぼうと考えていました。しかし、なぜかアプリが動作してくれませんでした。事前に自宅で試したときには動いていたというのに、病棟では通信エラーになってしまっていました。

原因究明として私は、病棟のWi-Fiが異常ではないことを確認しようとしました。まずやったのはpingコマンドによる通信状況の確認です。普通にブラウジングができるためここが問題だとは考えにくいですが、もしかするともしかするかもしれませんでした。そして実際に試したところ、もしかしました。pingのパケットがロスしていたのです。しかもそれは、おそらくすべてのサーバーに対して起きていました。Webブラウジングはでき、Google検索もできたが、Googleのサーバーへのpingには失敗する状況だったのです。

Tailscaleですべてを解決

これらの問題に対し、私は、手元のMacBook Airからインターネットへの通信のすべてを、自宅サーバーを経由するようにしました。

MacBook Airと自宅サーバーはTailscaleを使って構築されたVPNで繋がっています。そしてTailscaleにはExit Nodeという機能によって、すべての通信をVPN内の他のデバイスを経由するように設定できます。手元のMacBook Airとインターネット(原神のサーバー含む)との間に、自宅サーバーに挟まってもらうようにしたのです。VPNですから、手元のMacBook Airと自宅サーバーとの間で行われる通信にFortiGateは関与できません。

これによりpingのパケットがロスしてしまうことがなくなり、SNSもゲームも正常に動作するようになりました。ゲームがうまく動かなかった原因がこのpingの問題にあったのか、それともpingとは別の病棟Wi-Fiの制限が原因だったのかは結局わかりませんでしたが、解決したのでよしとします。

おわりに

ありがとう、Tailscale。ありがとう……。