🔓

GL.iNet ルーターで Tailscale SSH を有効にする

2023/03/27に公開

ども、takiponeです。
GL.iNetルーターの一部機種でTailscaleがサポートされました。以下の記事で手順を解説しています。

https://zenn.dev/takipone/articles/fb6f21422a6909

TailscaleにはTailscaleの認証をSSHと連携するTailscale SSHという機能があります。これをGL.iNetルーターで利用するためにひと手間必要だったので、その様子をご紹介します。

Tailscaleデバイスの設定

Tailscaleデバイスの設定は以下に分類できます。

  1. 起動設定
  2. 実行時設定

1.はエージェントが使用するポート番号やログなどエージェント自身の動作に関する設定、2.はTailscaleの機能に関する設定が多いです。今回のTailscale SSHは2.実行時設定にあたり、以下のコマンドで有効化します。

tailscale set --ssh

実行時設定は一度設定すればデバイスの状態に関わらず維持されるのですが、今回のTailscale SSHの有効化はルーターを再起動する度に無効に戻ってしまう事象に悩まされました。解決方法としては、/usr/bin/gl_tailscaleファイルの73行目を改変して対応できます。

/usr/bin/gl_tailscale
73:                 /usr/sbin/tailscale up --reset $param --timeout 3s

--resetオプションを削除するか、--sshオプションを明示的に追加するかの2通りです。このファイルはパッケージシステム管理下のため、パッケージのバージョンアップ時には元の記述にリセットされる恐れがあります。Tailscaleの管理画面でSSHマークが外れたことに気づいたら、再編集しましょう。

おまけ: GL.iNet ルーターの Tailscale 構成

GL.iNetルーターのTailscale構成は、GL.iNetのWeb管理画面から設定するためにTailscaleエージェント本体の他に以下のパッケージが追加されています。

  • gl-sdk4-tailscale
  • gl-sdk4-ui-tailscaleview

上記/usr/bin/gl_tailscaleファイルはgl-sdk4-tailscaleパッケージに含まれます。以下のコマンドで確認できます。

# opkg files gl-sdk4-tailscale
Package gl-sdk4-tailscale (git-2023.049.06122-e969c04-1) is installed on root and has the following files:
/usr/bin/gl_tailscale
/usr/lib/oui-httpd/rpc/tailscale
/etc/hotplug.d/net/19-tailscale-net
/etc/hotplug.d/iface/19-tailscale-iface

/usr/bin/gl_tailscaleファイルが呼び出されるのは/etc/hotplug.d/*の2ファイルからで、今回のtailscale upの実行はネットワークインターフェースの活性時に毎回実行されるようです。

/etc/hotplug.d/iface/19-tailscale-iface
#!/bin/sh

enabled=$(uci -q get tailscale.settings.enabled)

if [ "$ACTION" == "ifup" ] && [ "$enabled" == "1" ]; then
	/usr/bin/gl_tailscale restart
elif [ "$enabled" == "0" ]; then
	/etc/init.d/tailscale down
fi

restartの処理ではGL.iNetのWeb管理画面から設定できるSubnet RouterとExit Nodeを反映させる処理になっています。tailscale up --resetになっていたのは、それらの設定をオフにしたときに既存の設定に依らず無効化する意図だったようです。Web管理画面以外の設定を勝手にやるなよなという開発者の方の冷たい視線を感じつつも、Tailscaleにはせっかく豊富な機能がたくさんあるんだから気兼ねなく使わせていただきたいところかなと :P

ちなみにもうひとつのファイルからも同じ/usr/bin/gl_tailscaleが呼ばれるのですが、こちらはTailnetの100.64.0.0/10へのルーティング追加でした。

/etc/hotplug.d/net/19-tailscale-net
#!/bin/sh

if [ "$INTERFACE" == "tailscale0" ] && [ "$ACTION" == "add" ];then
	/usr/bin/gl_tailscale  set_route &
fi

なぜバックグラウンド実行なのか不思議だったのですが、↓のset_routeの処理でsleep 5しているのを同期的に待ちたくなかったのかもしれないですね。

/usr/bin/gl_tailscale
#!/bin/sh

action="$1"

if [ "$action" == "set_route" ];then
    sleep 5
    ip route add 100.64.0.0/10 dev tailscale0
fi
:(以下restartのコード)

Discussion