OpenWrt で縮小版 Tailscale を使用する

## この記事を書いた目的

以下の記事に従って、[縮小版 Tailscale (約 5MB)](https://github.com/Admonstrator/glinet-tailscale-updater/releases/latest)を使用したところ、問題なく動作したので使用手順を説明します。

https://upsangel.com/openwrt/openwrt-tailscale-update/

https://github.com/Admonstrator/glinet-tailscale-updater/

👉 `opkg install tailscale` でインストールされるファイルに比べ、サイズが格段に小さくなります。🎉

👉 よりタイトな環境での Tailscale の導入記事「[フラッシュメモリの空き容量が 10MB しかない OpenWrt で Tailscale を使用する](https://qiita.com/Bacalhau/items/26bf74627532275f8616)」を書きました。🎉

## 使用手順

### 1. 標準版 Tailscale のインストール

#### 1. 必要なパッケージをインストール

```shell
opkg update
opkg install tailscale
```

`OpenWrt 22.03` 以降であれば以下のパッケージを追加

```shell
opkg install iptables-nft kmod-nft-nat \
  kmod-ipt-conntrack kmod-ipt-conntrack-extra kmod-ipt-conntrack-label
```

👉 2024/10/06 に [OpenWrt の Tailscale ページ](https://openwrt.org/docs/guide-user/services/vpn/tailscale/start)が更新され、それ以前は `opkg install iptables-nft` だけだったものが上記内容に変更されています。

https://openwrt.org/docs/guide-user/services/vpn/tailscale/start?do=revisions

`conntrack` 関連のパッケージが追加された理由はこちら -> [issue #13859](https://github.com/openwrt/openwrt/issues/13859)

#### 2. `Interface` と `Firewall` の追加

以下のページを参照

https://openwrt.org/docs/guide-user/services/vpn/tailscale/start

日本語の方が良い場合は以下のページを参照

https://servercan.net/blog/2024/08/openwrt%e3%81%b8tailscale-vpn%e3%82%92%e5%85%a5%e3%82%8c%e3%81%a6%e6%8b%a0%e7%82%b9%e6%8e%a5%e7%b6%9a%e3%82%84%e3%82%b8%e3%82%aa%e3%83%96%e3%83%ad%e3%83%83%e3%82%af%e5%9b%9e%e9%81%bf%e3%82%b2%e3%83%bc/

<details>
<summary>👉 私の /etc/config での設定</summary>

1. /etc/config/network での追加部分

   ```conf:/etc/config/network
   config interface 'tailscale'
      option proto 'none'
      option device 'tailscale0'
   ```

1. /etc/config/firewall での追加部分

   Subnet Router として使うため、以下の設定にしています。

   ```conf:/etc/config/firewall
   config rule
      option name 'Allow-Tailscale'
      option src '*'
      option target 'ACCEPT'
      option proto 'udp'
      option dest_port '41641'

   config zone
      option name 'tailscale'
      option input 'ACCEPT'
      option output 'ACCEPT'
      option forward 'ACCEPT'
      option masq '1'
      option mtu_fix '1'
      list network 'tailscale'

   config forwarding
      option src 'tailscale'
      option dest 'lan'

   config forwarding
      option src 'lan'
      option dest 'tailscale'

   config forwarding
      option src 'tailscale'
      option dest 'wan'
   ```

</details>

### 2. 縮小版 Tailscale への置き換え

#### `xz` のインストール

```shell
opkg update
opkg install xz
```

👉 こんな事件もありましたね。。。

https://wired.jp/article/jia-tan-xz-backdoor/

#### ファイルのダウンロードと置き換え

- **補足 1.**  
  64-bit ARM CPU 専用ですが、ダウンロードするファイル( `tailscaled-linux-arm64` の部分)を変更すれば他のプラットフォームでも使用できます。
- **補足 2.**  
  アップデートスクリプトとしても使用できます。

```shell:/etc/config/tailscale-tiny.sh
service tailscale stop
sleep 5

wget -O /tmp/tailscaled \
  https://github.com/Admonstrator/glinet-tailscale-updater/releases/latest/download/tailscaled-linux-arm64

mv /tmp/tailscaled /usr/sbin/tailscaled
ln -svf /usr/sbin/tailscaled /usr/sbin/tailscale
chmod +x /usr/sbin/tailscaled

service tailscale start
tailscale set --auto-update=false
```

👉 元々のスクリプトはこちらです。

https://github.com/Admonstrator/glinet-tailscale-updater/blob/main/update-tailscale.sh

## 使用するバイナリの安全性

使用するバイナリの安全性を検証したい場合は、以下のページでビルドの内容を確認してください。

https://github.com/Admonstrator/glinet-tailscale-updater/blob/main/.github/workflows/build-tailscale.yaml