<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>TURN &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/turn/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>[翻訳] coTURN:マルチテナント型のオープンソースのSTUN/TURNサーバ</title>
		<link>/iwase/11300/</link>
		<pubDate>Tue, 18 Nov 2014 00:30:37 +0000</pubDate>
		<dc:creator><![CDATA[岩瀬 義昌]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[TURN]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[coTURN]]></category>

		<guid isPermaLink="false">/?p=11300</guid>
		<description><![CDATA[連載： WebRTC (1)本記事は、webrtcHacksにて英語で掲載されている記事を、webrtcHacks様の許可を得た上で、翻訳＆掲載している記事となります。修正・更新・コメント等がございましたら、webrtc...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/webrtc/" class="series-395" title="WebRTC" data-wpel-link="internal">WebRTC</a> (1)</div><p>本記事は、webrtcHacksにて英語で掲載されている<a href="http://webrtchacks.com/coturn/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">記事</a>を、webrtcHacks様の許可を得た上で、翻訳＆掲載している記事となります。修正・更新・コメント等がございましたら、<a href="http://webrtchacks.com/coturn/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">webrtchacks/coturn/</a> までお願いいたします。</p>

<p>This article originally appeared in English at webrtcHacks and has been translated with webrtcHack&#8217;s permission for posting to html5experts.jp in Japanese. Please visit http://webrtchacks.com/coturn for edits, updates, and comments.</p>

<h2>イントロダクション</h2>

<p>昨年、Oleg Moskalenkoへインタビューし、オープンソースのSTUN&amp;TURNサーバで極めて人気のあるrfc-5766-turn-serverプロジェクトについての記事を公開しました。その数カ月後、Amazonが自身のサービスであるMaydayにこのプロジェクトを利用していることがわかりました。それ以後、IETFにてRFC 5766に多くの機能が新たに定義され、オープンソースの新プロジェクトであるcoTURNプロジェクトが生まれました。</p>

<p>今日はOlegに再度、話を伺って、coTURNの何が新しいのか・coTURNとは何なのか、という点についてキャッチアップしたいと思います。</p>

<p>{“導入の執筆者”, “victor”}</p>

<div id="attachment_11301" style="width: 448px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2014/11/coturn01.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/11/coturn01.jpg" alt="coturn image" width="438" height="640" class="size-full wp-image-11301" srcset="/wp-content/uploads/2014/11/coturn01.jpg 438w, /wp-content/uploads/2014/11/coturn01-205x300.jpg 205w, /wp-content/uploads/2014/11/coturn01-141x207.jpg 141w" sizes="(max-width: 438px) 100vw, 438px" /></a><p class="wp-caption-text">Photo courtesy of flikr user Grant Nicholson</p></div>

<h2>インタビュー</h2>

<p>webrtcHacks: 前回インタビューしたときは、rfc5766-turn-serverプロジェクトについて話をしていて、既に商用でも使われている例(WebRTCの例、WebRTC以外の例)があるのを教えてもらったよね。 coTURNプロジェクトの何が新しくて、現在人気のあるrfc5766-turn-serverと何が違うの？</p>

<p>Oleg: TURNとSTUNのプロトコルは進化が早くて、新しいネットワークの接続要件を備えていたり、もっとロバストな能力を提供してきている。ある時点で、新しい要件が現在の&#8221;レガシー&#8221;なユーザ要求と衝突する可能性があることがわかったんだ。そこで、プロジェクトを2つの開発ラインに分けて、2つのモデルをサポートしようと決めたんだよ。古いプロジェクト(rfc5766-turn-server)は安定したコードと多くのユーザを受けて継続する。つまり、バグフィックスや本当に必要な機能だけを加えて、信頼性のあるコードになる。このプロジェクトは古いスタイルのRFC 5766に準拠して欲しいという要望がある限り、存在し続けるよ。</p>

<p>一方で新しいプロジェクトである&#8221;<a href="https://code.google.com/p/coturn/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">coTURN</a>&#8220;(複数レルムでco-locationを提供するTURN)は4月にはじまり、2014年の5月に<a href="https://groups.google.com/forum/#!topic/turn-server-project-rfc5766-turn-server/rYF8nbm5rxc" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">公開</a>した。最初の主な違いは、新しい<a href="https://tools.ietf.org/wg/tram/charters" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">IETF TRAMワーキンググループ</a>で提案されているORIGIN属性をサポートしたmultiple-realms(複数領域)の仕様に対応している点だよ。</p>

<p>webrtcHacks: 読者はIETFでTRAMが何をやっていることについて詳しくないひともいるので、簡単に教えてもらえる？</p>

<p>Oleg: もちろん。TRAM WGのゴールは、複数の取組みを整理・統合して、TURNとSTUNをもっとWebRTCの環境に適したものにすること。その中では、以下の取組みが含まれている：</p>

<ul>
<li>追加トランスポートとしての<a href="https://tools.ietf.org/html/rfc7350" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">DTLS</a>を追加する</li>
<li>認証の仕組み</li>
<li>TURNとSTUNの拡張</li>
</ul>

<p>実際、知っていると思うけど、TURNbisやSTUNbisのドラフトにも取り組んでいるよ。私の意見だと、今後やって来る標準の中で最も重要な機能は、oAuthベースの認証と認可の仕組みだね。エンタープライズのユーザ・ISPのユーザにとって、マルチテナントサーバになるのが主要な機能になるだろうね。</p>

<p>これに加えて、多くな小さな追加もある：</p>

<ul>
<li>ALPN (Application Layer Protocol Negotiation)</li>
<li>帯域制御</li>
<li>IPv4とIPv6の割り当て(dual allocation)</li>
</ul>

<p>webrtcHacks: あと、さっき言ってたORIGIN属性もあるよね。</p>

<p>Oleg: その通り、これまで決めてきたものの1つに、新しい<a href="https://tools.ietf.org/html/draft-ietf-tram-stun-origin" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ORIGIN属性</a>がある。これは、セッション単位での領域選択を可能にするんだ。coturnのデータベースは、複数のレルムでグループ分けされたユーザを保持するようになる。それぞれのレルムは異なるパラメータをおそらく持つ。この機能のおかげで、複雑な大規模環境でもcoturnは対応できる。例えば、1つのIPアドレスとポートしないけど、複数のユーザに対応する必要がある場合とかね。エンタープライズ向けの大規模TURNサーバやISPの運用するTURNサーバも適用例になるだろうね。</p>

<p>webrtcHacks: マルチテナントへの変更って、rfc 5766のTURNサーバのプロジェクトから大きなアーキテクチャの変更が必要なの？</p>

<p>Oleg: アーキテクチャに大きな変更は無いんだけど、データマネジメントでかなりの量の変更があるんだ。これまでの多くのことはシステム全体でグローバルだと想定してたんだけど、これからはレルムに限定されるようになる。そのため、かなりの量のコードを書き換えないといけなくて、それがマルチテナントの移行に向けてとても大変なところなんだ。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/11/coturn02.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/11/coturn02.png" alt="Example from latest TURNbis draft" width="593" height="404" class="alignnone size-full wp-image-11302" srcset="/wp-content/uploads/2014/11/coturn02.png 593w, /wp-content/uploads/2014/11/coturn02-300x204.png 300w, /wp-content/uploads/2014/11/coturn02-207x141.png 207w" sizes="(max-width: 593px) 100vw, 593px" /></a></p>

<p>webrtcHacks: マルチテナント以外の機能は他にある？</p>

<p>Oleg: うん、もう一つの大きな変更はIPv4とIPv6の<a href="http://tools.ietf.org/html/draft-martinsen-tram-ssoda" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">2つの割り当て</a>だね。この機能のおかげで、サーバは1つのセッションに対して2つのエンドポイントを割り当てできる。つまり、1つがIPv4でもう1つがIPv6。もしTURNのクライアントがv4とv6の両方でピアとの接続を確立したい場合は、クライアントは同じセッションの中で両方の接続を扱えるから、クライアントとサーバのリソースの節約になる。</p>

<p>Coturnは、サーバ上であるレベルの<a href="http://tools.ietf.org/html/draft-thomson-tram-turn-bandwidth" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">帯域制御</a>も提供する仕様もサポートしているよ。この機能は、TURNクライアントへ提供するサービスレベルを保証したい場合に役立つよ。</p>

<p>webrtcHacks: プロジェクトのコミットを追っかけてて気づいんたんだけど、データベースのサポートについても何かしているよね。これについて教えてくれる？</p>

<p>Oleg: Coturnでは、もっとロバストで抽象化できるようにデータベースのコードを書き直したんだ。これは、新しい機能の開発に役立つし、新しいデータベースも採用できる。例えば、Coturnは古いTURNサーバのプロジェクトでもサポートしてたRedis、MySQL、Postgresに加えて、MongoDBもサポートしているよ。</p>

<p>webrtcHacks: セキュリティについてはどう？何か改善した？　</p>

<p>Oleg: あるよ、今のCoturnの開発はoAuthベースのサードパーティ認証＆認可について取り組んでいる。また、多くのTURNのセキュリティ課題も修正するつもりだよ。CoturnサーバはoAuthの鍵をデータベースから取得するようになり、外部の独立したエージェントがその鍵があるデータベースを扱うようになる。</p>

<p>webrtcHacks: Coturnのパフォーマンスについてはどう？前のrfc5766-turn-serverプロジェクトに比べてどう？</p>

<p>Oleg: Coturnはrfc5766-turn-serverと同じテストスイートを使ってる。Coturnのコードと機能は、より複雑だから理論的にはパフォーマンスは落ちる。だけど、これまでのテストだと気づけるパフォーマンスは落ちてないね。</p>

<p>TURNとして使うのならCPU1つで数千のコールをさばけるし、STUNだけでいいのなら数万のコールをさばけるよ。</p>

<p>webrtcHacks: デザイン面からパフォーマンスに貢献してそうなところはある？</p>

<p>Oleg: 高いパフォーマンスとスケーラビリティのために、TURNサーバはいくつかの機能を実装しているんだ：</p>

<ul>
<li>libevent2の利用 &#8211; 高パフォーマンスで、耐久性のあるのネットワークIOエンジン</li>
<li>設定可能なマルチスレッドモデル(OSがマルチスレッドを使えるなら、CPUのリソースをフルに使えるように)</li>
<li>設定可能な複数のリスニング、および複数のリレーアドレス</li>
<li>より効率的なメモリ管理モデル</li>
<li>ユーザスペースで動作して、システムに特別な制約を課さないこと</li>
</ul>

<p>このTURNプロジェクトのコードは、個別に専有されたネットワーク環境で使われることもある。TURNサーバのコードでは、抽象化されたネットワークAPIが使われているんだ。いくつかのファイルを書き直すだけで、TURNサーバに専有環境に適するコードをプラグインできるよ。このプロジェクトのおかげで、プロジェクトでは提供するのは標準のUNIXのネットワーク/IO APIだけでいいんだ。ユーザは他の環境に適したものを実装できる。TURNサーバのコードはもともと企業の専有環境で高パフォーマンスがでるように作られていて、その後にUNIXネットワークAPIを採用したんだ。　</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/11/coturn03.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/11/coturn03.png" alt="New coturn Project on Google code" width="796" height="407" class="alignnone size-full wp-image-11303" srcset="/wp-content/uploads/2014/11/coturn03.png 640w, /wp-content/uploads/2014/11/coturn03-300x153.png 300w, /wp-content/uploads/2014/11/coturn03-207x105.png 207w" sizes="(max-width: 796px) 100vw, 796px" /></a></p>

<p>webrtcHacks: スケールやロードバランスはどうするつもり？</p>

<p>Oleg: もちろん、仮想的には無制限にスケールするようにロードバランスのスキーマは使うよ。ロードバランスは次のようなツールを使って実装できる。1つでも複数の組み合わせでもいい：</p>

<ul>
<li>DNS SRVを用いたロードバランス</li>
<li>組み込みの300 ALTERNATE-SERVERメカニズム(TURNクライアントからの300レスポンスが必要)</li>
<li>ネットワークロードバランスサーバ</li>
</ul>

<p>webrtcHacks: メディアリレーするためにTURNサーバってどのぐらい使われるか知ってる？</p>

<p>Oleg: 異なる統計が異なるデータを出しているね。一般的に言えば、8-15%のコールで利用されているよ。もちろん、特別なアプリケーションによっては100％がTURNサーバを通る。ただ、僕の知るかぎりだとWebRTCのアプリケーションじゃないけど。</p>

<p>webrtcHacks: 開発者が全てのトラフィックをTURNサーバ経由にしないとならないシナリオって何か思いつく？伝統的なVoIPだと本質的にSBCを使うような。</p>

<p>Oleg: WebRTCの世界だとそういうシナリオに関する絶対的な情報は知らないな。だけど、一部のエンタープライズユーザはそういうネットワークパターンを議論しているから、ありえると思うよ。</p>

<p>webrtcHacks: Coturnはどのプラットフォームがサポートしているの？</p>

<p>Oleg: リストにすると長いね。サポートしているプラットフォームは</p>

<ul>
<li>Linux &#8211; Debina, Ubuntu, Mint, CentOS, Fedora, Redhat, Amazon Linux, Arch Linux, Open SUSE</li>
<li>BSD &#8211; FreeBSD, NetBSD, OpenBSD, DragonFlyBSD</li>
<li>Solaris</li>
<li>Mac OS X</li>
<li>Cygwin &#8211; R&amp;D用途でプロダクジョン向けじゃない</li>
</ul>

<p>このプロジェクトは、*NIXプラットフォームで利用できるはず。ただ、公式にはサポートしてないけど。</p>

<p>クライアントプラットフォームはなんでも大丈夫で、Android、iOS、Linux、OS X、Windows、Windows Phoneをサポートしているよ。</p>

<p>webrtcHacks: 昨年、統計付きパフォーマンスモニタリングも追加したいと言ってたけど、Coturnはそういう仕組を備えているの？</p>

<p>Oleg: 今のところは、パフォーマンスモニタリングのデータはTURNサーバに対してtelnetのインターフェースで取得できて、いくつかのパフォーマンス統計は、Redisの統計データベースから取得できるよ。統計以外だと、今のTURNサーバはパフォーマンスベースの輻輳制御の仕組みを備えているよ。この仕組みはTCPとTLSの接続で動作して、TCP/TLSのコネクションを効率良く自動的にチューニングしてくれる。</p>

<p>webrtcHacks: Coturnの将来のロードマップについて教えてくれる？</p>

<p>Oleg: Coturnは最新のTURNとSTUNの機能に追従していくつもりだよ。IETF TRAMグループは新しいTURNとSTUNのRFC(TURNbisとSTUNbisというコードネームがついてる)を採用する方向に進んでいる。RFCが最終的に定まったら、Coturnサーバは新しい仕様のサポートするように準備するだろう。</p>

<p>加えて、データベースやREST API等を扱える分離されたマネジメントサーバを追加したいんだ。リソースが不足しているから、ボランティアで参加してもらえると非常に助かるよ。</p>

<p>webrtcHacks: 読者がCoturnについての情報を知りたかったらどこを見ればいい？</p>

<p>Oleg: 一番良いのはプロジェクトのウェブサイ卜だよ。<a href="https://code.google.com/p/coturn/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://code.google.com/p/coturn/</a>　必要な情報は、全てリンクするようにしてる。</p>

<p>{“インタビューした人, “victor“}</p>

<p>{“インタビューを受けた人&#8221;, “Oleg Moskalenko“}</p>

<p>{“編集者&#8221;, “chad“}</p>

<p>{“翻訳者&#8221;, “岩瀬 義昌&#8221;}</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTC]]></series:name>
	</item>
		<item>
		<title>壁を越えろ！WebRTCでNAT/Firewallを越えて通信しよう</title>
		<link>/mganeko/5554/</link>
		<pubDate>Tue, 11 Mar 2014 01:00:31 +0000</pubDate>
		<dc:creator><![CDATA[がねこまさし]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[STUN]]></category>
		<category><![CDATA[TURN]]></category>
		<category><![CDATA[WebRTC]]></category>

		<guid isPermaLink="false">/?p=5554</guid>
		<description><![CDATA[連載： WebRTCを使ってみよう！ (5)こんにちは！がねこまさしです。前回は複数人の同時通話まで実現しました。社内で使うには十分なレベルです。 しかし本格的な企業ユースとなると、まだまだ障害があります。会社と家、自社...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/webrtc-beginner/" class="series-158" title="WebRTCを使ってみよう！" data-wpel-link="internal">WebRTCを使ってみよう！</a> (5)</div><p>こんにちは！がねこまさしです。<a href="https://html5experts.jp/mganeko/5438/" title="シグナリングサーバーを応用！ 「WebRTCを使って複数人で話してみよう」" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">前回は複数人の同時通話まで実現</a>しました。社内で使うには十分なレベルです。<br />
しかし本格的な企業ユースとなると、まだまだ障害があります。会社と家、自社と別の会社さんなど、実際に通信しようとするとNATやFirewallといった壁が立ちはだかります。</p>

<h2>NATを越えよう</h2>

<h3>NATの役割は</h3>

<p><a href="http://ja.wikipedia.org/wiki/ネットワーク%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E5%A4%89%E6%8F%9B" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">NAT(+IPマスカレード)</a>は企業だけでなく、一般家庭でも使われています。ブロードバンドルーターやWiFiルーターでは、1つのグローバルIPアドレスを、複数のPCやデバイスで共有することができます。このとき、NATには2つの役割があります。</p>

<ul>
    <li>インターネットにつながったグローバルなIPアドレスと、家庭内/社内のローカルなネットワークでのIPアドレスの変換</li>
    <li>複数のPC/デバイスが同時に通信できるように、ポートマッピングによるポート変換</li>
</ul>

<p>WebRTCでNAT越しに通信すること考えてみましょう。</p>

<h4>ブラウザが知っている情報</h4>

<ul>
    <li>ローカルネットワークのIPアドレス:A</li>
    <li>自分が使う（動的に割り振った)UDPポート:A/UDP</li>
</ul>

<h4>ブラウザでは分からない情報</h4>

<ul>
    <li>グローバルIPアドレス:A&#8217;</li>
    <li>NATによってマッピングされた、外部に向けたUDPポート:A&#8217;/UDP</li>
</ul>

<p>Peer-to-Peer通信を行うには、シグナリング処理でお互いに（ローカルネットワーク内の情報ではなく）インターネット側から見た情報を通知する必要があります。<br />
<a href="https://html5experts.jp/wp-content/uploads/2014/03/webrtc_nat_0.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/03/webrtc_nat_0-300x204.png" alt="webrtc_nat_0" width="300" height="204" class="alignnone size-medium wp-image-5559" srcset="/wp-content/uploads/2014/03/webrtc_nat_0-300x204.png 300w, /wp-content/uploads/2014/03/webrtc_nat_0-207x141.png 207w, /wp-content/uploads/2014/03/webrtc_nat_0.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />
ブラウザーが、インターネット側から見た情報を知るための仕組みが、STUNになります。</p>

<h3>STUNの仕組みは</h3>

<p>STUNの仕組みは意外とシンプルです。インターネット側にいる誰か（STUNサーバー）に、自分（ブラウザ）がどう見えるか教えてもらうだけです。<br />
<a href="https://html5experts.jp/wp-content/uploads/2014/03/webrtc_nat_1.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/03/webrtc_nat_1-300x213.png" alt="webrtc_nat_1" width="300" height="213" class="alignnone size-medium wp-image-5562" srcset="/wp-content/uploads/2014/03/webrtc_nat_1-300x213.png 300w, /wp-content/uploads/2014/03/webrtc_nat_1-207x147.png 207w, /wp-content/uploads/2014/03/webrtc_nat_1.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />
STUNは元々WebRTCのために作られた仕組みではなく、より汎用的なUDP通信の補助として生まれました。VoIPやネットワークゲームの世界でも使われているようです。
<br /><br />
自分を外側から見た情報が分かったら、それをシグナリングサーバー経由で通信相手に渡します。<br />
<a href="https://html5experts.jp/wp-content/uploads/2014/03/webrtc_nat_2.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/03/webrtc_nat_2-300x213.png" alt="webrtc_nat_2" width="300" height="213" class="alignnone size-medium wp-image-5565" srcset="/wp-content/uploads/2014/03/webrtc_nat_2-300x213.png 300w, /wp-content/uploads/2014/03/webrtc_nat_2-207x147.png 207w, /wp-content/uploads/2014/03/webrtc_nat_2.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />
お互いの情報が伝わったら、そこを目掛けて通信を行います。間にNATが挟まりますが、ポートを直接マッピングしているのであくまでもPeer-to-Peerです。<br />
<a href="https://html5experts.jp/wp-content/uploads/2014/03/webrtc_nat_3.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/03/webrtc_nat_3-300x215.png" alt="webrtc_nat_3" width="300" height="215" class="alignnone size-medium wp-image-5566" srcset="/wp-content/uploads/2014/03/webrtc_nat_3-300x215.png 300w, /wp-content/uploads/2014/03/webrtc_nat_3-207x148.png 207w, /wp-content/uploads/2014/03/webrtc_nat_3.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a><br /></p>

<h3>STUNサーバーを動かそう</h3>

<p>それでは実際にSTUNサーバーを動かしてみましょう。Linuxで動作するオープンソースのものがあるので、そちらを使います。<br />
<a href="https://code.google.com/p/rfc5766-turn-server/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><strong>rfc5766-turn-server</strong></a><br />
このサーバはSTUNだけでなく、後程説明するTURNにも対応しています。<br />
DownloadページからOSに合わせたgzファイルをダウンロードし、INSTALL手順に従ってビルド、インストールしてください。参考までに以前私が実施した手順を載せておきます。※ちょっと古いバージョンです。最新のものを取得してインストールしてください。
</p><pre class="crayon-plain-tag">$ wget https://rfc5766-turn-server.googlecode.com/files/turnserver-3.2.1.4-CentOS6-x86_64.tar.gz
$ tar zxvf turnserver-3.2.1.4-CentOS6-x86_64.tar.gz
$ cd turnserver-3.2.1.4
$ ./install.sh</pre><p> 
CentOSの場合、以下の場所に導入されました。
</p><pre class="crayon-plain-tag">バイナリ &rarr;  /usr/bin/turnserver 
設定ファイル &rarr;  /etc/turnserver/*.conf</pre><p></p>

<p>次に設定ファイル( /etc/turnserver/turnserver.conf )を見てみましょう。ポイントとなるのは次の箇所です。
</p><pre class="crayon-plain-tag"># STUN/TURNサーバーの接続待ポート番号。デフォルトは3478です。
# コメントアウトを外して数値を指定すれば、任意のポートに変更できます。 
#
# TURN listener port for UDP and TCP (Default: 3478).
# Note: actually, TLS &amp;amp; DTLS sessions can connect to the
# &quot;plain&quot; TCP &amp;amp; UDP port(s), too - if allowed by configuration.
#
#listening-port=3478</pre><p>
TCPとUDPの両方で待ち受けできますが、STUNはUDPのみが有効なので注意が必要です。※つまりUDPが通らない環境ではSTUNは使えません。</p>

<p></p><pre class="crayon-plain-tag"># このサーバーはデフォルトでSTUN/TURNの両方をサポートしています。
# STUNのみ使いたい場合は、stun-only のコメントアウトを外します。
#
# Option to suppress TURN functionality, only STUN requests will be processed.
# Run as STUN server only, all TURN requests will be ignored.
# By default, this option is NOT set.
#
#stun-only</pre><p>
STUNはPeer-to-Peer通信が始まればサーバーのCPU負荷、ネットワーク負荷はかかりません。それに対して後述するTURNでは特にネットワーク負荷がかかります。サーバーを借りていてネットワーク通信量で課金されるようなケースでは、stun-onlyを設定してTURNは無効にしておいた方が良いかもしれません。<br /><br />
設定がすんだらSTUNサーバーを起動してみましょう。画面にエラーが出なければ無事に起動成功です。エラーが出る場合は turnserver.conf を確認してみてください。
</p><pre class="crayon-plain-tag">/usr/bin/turnserver -o -v -c /etc/turnserver/turnserver.conf</pre><p></p>

<h3>クライアントのソースを修正しよう</h3>

<p>ここまでで準備したSTUNサーバーを使うように、クライアント側のソースを修正しましょう。<a href="https://html5experts.jp/mganeko/5438/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">前回</a>のソースの一部を変更します。<br />
STUNサーバーが stun.yourdomain.com で、デフォルトのポート3478で動いていると仮定します。その情報をPeerConnectionに教えてあげます。
</p><pre class="crayon-plain-tag">function prepareNewConnection(id) {
  var pc_config = {"iceServers":[ {"url":"stun:stun.yourdomain.com:3478"} ]};
  var peer = null;
  try {
    peer = new webkitRTCPeerConnection(pc_config);
  } catch (e) {
    console.log("Failed to create PeerConnection, exception: " + e.message);
  }

  //...省略...
}</pre><p> 
さあ、これで接続を試してください。上手く行けば、自宅と友人の家で通信が可能になっているはずです。</p>

<h3>STUNでNATを越えられないとき</h3>

<p>NATにはグローバルIPアドレスを共有するだけでなく、セキュリティ対策としての役割もあります。内部の端末を隠したり、通信できるポートを制限したり、一種の簡易Firewallとして利用されているケースもあります。その場合はFirewallの場合と同じく、次に説明するTURNを利用する必要があります。<br />
また、NATの構造によっては、接続先によって（今回の場合、STUNサーバーとPeer-to-Peerの通信相手）別のポートが割り当てられる Symmetric NAT という物があります。この場合もSTUNの仕組みでは通信することができません。やはりTURNの出番ということになります。</p>

<h2>Firewallを越えよう</h2>

<p>一般家庭のようにブロードバンドルーターなどでNATがある環境では、STUNを使えば通信が可能になります。次は一般的な企業で使えるようにしましょう。<br />
企業ではFirewallが設置されているケースがほとんどです。その場合、外部と通信できるポートも制限されます。STUNではUDPポートは動的に割り振られるままなので、Firewallにとても大きな穴を空けないと通信ができません。きっとセキュリティ管理者に怒られてしまいます。こんなケースに対応するのが、TURNの仕組みです。TURNもWebRTCのために生まれたのではなく、VoIPやネットワークゲームの世界で使われていたものです。</p>

<h3>TURNの仕組みは</h3>

<p>TURNを使った通信では、TURNサーバが実際のストリームデータを受け渡す間に入ります。すべてのパケットをTURNサーバーがリレーすることになり、もはやPeer-to-Peer通信ではなくなります。この際TURNサーバーでは動画のエンコーディングは行わないので、CPU負荷よりもネットワーク負荷が高くなりやすいです。<br />
<a href="https://html5experts.jp/wp-content/uploads/2014/03/webrtc_fw_1.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/03/webrtc_fw_1-300x222.png" alt="webrtc_fw_1" width="300" height="222" class="alignnone size-medium wp-image-5593" srcset="/wp-content/uploads/2014/03/webrtc_fw_1-300x222.png 300w, /wp-content/uploads/2014/03/webrtc_fw_1-207x153.png 207w, /wp-content/uploads/2014/03/webrtc_fw_1.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>Firewallに穴を空けよう</h3>

<p>TURNを使うには、Firewallに1つ穴を空ける必要があります。標準では3478/UDPを使うので、そのポートが通過可能になるように設定して（してもらって）ください。<br />
もう1つ、シグナリングサーバーと通信するための穴も空ける必要があります。例えば9000番を使うのであれば、9000/TCPも同様に通過可能になるように設定して（してもらって）ください。<br />
会社間で通信するのは、両方の会社でFirewallに穴を空ける必要があります。<br />
※これを読んで「結局Firewallをいじるのかよー」とがっかりした人もいますよね？　Firewallをいじらない方法もあるので、最後までお楽しみに。</p>

<h3>TURNサーバーを動かそう</h3>

<p>TURNサーバーは先ほどSTUNサーバーとしてインストールした<a href="https://code.google.com/p/rfc5766-turn-server/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><strong>rfc5766-turn-server</strong></a><br />がそのまま使えます。/etc/turnserver/turnserver.conf の設定を変更してTURNとして使える様にします。
</p><pre class="crayon-plain-tag"># STUN/TURNサーバーの接続待ポート番号。デフォルトは3478です。
# コメントアウトを外して数値を指定すれば、任意のポートに変更できます。 
#
# TURN listener port for UDP and TCP (Default: 3478).
# Note: actually, TLS &amp;amp; DTLS sessions can connect to the
# &quot;plain&quot; TCP &amp;amp; UDP port(s), too - if allowed by configuration.
#
#listening-port=3478</pre><p>
デフォルトのポートは3478ですが、自由に設定できます。<br />
</p><pre class="crayon-plain-tag"># UDP/IPの他に、rfc5766-turn-serverではTLS/DTLSでの通信も可能です（デフォルトで有効になっています）
# 残念ながらブラウザー側の実装がまだ不十分なので、この機能は無効にしておく（コメントアウトを外す）ことをお勧めします

# Uncomment if no TLS client listener is desired.
# By default TLS client listener is always started.
#
no-tls

# Uncomment if no DTLS client listener is desired.
# By default DTLS client listener is always started.
#
no-dtls</pre><p>
TLS/DTLSは今回は使わない設定にしておきます。また先ほどのSTUNを動かす際に stun-only を設定した場合は、再びコメントアウトしてTURNも使える様にして下さい。
</p><pre class="crayon-plain-tag"># Option to suppress TURN functionality, only STUN requests will be processed.
# Run as STUN server only, all TURN requests will be ignored.
# By default, this option is NOT set.
#
#stun-only</pre><p></p>

<p><br />
そして、WebRTCでTURNを使う際のキモはこちらの設定です。
</p><pre class="crayon-plain-tag"># 認証の方法を選択します。次の3種類があります。
#   no-auth
#   st-cred-mech (short-term credential mechanism) 
#   lt-cred-mech (long-term credential mechanism) 
# WebRTCでは lt-cred-mechを使用する必要がありますので、その行のコメントアウトを外します。

# Uncomment to use long-term credential mechanism.
# By default no credentials mechanism is used (any user allowed).
# This option can be used with either flat file user database or
# PostgreSQL DB or MySQL DB or Redis DB for user keys storage.
#
lt-cred-mech

# 同時に、realmも設定が必要になります。お忘れなく。
#
# Realm for long-term credentials mechanism and for TURN REST API.
#
realm=turn.yourdomain.com</pre><p>
なかなか lt-cred-mech が必須だとは分からず、とても長い間悩んでしまいました。lt-cred-mech で使用するアカウント情報はPostgreSQL, MySQL, Redisなどで管理できますが、今回はシンプルにファイル管理にします。
</p><pre class="crayon-plain-tag"># ユーザーアカウントを定義するファイル名を指定します。 
#
# 'Dynamic' user accounts database file name.
# Only users for long-term mechanism can be stored in a flat file,
# short-term mechanism will not work with option, the short-term
# mechanism required PostgreSQL or MySQL or Redis database.
# 'Dynamic' long-term user accounts are dynamically checked by the turnserver process,
# so that they can be changed while the turnserver is running.
#
# Default file name is turnuserdb.conf.
#
userdb=/etc/turnserver/turnuserdb.conf</pre><p></p>

<p>/etc/turnserver/turnuserdb.conf を使うことにしたので、その内容も変更します。
</p><pre class="crayon-plain-tag">#This file can be used as user accounts storage for long-term credentials mechanism.
#
#username1:key1
#username2:key2
# OR:
#username1:password1
#username2:password2
yourid:yourpassword</pre><p>
例としてユーザID: yourid 、パスワード: yourpassword　としました。　※実際にはもっと強度の高いパスワードにしてくださいね。<br />
<br />
これで turnserverを再起動すれば、TURNでの通信が有効になります。
</p><pre class="crayon-plain-tag">/usr/bin/turnserver -o -v -c /etc/turnserver/turnserver.conf</pre><p>
※ちなみに turnserverを安全に停止させる手段が分かりません。仕方がないので kill で殺しています&#8230;。</p>

<h3>クライアントのソースを修正しよう</h3>

<p>ここまでで準備したTURNサーバーを使うように、クライアント側のソースを修正しましょう。STUNで修正した部分と同じ個所になります。
STUN/TURNサーバーが turn.yourdomain.com で、デフォルトのポート3478で動いていると仮定します。その情報をPeerConnectionに教えてあげます。（STUNとTURNの両方を候補にすることができます）
</p><pre class="crayon-plain-tag">function prepareNewConnection(id) {
  var pc_config = {"iceServers":[
   {"url":"stun:turn.yourdomain.com:3478"},
   {"url":"turn:turn.yourdomain.com:3478", "username":"yourid", "credential":"yourpassword"}
  ]};
  var peer = null;
  try {
    peer = new webkitRTCPeerConnection(pc_config);
  } catch (e) {
    console.log("Failed to create PeerConnection, exception: " + e.message);
  }

  //...省略...
}</pre><p>
さあ、これで接続を試してください。上手く行けば、会社と自宅、あるいは会社と友人の会社で通信が可能になります。</p>

<h2>Firewallはそのままで</h2>

<p>実際の企業ではセキュリティ上の制約や手続き上の問題で、Firewallに穴を空けるのが大変なことも多々あります。お客様の会社だったらなおさらですよね。そんな時のために、TURN over TCP という規格があり、rfc5766-turn-server と Chrome の両方ともサポートしてます。これを使えば、Firewallはそのままで、通信が可能になります。</p>

<h3>TURNサーバを設定し直そう</h3>

<p></p><pre class="crayon-plain-tag"># 一つのポート番号で、UDPとTCPの両方を待ち受けすることができます。
# HTTPと同じ、80番を設定します。
#
# TURN listener port for UDP and TCP (Default: 3478).
# Note: actually, TLS &amp;amp; DTLS sessions can connect to the
# &quot;plain&quot; TCP &amp;amp; UDP port(s), too - if allowed by configuration.
#
listening-port=80</pre><p>
設定が終わったら、turnserverを再起動してください。</p>

<h3>クライアントのソースを修正しよう</h3>

<p></p><pre class="crayon-plain-tag">function prepareNewConnection(id) {
  var pc_config = {"iceServers":[
   {"url":"stun:turn.yourdomain.com:80"},
   {"url":"turn:turn.yourdomain.com:80?transport=udp", "username":"yourid", "credential":"yourpassword"},
   {"url":"turn:turn.yourdomain.com:80?transport=tcp", "username":"yourid", "credential":"yourpassword"}
  ]};
  var peer = null;
  try {
    peer = new webkitRTCPeerConnection(pc_config);
  } catch (e) {
    console.log("Failed to create PeerConnection, exception: " + e.message);
  }

  //...省略...
}</pre><p>
ここでは省略しますが、シグナリングサーバーも 80/TCP で動かす必要があります。サーバー側のNode.jsのポート番号と、クライアント側のsocket.ioのつなぎ先のポート番号を80番に変更してください。※Webサーバー、シグナリングサーバー、TURNサーバーの3つをすべて80/TCPで動かすので、サーバーを3つ別々に立てる必要があります。頑張ってください。<br />
<a href="https://html5experts.jp/wp-content/uploads/2014/03/webrtc_fw_80.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/03/webrtc_fw_80-300x226.png" alt="webrtc_fw_80" width="300" height="226" class="alignnone size-medium wp-image-5601" srcset="/wp-content/uploads/2014/03/webrtc_fw_80-300x226.png 300w, /wp-content/uploads/2014/03/webrtc_fw_80-207x156.png 207w, /wp-content/uploads/2014/03/webrtc_fw_80.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />
さあ、これで最後です。ブラウザをリロードしてください。きっと壁を越えて対話ができることと思います。</p>

<h2>最後に</h2>

<p>これまで全5回、WebRTCの使いかたを説明してきました。開発者向けにコードを一から書いてきましたが、世の中には便利なライブラリやサービスも数多くあります。</p>

<ul>
    <li><a href="https://html5experts.jp/yusuke-naka/3693/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">WebRTC開発者向けライブラリ「PeerJS」はこうして作られた</a></li>
<li><a href="https://html5experts.jp/yusuke-naka/1130/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">WebRTCで注目された海外企業のサービス19本一挙公開</a></li>
</ul>

<p>こちらを利用するのもありですね。日本でWebRTCが盛り上がって、企業ユースでも認知されるのを期待しています。<br />
おつきあいいただき、どうもありがとうございました。<br />
<img src="/wp-content/uploads/2014/03/thankyou-300x216.png" alt="thankyou" width="200" class="alignnone size-medium wp-image-5611" srcset="/wp-content/uploads/2014/03/thankyou-300x216.png 300w, /wp-content/uploads/2014/03/thankyou-207x149.png 207w, /wp-content/uploads/2014/03/thankyou.png 559w" sizes="(max-width: 300px) 100vw, 300px" /></p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCを使ってみよう！]]></series:name>
	</item>
	</channel>
</rss>
