はじめに

本記事では、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」と表示され、接続できませんでした。 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は便利だなと思いました。