☎️

EdgerouterでTailscaleをつかう

2021/12/18に公開
2

外出先から自宅に接続するために、これまでEdgerouterでL2TP/IPSec VPNを設定していた。ところがAndroid12からはL2TP/IPsec方式はInsecureであるとして、システムのVPN設定項目から削除されてしまった。代替手段としてEdgerouterでIKEv2/IPSec VPN RoadwarriorによるVPNなども検討したが、より簡易的に安全なVPN環境を構築できる方法として、Tailscaleを使ったVPNを検討してみた。

Tailscaleとは

Tailscaleはデバイス同士をP2Pのメッシュネットワークで通信できるようにするVPNサービス。Linux5.6でカーネルレベルでサポートされるようになったWireguardをベースに実装されている。WireguardはUDPベースのVPNプロトコルで、非常に高速かつシンプルな設計という特徴を持つ一方、デバイスが増えるほどコンフィグ管理や認証管理が複雑になりがちという課題があった。

Tailscaleはこの複雑なコンフィグ管理や認証管理をクラウドベースに実装し、驚くほど簡単に自動化している。Tailscaleが提供するのはあくまでこのコンフィグ管理・認証管理周りの設定機能であって、実際のVPN通信はクライアント間のWireguard接続で行われる。また認証はGoogleアカウントやMicrosoftアカウントなどの外部サービスの認証機構を利用している点も、VPN接続までの敷居を下げることにかなり貢献していると思う。接続デバイスが20台までであれば利用は無料。

通常はメッシュネットワークに参加する各デバイスごとに、Tailscaleソフトウェアをインストールするのが基本だ。ただ組み込みデバイスやプリンタなど、Tailscaleをインストールできないデバイスがある環境であったとしても、特定のTailscaleデバイスを”サブネットルーター”として設定することで、メッシュネットワークからサブネットに向けたゲートウェイをつくることができる。


公式サイトより

それではこれから、EdgerouterにTailscaleをインストールし”サブネットルーター”に設定する。

Tailscaleのインストール

TailscaleはGo言語でコーディングされ、様々なOS向けにてクロスコンパイルされたバイナリが用意されている。Edgerouter Lite 3の場合はアーキテクチャがmips64であるため、配布ページからmips64向けバイナリをダウンロードする。Edgerouter Xの場合はmips向けバイナリを選べばOK。

Edgerouterにssh等でアクセスしてから、以下の通りコマンドを入力していく。

sudo bash
mkdir -p /config/tailscale/ /config/scripts/firstboot.d/
curl https://pkgs.tailscale.com/stable/tailscale_1.18.2_mips64.tgz | tar xvz -C /tmp
cp -r /tmp/tailscale_*/* /config/tailscale/

次に/config/scripts/firstboot.d/tailscale.shファイルを作成する。このスクリプトはシステム起動後に毎回実行され、自動的にTailscaleサービスを起動するもの。

cat << EOF > /config/scripts/firstboot.d/tailscale.sh
#!/bin/sh
ln -s /config/tailscale/systemd/tailscaled.service /lib/systemd/system/tailscaled.service
ln -s /config/tailscale/systemd/tailscaled.defaults /etc/default/tailscaled
ln -s /config/tailscale/tailscale /usr/bin/tailscale
ln -s /config/tailscale/tailscaled /usr/sbin/tailscaled
mkdir -p /var/lib/tailscale/
touch /config/auth/tailscaled.state
chmod 0400 /config/auth/tailscaled.state
ln -s /config/auth/tailscaled.state /var/lib/tailscale/tailscaled.state
systemctl enable --now tailscaled
EOF
chmod +x /config/scripts/firstboot.d/tailscale.sh

これでインストールは終わり。それでは早速作成したスクリプトを実行しTailscaleサービスを起動しておこう。

/config/scripts/firstboot.d/tailscale.sh

Tailscaleメッシュネットワークへの参加

Tailscaleのメッシュネットワークに参加しサブネットを他のデバイスに広報する"サブネットルーター"に設定するには、以下のコマンドを実行する。192.168.1.0/24は自分の環境に合わせて指定すること。

tailscale up --advertise-routes=192.168.1.0/24

実行すると認証URLが表示される。ブラウザでURLを開くとGoogleアカウントやMicrosoftアカウントなどの外部サービスなどへのログインを要求されるので、お好きなサービスでログインする。これだけでメッシュネットワークへ参加が完了している。すごく簡単。

それではTailscaleサイトからMachinesを確認してみよう。登録したEdgerouterが一覧に現れているはず。IPの項目には100.x.y.zというアドレスと192.168.1.0/24というサブネットが正しく表示されているだろうか。

100.x.y.zはキャリアグレードNAT用のアドレス帯100.64.0.0/10からTailscaleが払い出したアドレス。メッシュネットワークの中でのそのデバイスに割り当てられたIPv4アドレスに相当する。Edgerouter内ではプログラムによってtailscale0インタフェースが作成されており、このインタフェースに割り当てられている[1]

192.168.1.0/24はEdgerouterから他のTailscaleデバイスに広報されるサブネット。ただし、まだ現時点では広報開始されているわけではない。右端のボタンをクリックすると現れるドロップボックスから、Review route settingsを選ぶ。表示されるウィンドウから192.168.1.0/24のチェックを有効にすれば、いよいよサブネットの広報が開始される。

Edgerouterの設定

Edgerouterの経路テーブルには100.64.0.0/10のエントリがないため、このままでは経路テーブル上のデフォルトゲートウェイからパケットを転送してしまいメッシュネットワークに届かない。

そのため以下のようにEdgerouterで、100.64.0.0/10経路をtailscale0インタフェースから転送するよう静的エントリを経路テーブルを登録する。

set protocols static interface-route 100.64.0.0/10 next-hop-interface tailscale0

また私のようにLAN側インタフェースでPolicy Based Routingを設定している場合、100.64.0.0/10宛ての転送にはこの経路テーブルを選択することを指定しなくてはいけない。

set firewall modify LAN_PBR rule 25 action modify
set firewall modify LAN_PBR rule 25 description 'LAN to Tailscale'
set firewall modify LAN_PBR rule 25 destination address 100.64.0.0/10
set firewall modify LAN_PBR rule 25 modify table main

これでTailscaleデバイスとLAN内の端末との相互接続が可能になった。

Tailscaleクライアントの追加

それではTailscaleのメッシュネットワークに参加したいデバイスごとに、ソフトウェアをインストール・ログインしてみよう。TailscaleのサポートOSはWindows/MAC/Linux/iOS/Androidなので、お好きな端末でどうぞ。
Tailscale接続後192.168.1.0/24内の端末にPingし、無事にReplyが帰ってくればOK。

Tailscaleを実際に使ってみて、ここまで簡単にVPNが作れることにとても感動した。実際にL2TP/IPSecやIKEv2/IPSecより大幅に簡単なうえ、Wireguardによってセキュリティも十分に確保されている。もう個人用VPNはぜんぶこれでいいじゃん、と感じた。

楽しい🎉

脚注
  1. show interfaceで表示される。確認してみよう。 ↩︎

Discussion

hacchthaccht

tailscaleのアップグレード方法:

sudo bash
curl https://pkgs.tailscale.com/stable/tailscale_1.18.2_mips64.tgz | tar xvz -C /tmp
systemctl disable --now tailscaled
cp -r /tmp/tailscale_*/* /config/tailscale/
systemctl enable --now tailscaled
hacchthaccht

tailscaleのアップグレード方法(最新):

sudo tailscale update

だけで最新版がインストールされて再接続してしまったんだけどこれすごくないか。