概要
この記事は手元のマシンで建てている任意の TCP サーバー (HTTP や SSH に限らない) をグローバル IP に公開する方法を記したものです。筆者がとあるゲームサーバーを手元のマシンで建てていたのですが、固定グローバル IP がない環境のため固定された IP アドレスでサーバーを公開できるようにしたためその構成をざっくり書き残します。
方法 1: DDNS
1つ目の方法は DDNS (Dynamic DNS) を使用する方法で、(1) ドメイン名でサーバーを公開してよく、(2) 固定ではなくても良いのでグローバル IPv4 アドレスに直接公開でき、(3) レジストラが何かしら自動でレコードを更新する方法を提供している場合に使用できます。
ゲームによっては IP アドレスしか受け付けない (ドメイン名ではアクセスできない) 場合があるため今回は見送りましたが、一般家庭で Minecraft サーバーを建てるなどであれば十分であると思われます。
方法 2: P2P・トンネル
2 つ目の方法は P2P やトンネルを使う方法です。Hamachi など何かしら P2P での接続を確立するためのサービスがあればサーバーを公開することができます。この場合は NAT 抜けもできるので多重ルーターや IPv6 回線しかない場合でも使用できます。今回は Cloudflare Tunnel を使用する予定だったのですが、Cloudflare Tunnel では任意の TCP 通信を行う場合クライアント側にも cloudflared サービスを立ち上げる必要があるため見送りました。
方法3: トンネル+踏み台サーバー
先程のトンネルに加えクライアントの代わりに踏み台サーバーを置き、踏み台サーバーの Global IPv4 アドレスを用いてサーバーを公開する方法です。この方法の概略を下図に示します。この方法ではホストがどの IP にあってもよく (NAT 抜けも可能)、起動するマシンに cloudflared さえ入っていればどのマシンで起動してもよいため利便性も高いです。今回はこの方法に落ち着きました。
構築手順
詳しい部分は覚えていないので他の記事に譲ります。今回は remotely managed tunnel で設定しました。
- Cloudflare Zero Trust コンソールからトンネルを作成する
- このとき適当なドメインで public トンネルを作成する (認証は必要なので public で問題なし)
- 最終的にサーバーを公開するドメインとは別です
- 自宅マシンに cloudlared をインストール
- 1 の作成中に cloudflared のインストールを促されると思います
- 踏み台サーバーに cloudflared をインストール
-
cloudflared access tcp
とかでクライアントとして自宅マシンに疎通できるはずです
-
- 踏み台サーバーでポートフォワーディングの設定をする
- iptables, redir などで転送 (私は楽なので redir を使いました)
- 転送先を cloudflared が待ち受けるポートにする
- 必要に応じて ufw などの設定もする
- iptables, redir などで転送 (私は楽なので redir を使いました)
以上の手順で踏み台サーバーへの通信を自宅マシンに流すことが可能になります。よいサーバーライフを!