Photon ServerのNAPT環境下での設定

photon_server_pink

Photon運営事務局です。
サーバーサイドの続編として、NAPT環境下での設定についてお話をしていきたいと思います。

利用する環境によっては、すべてのサーバーがファイアーウォールやロードバランサーなどの配下にあり、プライベートIPアドレスしか持てず、外部からのアクセスはポートフォワードの設定が必要といった場合も多々あるかと思います。
そういった場合でも、うまく設定をしていくことによってPhoton Serverを利用することが可能です。その辺りについて、ご説明していきます。

なお、前提として前回の複数台構成でのPhoton Serverのインストールの設定は済んでいるものとします。予めご覧になっておいてください。
また、ポート番号の一覧についてはTCP and UDP Port Numbersをご覧ください。
http://doc.exitgames.com/ja/onpremise/current/reference/tcp-and-udp-port-numbers

ポートフォワードの設定方針

グローバルIPアドレスが複数割り当てできる場合と単一の場合で異なりますが、ここではより厳しいグローバルIPアドレスが単一の場合で考えていきたいと思います。

Master Server、Game Serverで外部に公開が必要なポートはそれぞれ下記の通りです。

公開ポート
Master/Game TCP/UDP ポート番号 用途
Master TCP 843 Flash / Unity Policy
TCP 943 Silverlight Policy
TCP 4530 Client-Master間通信 (TCP)
UDP 5055 Client-Master間通信 (UDP)
TCP 9090 Client-Master間通信 (WebSocket)
Game TCP 4531 Client-Game間通信 (TCP)
UDP 5056 Client-Game間通信 (UDP)
TCP 9091 Client-Game間通信 (WebSocket)

単一の場合、すべてのサーバーのポートを1つのグローバルIPアドレスに割り当てる必要がありますので、ポート番号の割り振りを考えなければなりません。
まずMaster Serverについては、1台のみですので、そのまま割り当ててしまうのが分かりやすいでしょう。
Game Serverについて、こちらは規模が大きくなるにつれて台数が増えていく可能性があります。ですので、増えても対応できるように設計しなければなりません。

Game Serverのポートについては、

TCP 4530 + n
UDP 5055 + n
WebSocket 9090 + n
(nはサーバーの数)

とするのがわかりやすいでしょう。
ベースのポート番号はデフォルトであるMaster Serverの続きとしましたが、これは他とかぶることがなければ変更しても問題ありません。例えば、

TCP 10100 + n
UDP 10200 + n
WebSocket 10300 + n
(nはサーバーの数)

とするのもよいでしょう。

上記をまとめると、ポートフォワードの設定は下記のようになります。

ポートフォワード設定
TCP/UDP グローバル側ポート サーバー プライベート側ポート 用途
TCP 843 Master 843 Flash / Unity Policy
TCP 943 943 Silverlight Policy
TCP 4530 4530 Client-Master間通信 (TCP)
UDP 5055 5055 Client-Master間通信 (UDP)
TCP 9090 9090 Client-Master間通信 (WebSocket)
TCP 4531 Game 1 4531 Client-Game間通信 (TCP)
UDP 5056 5056 Client-Game間通信 (UDP)
TCP 9091 9091 Client-Game間通信 (WebSocket)
TCP 4532 Game 2 4531 Client-Game間通信 (TCP)
UDP 5057 5056 Client-Game間通信 (UDP)
TCP 9092 9091 Client-Game間通信 (WebSocket)
TCP 4530 + n Game n 4531 Client-Game間通信 (TCP)
UDP 5055 + n 5056 Client-Game間通信 (UDP)
TCP 9090 + n 9091 Client-Game間通信 (WebSocket)

なお、グローバルIPアドレスが複数の場合は、上記表にグローバルIPアドレスも追加しておけばよいでしょう。Game Serverと同じ数だけのグローバルIPアドレスが使えるのであれば、グローバル側とプライベート側(サーバー側)のポート番号を合わせられるので、わかりやすくなります。
各自の環境に合わせて、上記のような表を作成して理解しておきましょう。

Master Serverの設定

Master Server自身の設定は基本的に変更する必要はありません。
ただし、Game Serverのポート番号をPolicyのファイルに記載する必要があります。
(server-sdk)¥deploy¥Policy¥assets¥socket-policy.xml

デフォルトのポート番号をそのまま使っていて、Game Serverが2台までならそのままでも大丈夫ですが、ポート番号を変更している場合や3台以上ある場合は変更が必要です。
例えば、デフォルトのポート番号でGame Serverが3台という構成の場合は、下記のように変更してください。

<cross-domain-policy>
	<allow-access-from domain="*" to-ports="5055,5056,5057,5058,4530,4531,4532,4533,9090,9091,9092,9093" />
</cross-domain-policy>

Silverlightを利用する場合は、同じフォルダにあるsocket-policy-silverlight.xmlも同様に変更をしてください。
Master Serverの設定は上記で以上です。

Game Serverの設定

Game Serverの設定が重要です。
アプリケーション固有の設定ファイルであるPhoton.LoadBalancing.dll.configを変更していきます。
(server-sdk)¥deploy¥Loadbalancing¥GameServer1¥bin¥Photon.LoadBalancing.dll.config

こちらの16-34行目の部分は、Master ServerがClientに対して、このGame Serverへ接続を指示する際に通知する接続情報となります。Clientは、受け取った接続情報を元に、Game Serverへの接続を試みます。

まず最初は、通知するグローバルIPアドレスです。グローバルIPアドレスを持つ環境では自動設定でも問題ないですが、NAPT環境では自分で設定する方が安全でしょう。

			<!-- Leave empty and the the IP address will be looked up dynamically at runtime. --> 
			<setting name="PublicIPAddress" serializeAs="String">
				<value>210.172.1.1</value>
			</setting>

続いてはClient-Game間のTCP通信のポート番号です。こちらはClientに通知するポート番号となりますので、グローバル側のポート番号を記載する必要があります。
例えば、デフォルトのポート番号で3台目のGame Serverとする場合は、4533となりますので、下記のようになります。

			<!-- Client-to-Gameserver TCP connections. Needs to match the TCPListener in PhotonServer.config --> 
            <setting name="GamingTcpPort" serializeAs="String">
                <value>4533</value>
            </setting>

次にUDP通信のポート番号です。TCPと同様にグローバル側のポート番号を記載します。
TCPと同様に3台目とする場合は5058となります。

			<!-- Client-to-Gameserver UDP connections. Needs to match the UDPListener in PhotonServer.config --> 
            <setting name="GamingUdpPort" serializeAs="String">
                <value>5058</value>
            </setting>

最後はWebSocket通信のポート番号です。こちらも同様にグローバル側のポート番号です。
こちらも同様に3台目とする場合は9093となります。

			<!-- Client-to-Gameserver WebSocket connections. Needs to match the WebSocketListener in PhotonServer.config -->
			<setting name="GamingWebSocketPort" serializeAs="String">
				<value>9093</value>
			</setting>

変更内容は以上となります。
変更を反映させるには、インスタンスの再起動を行ってください。

まとめ

設定するところはさほど多くありません。どういった構成で動かすか、各自の環境でしっかり設計することが重要です。
その内容を表として作成したほうがわかりやすいでしょう。そしてその表を確認しながら設定するのが確実です。
そして、Game Serverの設定はClientに通知するためのグローバル側のポート番号、IPアドレスである、ということをしっかり認識しておいてください。

引き続き、Photon Serverについてもご紹介していきたいと思います。
リクエストなどもお待ちしております!