Headscaleにおけるexit-nodeの指定

2023年3月23日

exit-nodeというのは、Tailscaleにもとからある機能で、Tailnet上のあるマシンAがインターネットに出ていく時に、必ず別の特定のマシンを経由するというものである。

これにより、一般的なVPNサービスを契約しなくとも、マシンAのメタデータが守られる。例えば、マシンAがノートパソコンだとして、ホテルやカフェのWifiに接続した場合、通信内容はほぼ暗号化されるとしても、どこにどの程度接続したかというメタデータは中間の経路が取り放題だからだ。

この状況でexit-nodeを使えば、ノートパソコンからexit-nodeまでは、暗号化され、中間の者は何の情報も得られない。単にデータ通信が行われていること、その通信量しかわからない。もちろん、exit-nodeとしてどこを選択するかは重要だ。信頼できる、つまり、プライバシーを侵害しないVPN業者を選択すべきだろう。ここで採用しているKagoyaを必ずしも推奨するものではない。

exit-nodeにするマシンでadvertiseする

まずは、exit-nodeに指定するマシン側のtailscaleクライアントでadvertiseしなければいけない。例えば以下である。

※既にtailscaleクライアントが動作している場合は、いったん「tailscale down」を行っておく。

tailscale up --login-server https://hs.example.com --advertise-exit-node

なお、過去に–advertise-exit-nodeしていて、今回exit-nodeをやめたいという場合は、単純にフラグを省略してもだめである。「前回と同じフラグにしろ」と言われてしまう。このような時は以下を行う。

tailscale up --reset --login-server https://hs.example.com 

ともあれ、–advertise-exit-nodeでexit-nodeの名乗りをあげる。

Headscaleサーバでrouteを設定する

上を行っただけでは何もうまく行かない。まずはHeadscaleサーバ側でそれを認めてあげないといけない。

※くれぐれも、ここではDocker環境で使っているので、必ず「docker exec コンテナ名(headscale)」がついていることに注意。本来は、「headscale nodes list」「headscale routes list」で良い。

nodes listの方は、tailnetに接続しているマシン一覧なのだが、ここにはexit-nodeの情報は一切無い。それは、routes listの方になる。このAdvertised列がexit-nodeに名乗りを上げているかどうかで、Enabledがそれを認めたかどうかになる。

したがって、特定のマシンをexit-nodeにするには、そのルートをenableにしないといけない。

このようにルートのIDを指定してenableしてやると、enabledになるのだが、どういうわけか、一つのマシンについてIPV4とIPV6の両方が表示され、片方をenableするともう一つもenableになるようだ。

ともあれ、これで、exit-node対象のマシンとサーバ側の準備はできた。

クライアント側の設定

ここまでくればクライアント側の設定は簡単だ。

※既にtailscaleクライアントが動作している場合は、いったん「tailscale down」を行う。一般ユーザの場合は「sudo tailscale down」

tailscale up --login-server https://hs.example.com --exit-node=100.64.0.5 --exit-node-allow-lan-access

–exit-nodeは、exit-nodeとするマシンの指定で、これはTailnet上のIPアドレスを指定する。また、–exit-node-allow-lan-accessは、すべての通信をexit-node経由にするものの、自分のLAN内のアクセスはそのままにしておくという意味で、これが無いとLAN内のネットワークプリンタにも接続できなくなってしまう。

あとは、IP確認サイトでも使えば、exit-nodeが設定されていることを確認できる。

Androidクライアントでの指定

サーバ側で一つでもexit-nodeが認められると、Android用クライアントのメニューが変化する。exit-nodeを選択できるようになっている。

ここで同じようにexit-nodeを選択し、LANへのアクセスも許可する。

同じようにIPを確認すると、exit-nodeのIPになっている。

Headscale-UIでの表示

ちなみに、HeadscaleにGUIをつけるで使用したGUIは、exit-nodeに全く対応していないようで、操作もできなければ、表示もできない。