TailScaleを使って、NATの向こう側にある自宅サーバーに繋ぐ

#92
2024.1.29

TL;DR

Tailscaleを使えば、自宅にグローバルIPが割り当てられていなくても、VPN経由で自宅サーバーにアクセスすることができる。しかも、無料でセットアップも簡単。

まえがき

半年前くらいから、中古のMac Pro (Mid 2010)を購入して自宅サーバーを構築し始めた。何故今更銀Mac Proなのか?古いMacOSの環境を置いておきたいのと、筐体に"ワークステーション感"が溢れていてかっこいいからというそれだけの理由。それ以前はRaspberry Pi 4にHDDを繋いだだけだったのでファイルサーバーくらいが限界だったが、物理8コアなので色々できるようになった。しかし、私が今住んでいる集合住宅は、(住む前から想定できていたことではあるが)グローバルIPが割り当てておらず、単にサーバーを立てただけでは、外からアクセスすることができない。

そこで私は考えた。安価なVPSをレンタルして、そのVPSを中継地点としてVPNを張れば、外からでもアクセスすることができるのではないかと。VPNにはWireGuardを用いて、自宅のサーバーとVPS間、VPSとラップトップ間をそれぞれ接続し、iptablesでルーティングを設定。設定を変えて何度も試したが、結果として、この方法はうまくいかなかった。繋がりはするものの、接続がすぐに途切れて、HTTPのページですらまともに転送できなかった。

Tailscale

半ば諦めていたところ、TailscaleというVPNサービスを発見。何やらNAT越えもできそうな雰囲気。Googleアカウントでログインすると、導入手順がわかりやすく表示され、簡単に使い始めることができる。macOSならApp Storeからアプリを、Linuxならコマンドラインでプログラムをインストールして、URLからデバイスを認証すれば、すぐにVPNに繋ぐことができる。

早速ローカルの外からHTTPサーバーにアクセスしてみると、何の不自由もなく、接続することができた。ルーターの設定は一切必要ない。こんなに簡単にNATの向こう側にある自宅サーバーに繋げてしまうのかと、便利すぎて拍子抜けしてしまうほどだった。しかも、デバイス100台まで無料だというのだから、VPSを設定しているあの時間はなんだったのだろうか、と。

Tailscaleの仕組みについては、公式ブログがとても詳しく説明している。NAT越えについても単独でページがある。

全てに目を通したわけではないが、かなり色々な工夫がなされていることが見て取れる。多くの場合はP2Pで直接接続されるようだが、UDPをブロックするようなファイアウォールの場合には、DERPと呼ばれる、HTTPSベースのリレープロトコルを用いて、リレーサーバーを経由するようだ。

どのようにサーバーに繋がっているかは、Tailscaleのpingコマンドで知ることができる。macOSの場合は:

% /Applications/Tailscale.app/Contents/MacOS/Tailscale ping xxx.xxx.xxx.xxx

自宅サーバーへのpingはvia DERP(tok)、つまり東京のDERPサーバーを経由していたので、もしかするとうちのプロバイダがUDPを厳格に遮断しているのかもしれない。

注意点

便利なTailscaleだが、注意しなければならないと感じた点が一つ。それはアカウントが乗っ取られると、ネットワークに繋がれた全てのデバイスにアクセスできてしまうだろうという点。ログインに使用しているアカウントの二段階認証を有効にしておいた方が良い。