メインコンテンツへスキップ
見出し画像

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をインストール


    おまけ

     
     
    モノづくりが趣味。 "売ってないなら自分で作ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワーク 全部やります。 記事執筆はAI不使用。 ご連絡や利用規約はプロフィール記事参照。

    あなたへのおすすめ