背景
とあるオンラインゲームをプレイしていましたが、日本だけでなく他の海外サーバでもプレイしたいと思い、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円/月)