WZR-HP-AG300H + OpenWrt + Tailscaleによる安全な通信網確保

## はじめに
もともとバッファロールータ（WZR-HP-AG300H）にTailscaleを導入し、出張先などで自宅VPNにつなげて快適で安全なネットサーフィンを楽しんでいました。最近安くWZR-HP-AG300Hを仕入れたこと＆今週家族旅行に行くので、ホテル先でも自宅のようにネットサーフィンを楽しんでほしいと思い、最新のOpenWrtとTailscaleを導入しておこうかなと思ったのがきっかけです。

以前はサクッと導入できたのですが、最新になると色々知らなかったことが分かったのでメモとして残します。

## ハマったこと＆今後気を付けること
1. （基本）WZR-HP-AG300HのFirmwareをOpenWrtに書き換えた後は無線LANは有効になっていないので、有線LANケーブル必須
1. 有線LANのIPを変更しリブートした後、物理的に有線LANケーブルを抜きさしする
1. Tailscaleをインストールする際、最新のOpenWrt(OpenWrt23.03～）の場合は以下のモジュールが必要
    - iptables-nft
1. GUIからTailscaleをインストールを実行した結果、`opkg install SyntaxError: Unexpected end of JSON input`というエラーがでてインストールできない場合は一度リブートしてSSHからインストールする
```bash
opkg update
opkg install tailscale
opkg install iptables-nft
reboot
```
1. 最新のTailscaleを導入すると/root以下がパンパンになってファイルシステムが強制的にRead-Onlyになってしまう。そしてなぜかremountできない。つまり、最新のTailscaleを導入するには、OpenWrtを初期化してからTailscaleインストール→Tailscaleを最新にするという手順が必要

## 最新Tailscaleの導入方法
以下の記事を参考に入れてみました。

https://qiita.com/myurar1a/items/50f39db87f27dca23d1a

しかし、WZR-HP-AG300Hの容量は十分でないため、一度に解凍できないことがわかりました。そのため、↓のようにコードを修正し、tarの中で必要なものだけを解凍→コピー→削除という処理に変更することで対応しました。
コメントアウトしているところが修正部分です。
```bash
#!/bin/ash
arch=arm64
start_opt="--accept-routes --advertise-exit-node --advertise-routes=192.168.1.0/24 --netfilter-mode=off --stateful-filtering"

check() {
    local net_ver
    net_ver=$1

    if curl -s --head https://pkgs.tailscale.com/stable/tailscale_"$net_ver"_"$arch".tgz | grep -q 'HTTP/.* 200'; then
        echo true
    else
        echo false
    fi
}

uninstall() {
    echo
    echo Uninstalling...
    tailscale down
    service tailscale stop
    rm /usr/sbin/tailscale /usr/sbin/tailscaled
    echo Uninstall done!
}

update() {
    local net_ver
    net_ver=$1

    echo
    echo Downloading Tailscale $net_ver...
    curl -L https://pkgs.tailscale.com/stable/tailscale_"$net_ver"_$arch.tgz \
    -o /tmp/tailscale_"$net_ver"_$arch.tgz
    
    echo
    echo Extracting and Installing...
    #tar x -zvf /tmp/tailscale_"$net_ver"_$arch.tgz -C /tmp
    #rm /tmp/tailscale_"$net_ver"_$arch.tgz
    
    tar zfx /tmp/tailscale_"$net_ver"_$arch.tgz tailscale_"$net_ver"_$arch/tailscale -C /tmp
    cp /tmp/tailscale_"$net_ver"_$arch/tailscale /usr/sbin
    rm -r /tmp/tailscale_"$net_ver"_$arch

    tar zfx /tmp/tailscale_"$net_ver"_$arch.tgz tailscale_"$net_ver"_$arch/tailscaled -C /tmp
    cp /tmp/tailscale_"$net_ver"_$arch/tailscaled /usr/sbin
    rm -r /tmp/tailscale_"$net_ver"_$arch

    #echo
    #echo Installing...
    #cp /tmp/tailscale_"$net_ver"_$arch/tailscale \
    #/tmp/tailscale_"$net_ver"_$arch/tailscaled \
    #/usr/sbin
    #rm -r /tmp/tailscale_"$net_ver"_$arch
    
    rm /tmp/tailscale_"$net_ver"_$arch.tgz
    echo Install done!
} 

start() {
    echo
    echo Service starting...
    service tailscale start
    tailscale up $start_opt
}

main() {
    local local_ver net_ver DL
    local_ver=$(tailscale version | sed -n 1p)
    echo
    echo Current version: $local_ver
    net_ver=$(curl -s https://api.github.com/repos/tailscale/tailscale/releases | awk '/"name":/ { print $2 }' | head -1 | sed -e 's/[^0-9.]//g')
    echo Latest version: $net_ver

    if [[ $local_ver != $net_ver ]]; then
        echo Found new release!
        echo
        echo Checking downloadable...
        DL=$(check $net_ver)
        echo Downloadable: $DL

        if [[ $DL == true ]]; then
            uninstall
            update $net_ver
            start
            echo
            echo Update Complete!
            echo
        else
            echo
            echo Can\'t download latest version.
            echo
        fi
    else
        echo
        echo Already installed latest version!
        echo
    fi
}

main
```

## 出張先から常に自宅からのアクセスにしたい場合
まぁ、よくある話ですが、例えばアメリカに出張して、Amazon Prime Videoとかアメリカでアクセスしちゃうと日本側にいる家族が「あれ？」ってなっちゃうやつですね（遭遇したことがないのでどういう状況なのかわからないけど、利用できなくなる感じを訴えられた）。なので、アメリカから日本（自宅）を経由してAmazon Prive Videoにアクセスしたい場合などの話です。

やり方は簡単で、Tailscaleクライアントであるルータから自宅のTailscaleのExit Nodeを利用する設定にするだけです。具体的には、ルータにSSH接続して、↓のコマンドを打つだけです。<font color="red">注意点はすでにExit Nodeとして設定していた場合、↓のようなExit Nodeを利用する設定はできない</font>のでご注意ください。()内の'--exit-node-allow-lan-access=true'は自身の環境に合わせて設定してください。

```bash
tailscale set --exit-node=<IP | Host name> (--exit-node-allow-lan-access=true)
```

## ホテルでの使用感
旅行中のホテルでの使用感です。結論はとりあえず持って行っておくのが無難です。

### ホテルでの問題点
Wifiが主流になったことなのかどうかわからないですが、以下の問題が発生。
1. ホテル側Wifiつながりにくい
1. やっとつながってもブチブチ接続が切れる

### 対策
「自前ルータ→有線LAN接続」にしてホテルWifiを経由しない

これによって、昨今有線LANを利用する人が少ないのか、とっても快適なインターネット利用（主に娘のYoutube）ができました。

### 所感
これまではここまで劣悪な環境はなかったので、自前ルーターの恩恵はほんの一部でした。なのでセキュリティ目的や自宅ファイルサーバへの接続など以外での利用は無用の長物感がありましたが、今回の家族旅行では上記問題があったので、こういったリスク回避に役立つなぁ～って思いました。

ちなみにKindle FireからOpenWrtの2.4GHz帯域に接続しようと思ったところ、まったくWifiのネットワーク検索に引っかからなかったので、もしかしてOpenWrtの設定の問題かな？というところで悩んだ結果、↓の記事があったので6チャネルに設定したらKindle FireからSSIDがキャッチできるようになりました。
以前こんなに見えなかったかな？dd-wrt自体はってどうだったかなぁ～などと思いつつ、とりあえず解決策があったので良かったです。

https://qiita.com/Bacalhau/items/4fb623294c498f4fb20d