GL.iNet ルーターで Tailscale SSH を有効にする
ども、takiponeです。
GL.iNetルーターの一部機種でTailscaleがサポートされました。以下の記事で手順を解説しています。
TailscaleにはTailscaleの認証をSSHと連携するTailscale SSHという機能があります。これをGL.iNetルーターで利用するためにひと手間必要だったので、その様子をご紹介します。
Tailscaleデバイスの設定
Tailscaleデバイスの設定は以下に分類できます。
- 起動設定
- 実行時設定
1.はエージェントが使用するポート番号やログなどエージェント自身の動作に関する設定、2.はTailscaleの機能に関する設定が多いです。今回のTailscale SSHは2.実行時設定にあたり、以下のコマンドで有効化します。
tailscale set --ssh
実行時設定は一度設定すればデバイスの状態に関わらず維持されるのですが、今回のTailscale SSHの有効化はルーターを再起動する度に無効に戻ってしまう事象に悩まされました。解決方法としては、/usr/bin/gl_tailscale
ファイルの73行目を改変して対応できます。
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
の実行はネットワークインターフェースの活性時に毎回実行されるようです。
#!/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
へのルーティング追加でした。
#!/bin/sh
if [ "$INTERFACE" == "tailscale0" ] && [ "$ACTION" == "add" ];then
/usr/bin/gl_tailscale set_route &
fi
なぜバックグラウンド実行なのか不思議だったのですが、↓のset_route
の処理でsleep 5
しているのを同期的に待ちたくなかったのかもしれないですね。
#!/bin/sh
action="$1"
if [ "$action" == "set_route" ];then
sleep 5
ip route add 100.64.0.0/10 dev tailscale0
fi
:(以下restartのコード)
Discussion