工事現場備忘録

私の備忘録を私がどう書こうが私の自由であるとの信念に基づき自由に書いています

グローバルIP持ってないけど自宅サーバを外部公開したい in2024October

↓を今やるならでやりなおす.

koji-genba.hateblo.jp

変更点は主に下記2点

ってことでやっていこう.

目次(各項目リンク)

概要

出来上がるもののイメージが下記図.
GoogleCloudでVM立ててtailscale入れて自宅マシンとvpn接続する.
あとはGoogleCloudで通信受けてnginxでプロキシ.

構成図(雑)

主な作業の流れは以下.

自宅側

  1. ポート開けたり
  2. tailscaleセットアップ&接続

GoogleCloud側

  1. インスタンス作成
  2. ポート開け(GoogleCloud側ファイアウォール)
  3. (インスタンス初期セットアップ)
  4. tailscaleセットアップ&接続
  5. nginxでプロキシ構成

作業

tailscaleアカウント用意

もしtailscaleのアカウントを持っていないなら下記リンク右上[Get started]から適当なアカウントでログインし利用できるようにしておく.
tailscaleは外部アカウントでの認証しかやってないので,tailscaleのアカウント作成ってよりGoogleアカウント等々との紐づけって感じ.
tailscale.com

AdminConsole(下記画像のような感じの画面)まで到達できるようになればおk.

tailscale AdminConsole

自宅マシン側

tailscale.com 上記リンクから公開したいマシンのOSに合わせて作業し,接続までする.
Linuxであれば以下. tailscale upすると認証用のURLがコンソールに表示されるので,適当なブラウザ(別マシンからでもよい)で開いてログインし認証する.

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

windowsであればインストールしてタスクバーアイコンからあとは流れで.
tailscaleのAdminConsoleのMachinesに接続したマシンが表示されていれば接続完了.

Google Cloud側作業

GoogleCloudであることに理由はないので,AWSでもAzureでも他VPSでも好きな方法をとってもらって構わない.が今回はGoogleCloudで説明させてもらう.

1.インスタンス作成

安く済ませたいので無料枠を利用し,コスト0でインスタンスグローバルIPを用意する.

GoogleCloud Compute Engine (VM)の無料枠について

GoogleCloud Compute Engine (VM)の無料枠の条件はおおよそ下記.

  • us-west1, us-central1, us-east1のいずれかのリージョン
  • e2-micro インスタンス
  • 標準永続ディスク(上限30GB)
  • 通信下り1GB/月

これを満たすと1インスタンス/月は無料で使える(2024/10/26時点).IPアドレスに対する課金は無いとのこと.詳細は下記リンク先参照.
Google Cloud の無料プログラム  |  Google Cloud Free Program e2-microのスペックは下記リンク先
雑に言うと0.25vCPU, メモリ1GB.
Compute Engine の汎用マシン ファミリー  |  Compute Engine Documentation  |  Google Cloud

~GoogleCloud Compute Engine (VM)の無料枠について ここまで~

適当なGoogleアカウントでログインして以下へ
https://cloud.google.com/
ぽちぽちしてるとこの画面になると思うので画面上[プロジェクトの選択]→[新しいプロジェクト],参考画像に余計なプロジェクトシャットダウン中表示があるが気にしてはいけない.

GoogleCloud初期画面

プロジェクト名は適当でいい,場所も[組織なし]のままで問題なし.入力したら[作成].プロジェクト選択画面に戻ると思うので,作成したプロジェクトを選択.

プロジェクト作成画面

ここまで終われば画像のように[選択中のプロジェクト]に作成したプロジェクトが表示された状態のはず.そしたら[VMを作成]

プロジェクト選択された状態

おそらくこのようになるので[有効にする]して完了待ち.このあとどうなるのかちょっと忘れたけど,トップに戻れば間違いないので戻り,再度[VMを作成]へ.

ComputeEngineAPIを有効化するやつ

そしたらここからインスタンス作成作業.間違えるとお金がチャリンチャリンしちゃうので確実に確認しながら進めるように.
インスタント名は適当に好みでおk. リージョンは無料の中でも日本に近いus-west1(オレゴン)を選択.ゾーンはabcどこでもいい.他はノータッチ.

VMの基本設定画面

次にマシンの構成.E2-microを指定.

マシンの構成画面

次にOSとストレージ.[変更]から画像の画面へ.OSは特に指定ないが,DebianとかUbuntuとかRockyLinux(RHEL互換)のような無料で使えるものにすること.今回はUbuntu24.02LTSで進める.
ブートディスクの種類は標準永続ディスクを指定. サイズは30GB以下にすること.

OSとストレージ設定画面

次にネットワーキング.
[ネットワークインターフェース]の[default]を展開し,[外部IPアドレス]の項を選択.[静的外部IPアドレスを予約]を選択し,適当に名付けて作成.
他の項目はノータッチ.

