はじめに
本記事では、Tailscale Serveで自宅環境のFlaskアプリに繋ぐ設定をした際に、ハマってしまったポイントを記載します。
結果的には、Tailscaleへの理解不足によるものだったため、今後同じことがないように備忘録として残します。
環境
- Flaskサーバ
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 12 (bookworm)
Release: 12
Codename: bookworm
$ tailscale version
1.76.1
tailscale commit: 24929f6b611127cdc40d45ef40d75c6afc1fcc4c
other commit: 5e54dcf15265cb83e84e617a5a7e0c1b013c61c7
go version: go1.23.1
- Flaskアプリに繋ぐデバイス
- Windows11
- Android 等のTailscaleをインストールしたデバイス
【ハマったこと①】Tailscale Serve設定後にFlaskを起動すると「Address already in use」と表示される
Tailscaleに接続しているデバイス内(Teilnet内)でFlaskアプリに繋ぐため、Flaskサーバで以下の通りTailscale Serveを起動しました。
$ sudo tailscale serve --https=5000 --bg http://127.0.0.1:5000
その後、Flaskを起動すると「Addess already in use」と表示されてしまいました。
$ flask run -h 0.0.0.0 -p 5000
Address already in use
Port 5000 is in use by another program. Either identify and stop that program, or start the server with a different port.
flask runのエラー原因としては、既に5000番ポートが利用されていたからになります。
他に5000番ポートが使われるのは、直前に実行したtailscale serveしかないかなと思い、改めてTailscale Serveの仕組みについて確認したところ、以下の挙動をすることがわかりました。
- Tailscale Serveをとは、Tailnet上の他のデバイスからのトラフィックを、デバイス上のローカルサービスにルーティングする仕組み。
- Tailscale Serveを起動すると、指定したポートをオープンし、他のデバイスからの接続を待機するようになる。つまり、tailscale serveコマンドで指定したポートはTailscaleによって利用(消費)される。(psやlsofコマンドで確認できる)
$ sudo lsof -i :5000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tailscale 6251 root 23u IPv6 396596 0t0 TCP [xxxx:xxxx:xxxx::xxxx:xxxx]:5000 (LISTEN)
tailscale 6251 root 24u IPv4 396602 0t0 TCP xxx.xxx.ts.net:5000 (LISTEN)
- これにより、Tailnet内のデバイスは、Tailscale Serveで開かれたポートに対して接続できるようになり、その後バックエンドに指定されたサービスにリクエストがプロキシされる。
Tailscale Serveがリバースプロキシのような仕組みだと見知っていたのですが、正しく挙動を理解できていませんでした…
そのため、以下のような感じで待機するポートとプロキシ先となるポートを別にしないといけませんでした。
$ sudo tailscale serve --https=15000 --bg http://127.0.0.1:5000
【ハマったこと②】HTTPS 10080番で接続すると「ERR_UNSAFE_PORT」と表示される
ハマったこと①の続きで、待機するポートを10080番に変更してみました。
$ sudo tailscale serve --https=10080 --bg http://127.0.0.1:5000
その後、flask runも上手く動いたので接続確認をしたところ、「ERR_UNSAFE_PORT」と表示され、接続できませんでした。
こちらはTailscaleのエラーではなく、Google Chromeの仕様によるもので、2021年9月にリリースされたGoogle Chrome 91以降では、10080番ポートがbad_port扱いとなったことによることが原因でした。
参考情報: Web Application開発に10080番ポートは使ってはいけない(https://zenn.dev/ota42y/articles/127fee3353bafe)
80、443番に変わるWebアプリ用のポートとして、10080番が一番に思いついたので利用してみたのですが、NGポートとは知りませんでした…
ということで、結局は12345番のポートを利用することにしました。
$ sudo tailscale serve --https=12345 --bg http://127.0.0.1:5000
最後に
思いがけずハマってしまいましたが、無事に自宅環境のFlaskアプリにアクセスできるようになりました。改めてTailscaleは便利だなと思いました。