TailscaleとNginxを活用してUDPポートフォワーディングをする

2.3k words

目次

免責事項

この方法は、素人が考えゴリ押しでやれることやった結果なのでセキュリティ、パフォーマンス、その他何かしらの問題が発生する可能性があります。

この方法を使用して発生したいかなるトラブルも筆者は一切の責任を負いかねます。

なんでUDPポートフォワーディング?

Left 4 Dead 2やCounter Strike 2等のUDPを使用したゲームサーバーを身内で開いて遊びたいと常々考えているが、自宅のIPを公開したくないためVPS等でプロキシを構築しその通信を自宅サーバーに流したいと考えていた。
またポート開放が行えない環境の人も、VPSを活用することでゲームサーバーやUDPを使用したソフトウェアの外部公開ができるようになると思う。

今回使用する環境

サーバーPC

ゲームするPCとサーバー用PCが同一なので、Windowsを使用していますが、実際はUbuntu等のLinuxでも問題ないです。

  • Windows 10 22H2
  • Tailscale
  • UDPを使用する何か

VPS

  • Ubuntu 20.04
  • Tailscale
  • Nginx

準備

Tailscaleのアカウントを登録する

ログインページにアクセスし、アカウントを作成します。

自分はGitHubのアカウントとの連携で登録しました。

サーバーPC

1. Tailscaleのクライアントをインストール

ダウンロードページにアクセスし、対応したOSのインストール方法に従います。今回はWindowsを使用します。

2. ログイン

作ったアカウントでログインします。

この操作はWindows等のGUIを使用する場合のみ使用する方法で、Linuxであればtailscale upした際に出てくるリンクをブラウザで開いて認証します。

VPS

1. Tailscaleをインストール

ダウンロードページに書いてあるインストールスクリプトを使用してインストールします。

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

2. tailscale upを実行する

以下のコマンドを実行して、tailscaleをスタートします。

1
sudo tailscale up

3. ブラウザでリンクを開いてデバイスを登録する

コマンドを実行すると、以下のようなURLが出力されます。

1
2
3
To authenticate, visit:

https://login.tailscale.com/a/xxxxxxxxxxx

リンクにアクセスして、登録したアカウントにログインし、Connectボタンをクリックします。

4. tailnet内のサーバーPCのIPを確認する

Linux

Linuxであれば以下のコマンドtailnet内でのIPを確認できます。

1
tailscale up -4

Windows

システムトレイに格納されているTailscaleのアイコンを右クリックして This device: xxxxxx (xxx.xxx.xxx.xxx)と書かれてる()の部分を確認します。

5. NginxのStreamモジュールのコンフィグを書く

今回は簡易的な説明で済ましたいので、別のファイルには分けず /etc/nginx/nginx.conf をvim等お好きなエディタで編集します。

設定ファイルの末尾に、以下の内容を記述します。

1
2
3
4
5
6
stream {
server {
listen <port> udp;
proxy_pass <ip>:<port>;
}
}
  • listen <port> udp<port>部分に、VPS側で通信を待ち受けるポートを指定します。 例: Source Engine系のゲームであれば 27015
  • proxy_pass <ip>:<port><ip>はtailnet内のサーバーPCのIPを、<port>にはtailnet内のサーバーPCが開いているサーバーのポートを指定します。

今回は、Left 4 Dead 2のサーバー用にセットアップしたいので以下のようにしました。

1
2
3
4
5
6
stream {
server {
listen 27015 udp;
proxy_pass xxx.xxx.xxx.xxx:27015;
}
}

6. Nginxを再起動

Ubuntuであれば以下のコマンドでできます。

1
sudo systemctl restart nginx

7. エラーがなければおk

エラーが発生していなければ、*:27015に対する接続がxxx.xxx.xxx.xxx:27015に転送されるようになります。

8. ポート開放をする

ufwであれば以下のコマンドでできます。

1
2
sudo ufw allow <port>/udp
sudo ufw reload

最後に

かなり便利な方法ではあるのですが、最初に言ったようにセキュリティ的にはおそらく問題ありそうなので、使わない時はtailscaleを落としておく等各自対策をお願いします。