東方緋想天でネット対戦なぞしているが、現在自宅のネット環境ではポート開放を行うことが出来ない(集合住宅向けプライベートネットワーク環境なので)為サーバになることが出来ない。仲間内にもサーバ不可なプレイヤがいるので、不可者同士で対戦が出来ない。
当初はHamachiを試したがラグが酷くてしゃれにならない。じゃあポート開放の出来る外部Linuxサーバに自前で専用VPNを作るかと思ったが、PPTPだとルータがIP以外のパケットを通さないし、OpenVPNは負荷が重めな上に対戦相手に専用クライアントをインストールしてもらう必要がある。
東方緋想天でサーバになるためには少なくとも「任意のUDPポート1つ」が開放されていればよい(デフォルトは10800番)。そこでsshポートフォワードを使ってみることにした。ポイントは、
- 自宅Windowsマシン?外部Linuxサーバ間のパケット転送はSSLのポートフォワードを使用する。
- 自宅Windowsマシン及び外部Linuxサーバ上でudp/tcpパケットの相互変換を行う。
まず1はいわゆるSSLトンネリングを使うことにする。外部Linuxサーバには既にsshdが動作しているのでsshのポートフォワーディング機能がそのまま使える。ただしsshポートフォワードはtcpしか転送出来ない。そこで2のudp/tcpの相互変換が必要になる。これの実現にstoneを使用する。
信号の流れを図示するとこんな感じ。
まずlinuxサーバ上でstoneを使い、外部からのudp10800番をtcp10800番へ変換する。
# stone -D localhost:10800 10800/udp
-Dはdemonizeオプション。いちいち設定するのが面倒なのでdaemon化しておいた。
次に自宅Windowsマシン上でTTSSH2によるSSHポートフォワードの設定を行う。メニューのSetup → SSH Forwarding…で以下の設定を追加する。
- 「Forward remote server port」側を選択。
- 「to local machine」に localhost を設定。
- 「port」に10800を設定。
設定リストはこんな表示になるはず。
remote 10800 to local "localhost" port 10800
最後に自宅Windowsマシン上でstoneを実行。
stone -M install hisouten -n 192.168.1.1:10800/udp 10800
192.168.1.1の部分は適宜PCのIPアドレスに置き換える。-M installはサービス化オプション。こちらもいちいち起動するのg(ry。またサービスは登録されるがデフォルトは手動起動になってたので自動起動に変更しておく。
これで完了。対戦相手には「外部LinuxサーバのWAN側IPアドレス:10800」を伝えれば無事接続に成功する(はず)。
現在外部LinuxサーバにはMobile-Celeron500MHzのマシンを使っていてフレッツ光プレミアム回線につなげてある。リアルタイムアクションゲームなのでSSLによるオーバヘッドがどの程度影響するか気になったが、現状ではラグもほとんどなく、コンボも問題なくつながる模様。
コメント
(;゚д゚)わぁい、横文字がいっぱーい。
?(^o^)/IT用語は日本語に出来ないんだYO