ファイアウォールの背後にあるサーバーで TURN サーバー (http://tools.ietf.org/html/rfc5766) を実行しています。マシンにはパブリック IP アドレスがあり、サーバーのプライベート IP アドレスとの間で送受信されるネットワーク パケットが送受信されます。基本的に、サーバーはソケットをパブリック IP アドレスにバインドできず、プライベート IP アドレスのみにバインドできます。Runningifconfig
は、プライベート IP アドレスを持つネットワーク デバイスを示します。
TURN サーバーを実行するときは、プライベート IP アドレスにバインドする必要があります (サーバーはパブリック インターネットに接続されているとは見なさないため)。割り当ての作成に対するすべての応答は、プライベート IP アドレスを含む XOR-RELAYED-ADDRESS を返します。クライアントは XOR-RELAYED-ADDRESS を受信し、サーバーのプライベート IP アドレスにデータを送信しますが、明らかに失敗します。
これを克服するために私が検討している2つのオプションがあります。
- クライアント コードで XOR-RELAYED-ADDRESS の IP アドレスを無視し、XOR-RELAYED-ADDRESS のポートのみを使用するようにします。クライアントは、中継されたすべてのメッセージを TURN サーバーのパブリック IP (クライアントはこの値を事前に知っているため) および XOR-RELAYED-ADDRESS ポートに送信します。
- サーバーを変更してパブリック IP を認識し (ソケットをバインドできない場合でも)、XOR-RELAYED-ADDRESS 応答で常にパブリック IP を返信します。
最初の方法はTURN RFCを破っているように感じます... TURNサーバーがXOR-RELAYED-ADDRESSのIPをTURNサーバーのパブリックIP以外のものとして送り返す状況を想像することはできませんが、RFCは言いますXOR-RELAYED-ADDRESS は、クライアントがデータを送信する必要があるものです。
2番目の方法はRFCをあまり壊していないように感じます...それが理にかなっていれば。さらに、この方法ではクライアントに特別なことを強制することはありませんが、最初の方法ではすべてのクライアントが上記に従う必要があります。
これについてあなたはどう思いますか?誰かがこれを経験したことがありますか、および/またはどの方法がRFCをあまり壊さないか、またはRFCがいずれかの方法によって違反されているかどうかについて意見がありますか?