ネットワーキング設定画面

ここまでやったら画面下の[作成]をクリック.インスタンスが生成されたらこのような画面になる.

VM作成後一覧画面

2.ポート開け(GoogleCloud側ファイアウォール)

公開したいサービスで利用するポートを開ける. まずGoogleCloudのファイアウォールに対して作業.先ほどのインスタンス一覧の画面から生成されたインスタンスを選択し,少々下へ.
[ネットワークインターフェース]のところの,[ネットワーク]の[default]を選択.(下記画像紫文字部分)

インスタンス詳細画面 ネットワーク部分

上タブを[ファイアウォール]に切り替え,[ファイアウォールルールを追加]を選択.

VPCネットワーク画面

あとは適当に設定して[作成]をクリック
多分設定項目はこれくらい?

  • 名前を適当に設定
  • トラフィックの方向 : 上り(内向き)
  • 一致した時のアクション : 許可
  • ソースフィルタ : IPv4 範囲
  • 送信元IPv4範囲 : 適当にいい感じに,特段事情なければ0.0.0.0/0(全て)
  • プロトコルとポート : 必要なものを指定

ファイアウォール設定

3.(インスタンス初期セットアップ)

インスタンス入ってアップデートとかsshのポート変えたりとかファイアウォール有効化して必要なポート開けるとかセキュリティ固めるとか各自好みで必要な作業諸々やってください.
インスタンス入るときは一覧画面にある[SSH]をポチるとブラウザ上でいい感じに接続してくれるのでおすすめ.22以外のポートでsshするときは横の矢印のとこからカスタムポート的なやつやればできる.
あと気になる人はGoogleCloud側ファイアウォールも固めておいてください.デフォだとssh-22とかrdp-3389とか開いてて物騒なので.

4. tailscaleセットアップ&接続

ローカル側マシンと同様.

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

tailscaleのAdminConsoleのMachinesに接続したインスタンスが表示されていれば接続完了.
この時点でローカル側マシンとクラウド上のインスタンスはtailscaleで接続されているはずだから,表示されているアドレスを使ってpingとか打って疎通を確認しておく.

5. nginxでプロキシ構成

通信を中継するためのnginxをセットアップする.

ビルド&インストール

aptとかdnfでインストールされるやつではモジュールだかなんだか足りないらしく動かんのでビルドするところから.
以下ではGoogleCloud上でビルドとかしてるけど,別にローカルでビルドして持って行ってもいい.そのほうが早いし環境きれいだし.

まず以下からnginxの一番新しいやつ確認.2024/10/26時点ではnginx-1.27.2なのでそのつもりで書く.違う場合は適宜読み替えて. nginx.org

そしたら下記のように前提等々インストールして,ビルド&インストール.
configureでエラー出たら都度いい感じに対応してください.

※debian系
sudo apt install clang libpcre3-dev zlib1g-dev make
※RHEL系
sudo dnf install clang pcre-devel zlib-devel make

wget http://nginx.org/download/nginx-1.27.2.tar.gz
tar zxvf nginx-1.27.2.tar.gz
cd nginx-1.27.2
./configure --with-stream --sbin-path=/usr/sbin/nginx --prefix=/etc/nginx
make && sudo make install

ついでにsystemctlで動かせるようにする.

sudo nano /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/conf/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
コンフィグ記述

次にnginxのコンフィグ記述.

sudo rm /etc/nginx/conf/nginx.conf
sudo nano /etc/nginx/conf/nginx.conf

記述内容は,以下のような状態を想定すると,

  • ローカル側マシンtailscale上のアドレス : 100.99.100.100
  • 転送対象 : udp 19132

こうなる

worker_processes  1;

pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}
stream {
    upstream localServer {
        server 100.99.100.100:19132;
    }
    server {
        listen     19132 udp;
        proxy_pass localServer;
    }
}

以下のような状態を想定すると,

  • ローカル側マシンtailscale上のアドレス : 100.99.100.100
  • 転送対象 : tcp 25565

こうなる

worker_processes  1;

pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}
stream {
    upstream localServer {
        server 100.99.100.100:25565;
    }
    server {
        listen     25565;
        proxy_pass localServer;
    }
}

書いたら以下コマンドでエラー出ないかチェック.構文エラーあったら出るので修正.

sudo nginx -t

問題ない場合の出力.

nginx: the configuration file /etc/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/conf/nginx.conf test is successful
動かす

準備終わったので動かす

sudo systemctl daemon-reload
sudo systemctl enable --now nginx

sudo systemctl status nginxしてActive: active (running)になってれば問題なし.
あとはそれぞれ公開したいサービスがGoogleCloudで割り振られたグローバルIPで正常にアクセスできるか確認して問題なければ終了.グローバルIPは下記画像赤塗りつぶし部分に書いてある.

静的IPアドレスの記載場所

接続不良時確認項目

そんな面倒なことしてないしこれくらいじゃね