グローバルIP持ってないけど自宅サーバを外部公開したい in2024October
↓を今やるならでやりなおす.
変更点は主に下記2点
ってことでやっていこう.
目次(各項目リンク)
概要
出来上がるもののイメージが下記図.
GoogleCloudでVM立ててtailscale入れて自宅マシンとvpn接続する.
あとはGoogleCloudで通信受けてnginxでプロキシ.

主な作業の流れは以下.
自宅側
- ポート開けたり
- tailscaleセットアップ&接続
GoogleCloud側
作業
tailscaleアカウント用意
もしtailscaleのアカウントを持っていないなら下記リンク右上[Get started]から適当なアカウントでログインし利用できるようにしておく.
tailscaleは外部アカウントでの認証しかやってないので,tailscaleのアカウント作成ってよりGoogleアカウント等々との紐づけって感じ.
tailscale.com
AdminConsole(下記画像のような感じの画面)まで到達できるようになればおk.

自宅マシン側
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/
ぽちぽちしてるとこの画面になると思うので画面上[プロジェクトの選択]→[新しいプロジェクト],参考画像に余計なプロジェクトシャットダウン中表示があるが気にしてはいけない.

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

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

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

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

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

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

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



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

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

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

あとは適当に設定して[作成]をクリック
多分設定項目はこれくらい?
- 名前を適当に設定
- トラフィックの方向 : 上り(内向き)
- 一致した時のアクション : 許可
- ソースフィルタ : 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は下記画像赤塗りつぶし部分に書いてある.

接続不良時確認項目
そんな面倒なことしてないしこれくらいじゃね