Tailscaleでオンプレサーバーを匿名公開 ~リバースプロキシで自宅サーバーをIP非公開で運営 SSL証明書も不要!?~
こんにちはRcatです。
自宅のサーバーをうまい具合に公開できないかなぁと考えていた今日のこのごろ。Tailscaleというものを見つけましたので実際に使ってみようと思います。

はじめに
利用規約
情報や作品の活用時は事前に利用規約をご確認ください。
コメントについて
利用規約のガイドラインを確認の上コメントしてください。
則っていないコメントは削除します。
概要
Tailscaleとは
VPNサービスのようです。
ですが様々な機能があり、身内だけでつながれるネットワークを作るだけでなく、httpsのリバースプロキシとしても使えてしまうらしい。
というわけで下記構成でオンプレサーバーをIPアドレス非公開かつポート開放無しかつSSL証明書なしの状態で公開できる。神かよ
Tailscale(HTTPSリバースプロキシ)
↓VPN
オンプレPC
↓Docker
WEBサーバー
とりあえず試してみる
注意事項
ここで紹介する内容は、Rcatが試行錯誤しうまくいった結果です。
もしかしたら要らない手順が含まれる可能性があります。
うまくいかなくても質問は受けられません。
アカウント設定
アカウント作成
まずは公式からアカウントを作ります。
Googleアカウントで作れるっぽいのでサクサクです
なお、Chromeの日本語に翻訳機能は使用してはいけません。
選択肢が日本語になった状態で操作するとエラーになって入力がパーになります。
Access controlsの編集
先に公開とタグの設定をしてしまいます
JSONの方に切り替えてください

こんな感じのところがあるのでコメントを解除してtag:<好きな値>にします。
// Define the tags which can be applied to devices and by which users.
"tagOwners": {
"tag:server": ["autogroup:admin"],
},少し下にこんなところがあるので、デフォルトを複製して作ったタグの名前で追加します
"nodeAttrs": [
{
// Funnel policy, which lets tailnet members control Funnel
// for their own devices.
// Learn more at https://tailscale.com/kb/1223/tailscale-funnel/
"target": ["autogroup:member"],
"attr": ["funnel"],
},
{
"target": ["tag:server"],
"attr": ["funnel"],
},
],キーの発行
登録後、コマンドだと簡単に端末登録できるらしいのですが、今回はDockerなので、認証キーを発行します。
設定 => 個人設定 => Keys
新規作成し、再利用可能はお好きにチェック。
一番下のタグのところでさっき作ったタグを割り当て。
これをやることで有効期限が無期限になるらしい


キーをコピーしたらこれで設定は終わり。
環境構築
というわけで、とりあえず試します。
サンドボックス的な感じでDockerを使います。
すでにイメージはあるようなので使わせてもらいます
まずはプル
docker pull tailscale/tailscale:stableデータの構成はこんな感じ
順に説明します

docker-composeの設定ファイル
データ用にtailscale-dataフォルダを用意してください。空でOK

初回は上のappセクションはなくてOKです。
これは同時にWEBサーバーもコンテナにしますという設定なので…
ちなみにこちらで配布しているものをそのままデプロイしてます。
そのままだと立ち上がらないので少し手を入れてますが…。この記事の後に更新しますね。
書き換えるのはホスト名とキーですね
ホスト名はたぶん自由。キーは先ほどのをコピペ。いやな人は.env作る。
config/funnel.json
WEBとして外部に公開する設定です。
なお、ホスト名+ドメインのことは一度マシンが登録されないと出てこないので現時点では書けません。
ファイルが読めないと公開状態にならないだけなので、まずは空にして、登録できたら記入しましょう。
場所はマシン詳細の"Full domain"の部分です。

できたらいつものをたたいてコンテナを作成&Run
docker compose up -d --build完了後、管理画面のデバイスを確認していればOK

うまく機器が登録された場合、funnelの設定にfulldomainを書き込んで再起動すれば公開されるはず。
実際は羽陽曲折あったのでこの手順ではないですが大体はあってるはず。
WEBサーバーと連携して公開してみる
docker composeの上にあったappのセクションですね
今回は仮に自作のFlaskテンプレートを公開してみます。どうせ誰もみないし。
Dockerfile
Pythonなので、イメージはPython、ライブラリを入れて起動するだけ。
今回はHTTPSの443から来たものをHTTPの8000ポートに転送するという設定なので、バインドは8000にします。

この状態で再起動(要ビルド)を掛けると、Tailscale経由で外からアクセスができます。
ちなみにアドレスはコピーしたfulldomainになります。
こんな感じです。本当に公開されちゃいました…w

うまく公開されないとき
下記コマンドで公開されているか見ましょう
下記のように出てくれば公開中です。警告が出ていたり、イントラネットOnlyだと公開されていません。
$ docker compose exec tailscale tailscale funnel status
# Funnel on:
# - https://rcat-xxxxxxxxxxx.ts.net
https://rcat-xxxxxxxxxxxx.ts.net (Funnel on)
|-- / proxy http://127.0.0.1:8000
まとめ
今回はVPNでWEBサーバーを公開できるTailscaleを試してみました。
無料でこれができるのはすごいですね。
あ、無料のVPS解約しようかなw
配布システムもオンプレ処理ができれば幅が広がりそう(可用性は下がるが)
というわけでちょっとアイディアがあるので、メンバーシップのおまけという形で一個サーバー立ててみようと思います。
来月も継続すれば日の目見るかも?
ではまたお会いしましょう
リンク集
感想投稿フォーム
コメントは公開で恥ずかしい!! Rcatだけに送りたい人向け
ミニPCにLinuxをインストール
おまけ
ここから先は
情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。
