海外のゲームやりたいならVPNを自分で構築しよう

2024-03-02

背景


とあるオンラインゲームをプレイしていましたが、日本だけでなく他の海外サーバでもプレイしたいと思い、VPNを構築しました(日本鯖の不透明性に嫌気がさした・・・)。

構築方法についてはあまり詳細には記載しませんが、構築に当たって必要な知識をメモしておこうと思います。

なお、ゲームによってはVPNを通してプレイすることが利用規約違反になる可能性があります。

今回自分がプレイするゲームの場合は、VPNを明示的に禁止していませんでした。

ただし、当然ですが利用規約に反する目的で使用した場合は永久BANになる可能性がありました。

VPNについて


必要な技術は下記二つ

  • トンネリング
    • Layer2 or Layer3のデータをカプセル化する
  • 認証
    • 正しい相手と通信する為の技術
  • 暗号化
    • トンネリングによりカプセル化されるデータを暗号化します

イメージ的には多分こんな感じ

[新しいIPヘッダ, src IP: client IP, dist IP: VPN機器] - [VPN用のヘッダ] - (ここから先は暗号化) [元のIPヘッダ, src IP: client VPN IP, dist IP: 目的サイトのIPアドレス] - [TCP/UDPヘッダ] - [DATA]

このclient VPN IP はVPN対応機器によりNATされる事で、VPN機器のIPアドレスに置き換わって、目的サイトと通信する。

VPNを実現させるための技術比較


技術メリットデメリット
L2TP/IPSec高い互換性設定が面倒(L2TPの設定及びIPSecの設定を行う)
OpenVPN高いセキュリティ設定が面倒(自己署名CAの作成から俺俺証明書の作成)
WireGuard高速な通信、設定が容易UDPのみの対応

Wireguardを用いた設定

簡易的かつ高速に動作することから、今回はWireGuardを選択しました。 構築はGoogle Cloudで行いました。

設定項目は下記です。

  • VMの作成時にIP転送の有効
  • サーバー側で WireGuard 用の公開鍵と秘密鍵の作成
  • クライアント側で WireGuard クライアントのインストール
    • 空のトンネルを追加 を押下することで、公開鍵と秘密鍵の作成
  • サーバー側で WireGuard の設定を行う
[Interface]
Address = 10.0.0.1/24
PrivateKey = <サーバー側の秘密鍵>
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens4 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens4 -j MASQUERADE

[Peer]
PublicKey = <クライアントの公開鍵>
AllowedIPs = 10.0.0.2/32
  • クライアント側で WireGuard の設定を行う
[Interface]
PrivateKey = <クライアントの秘密鍵>
Address = 10.0.0.2/24
DNS = 8.8.8.8

[Peer]
PublicKey = <サーバー側の公開鍵>
Endpoint = <VPNサーバのIPアドレス>:51820
AllowedIPs = 0.0.0.0/0

結果

無事GCPに建てたVMを送信元IPアドレスとしてゲームにアクセスできました。

構築は Terraform のみで行なっており、サーバ側の秘密鍵と公開鍵は常に同じものを使用しています。 terraform apply コマンドを実行後、割り振られたIPアドレスをクライアント側の設定に記載するのみでVPNを使うことができます。

課題

このままだとクライアントが外部と通信する際に、全てVPNサーバを経由することになります。

大体 1GB の通信で $0.14 の費用が掛かり45GBのゲームをダウンロードした際には900円弱掛かりました。

ゲームは最初のダウンロードで費用かかるだけで済みますが、例えばYouTubeなど見ながらゲームするとなると、かなりの費用がかかると思います。

そこまでするくらいであれば、NordVPNなど契約した方が良いと思います(1ヶ月プランで2240円/月)