5.2 STUN サーバーを構築する までもまず間題ありませんが、とりあえず設定しておきましよう。 リスト 5.2 turnserver. conf 526 行目付近 バイナリバッケージを使ってインストールしていれば起動設定ファイルが自動的に作ら 設定はこれだけで終わりです。というわけで早速サーバーを起動してみましよう。 サーバの起動・停止と自動起動 ( デフォルト設定では 3478 ) に対し、 UDP 接続を許可するように設定しましよう。 もちろんファイアウォールの設定も必要です。 listening-port で指定したポート番号 ファイアウォールの設定 #stun—only # By default , this option is NOT set . # Run as STUN server 0 Ⅱ Iy , a11 TURN requests wi11 be ignored. # Option tO suppress TURN functionalitY' 0 Ⅱ ly STUN requests will be processed. れているので、起動も停止も自動起動の設定も簡単です。 57 $ sudO systemctl disable turnserver. service ( 自動起動の無効化 ) $ sudO systemctl enable turnserver. service ( 自動起動の有効化 ) $ sudO systemctl restart turnserver. service ( 再起動 ) $ sudO systemctl stop turnserver. service ( 停止 ) $ sudO systemctl start turnserver. service ( 起動 ) ですべて systemctl コマンドで行えます。 CentOS 7 ではサービスの起動・停止・再起動、さらには自動起動の有効化・無効化ま CentOS の場合の起動方法
第 5 章 STUN/TURN サーバーの構築 方法です。設定ファイルにリスト 5.10 のような形式でユーザー情報を指定します。 まずひとつめは、すでに編集している設定ファイルに直接ューザー情報を書いてしまう 設定ファイルで管理する 理する方法の 2 つがあります。 ューザー情報の管理は大きく分けて、設定ファイルで静的に管理する方法と、 DB で管 が必要となるようにしました。今度はその認証に必要なユーザー情報を登録しましよう。 TURN サーバー用の設定時に lt-cred-mech のコメントアウトを外し、ユーザー認証 TURN サーバー用のユーザー情報を管理する ようにしたほうがよいでしよう。 りません。 tur Ⅱ a 面 i Ⅱコマンドを使ってパスワードを " キー " に変換し、これを書き込む ただこれではパスワードを平文で設定ファイルに書き込むことになり、セキュアではあ user=username : pa5SwOrd # user=[ ユーザ名 ] : [ パスワード ] ▽リスト 5.10 パスワードを平文で書く場合 0X3199a25ddd6fe8ffba284e771Cfa30f2 $ turnadmin —k —u username —r example ・ jp -p pa5Sw0rd ー u にはユーザ名、一 r には設定ファイルで指定した realm の値、一 p にはパスワードを指 62 すので、実際に運用するときは DB でユーザー情報を管理することをお勧めします。 ザー情報の変更を反映させるのにサーバーの再起動が必要になるなどデメリットもありま 設定ファイルに直接ューザー情報を書き込む方法はお手軽ではあります。しかし、ユー DB で管理する user=username : 0X3199a25ddd6fe8ffba284e771Cfa30f2 # use て = [ ユーザ名 ] : [turnadmin コマンドで生成したキー ] マリスト 5.11 バスワードのかわりにキーを書く場合 できます。 定します。リスト 5.11 のように、パスワードを平文で書くのとほとんど同じように指定
4.3 NAT を越えてゆけ 内の端末の IP アドレスが隠蔽されるためです * 1 。本来、インターネットにアクセスする 端末はそれぞれがグローバル IP アドレスを持っている必要があり、プライベート IP ア ドレスしか持っていない端末はインターネットに接続できません。しかし、 NAT 機能を 利用している LAN 内の各端末はグローバル IP アドレスを持たず、プライベート IP アド レスのみが割り当てられています。ではなぜ LAN 内の各端末がインターネットに接続で きるかというと、ルーターが持っているグローバル IP アドレスを皆で共有して利用する からです。そのため、 LAN 内の複数の端末が別々にアクセスしていても、 LAN 外から見 ればすべて同一 IP アドレスからのアクセスとなり、各端末の IP アドレスを知ることは できません。また、それを知ったとしても、 LAN 内のみで有効なプライベート IP アドレ スなので、それだけでは外部から接続することはできないのです。 そこで、 LAN の外部から自分の端末への接続を受け付けるため、一部のネットワーク 対戦ゲームや、一昔前の P2P ファイル共有ソフトなどでは、ポート開放という作業を必 要としていました。これはつまり、①ファイアウォールで特定のポートへの接続を許可 し、②さらに特定のポートへの接続はすべて特定の端末へと転送するように設定すること で、 LAN 内部の特定の端末へ外部から接続できるようにするものです。しかしこの作業 はルーターなどの設定が必要で、また下手に設定するとセキュリティレベルが低下してし まうなど、初心者が気軽に行えるものではありませんでした。 WebRTC でもファイアウォールと NAT という 2 つの間題を解決しなければならない ことに変わりはありません。しかし WebRTC ではファイアウォールやルーターの設定を 変えるのではなく、 NAT の特性をうまく利用して巧妙に穴を開けているのです。このよ しかし考えてみると不思議です。 LAN 内の複数の端末からほぼ同時に同じサーバ は先ほど説明したとおりです。 NAT は複数の端末で 1 つのグローバル IP アドレスを共有する技術であるということ そのからくりを理解するため、まずは NAT の働きについて確認しましよう。 NAT のおしごと うな技術を一般に NAT 越え (NAT traversal) と呼びます。 49 本書では「 NAT 」という表現で統一します。 スカレードと呼ばれる技術なのですが、 NAPT は NAT の一種であることや、他の用語との統一のため、 * 1 ここで説明している内容は、厳密には NAPT (Network Address port Translation) あるいは IP マ ません。ルーターはどのようにしてレスポンスの宛先を判断しているのでしようか。 たリクエストに対するレスポンスを間違えて別の端末に返してしまう、なんてことはあり てくれます。どのリクエストも送信元 IP アドレスは同じなのに、ある端末から送信され アクセスしても、ルーターはちゃんと各リクエストに対するレスポンスを間違いなく返し
第 5 章 STUN/TURN サーバーの構築 52 STUN サーバーを構築する $ sudO apt install coturn Ubuntu の場合はもっと簡単で、 apt コマンドでインストールできます。 Ubuntu でのインストール方法 56 ウトを外します。現段階ではそもそも TURN サーバーの設定を行っていないのでそのま TURN 機能を利用せず、 STUN 機能のみを動作させる場合は stun-only のコメントア STUN サーバーのみ利用する #1istening-port=3478 if allowed by configuration. # "plain" TCP & UDP port(s) , t00 # Note: actually, TLS & DTLS sessions can connect to the # TURN listener port for UDP and TCP (Defau1t : 3478 ) . マリスト 5.1 turnserver. conf 14 行目付近 合は、 listening-port のコメントアウトを外して数値を書き換えます。 待ち受けポート番号はデフォルト設定では 3478 が使用されます。これを変更したい場 待ち受けポート番号の変更 せん。いくっか重要な設定項目を紹介しますので、必要に応じて変更してください。 ・・といっても実は STUN サーバーとして動作させるだけなら、設定はほぼ必要ありま 集は root 権限で行ってください。 場所にあるかもしれません。設定はこのファイルを編集することで行います。もちろん編 Ubuntu では /etc/turnserver. conf にあります。インストール方法によっては別の coturn の設定ファイルは、 CentOS では /etc/turnserver/turnserver . conf 、 STUN サーバーで必要な設定 可能です。まずは STUN サーバーのみ使用する設定で構築していきましよう。 coturn は STUN/TURN の両方の機能を備えており、両方同時でも片方だけでも使用
5.3 TURN サーバーを構築する # RFC5780 NAT discovery STUN functionality w 土 11 work correctly , tO map a11 involved addresses . # have form "—X く public—ip/private-ip>" , that option must be used several times , each entry must ln more complex case When more one IP address iS involved , # must be always mapped t0 the same ' external ' port 12345 ) . # Fo て that ' external ' IP , NAT must forward ports directly (relayed port 12345 are mapped properly , even when the TURN server itself # By default , this value is empty, and Ⅱ 0 address mapping is used. .80 . 91 #externa1—ip=60.70.80.91 / 172.17.19.101 #externa1-ip=60.70.80.92 / 172.17.19.102 AWS EC2 のようにサーバーが NAT の配下にある場合、 external-ip にグロ is behind A NAT . if the addresses #OR : #externa1—ip=60.70 ファイアウォールの設定 IP アドレス (EC2 用語では " パプリック IP" ) を指定します。 ー - ノヾノレ min-port から max-port までのポートへの接続を許可するようにします。 TURN サー バは UDP だけでなく TCP での接続も可能なので、 UDP と TCP 両方を許可しま listening-port のポート番号についても TCP 接続の許可を追加しておきます。 企業内ユーザのための設定 一部の企業内ネットワークなどではファイアウォールの制限が厳しく、 HTTP で利用 される 80 番ポートおよび HTTPS で利用される 443 番ポートの TCP しか接続を許可し ていない環境もあると聞きます。 そのような環境でも WebRTC を利用できるようにするには、 listening-port を 80 番ポートに設定するとよいでしよう。なお、 1024 番未満のポートを利用するときは root 権限で起動するか、ケーパビリティを利用して特権を与える必要があります。 ただ、一般的な用途であればこの設定は特にする必要はありません。あくまで制限が厳 しいファイアウォールの内部からでも接続できるようにするための、最後の最後の手段 です。 61
5.3 TURN サーバーを構築する 同一の LAN に接続されていないようにしましよう。各端末が同一の LAN につながって いると LAN 内で付与されているプライベート IP で接続できるため、 STUN サーバーを TURN サーバーで必要な設定 編集していきます。 今度は TURN サーバーを構築をしてみましよう。先ほどと同じように設定ファイルを 5.3 TURN サーバーを構築する 使う必要がないからです。 TURN サーバーを有効化するためにもう一度コメントアウトしておいてください。 なお、 STUN サーバー構築時に stun-only のコメントアウトを外していた場合は、 なっています。 TURN サーバーの構築では、 STUN サーバーのときに比べて設定が必要な項目が多く ポート番号の範囲を変更する リスト 5.5 turnserver. conf 146 行目付近 # Lower and upper bounds Of the UDP relay endpoints : # (default values are 49152 and 65535 ) # mi Ⅱー port = 49152 #max—port=65535 接続に使用するポート番号の範囲を指定します。 min-port が下限、 なり、デフォルト値は 49152 ~ 65535 となっています。 フィンガープリントとユーザー認証の有効化 マリスト 5.6 turnserver. conf 162 行目付近 # Uncomment tO use fingerprints in the TURN messages ・ # By default the fingerprints are off . #fingerprint # Uncomment tO use long—term credential mechanism. 59 #lt—cred—mech # By default れ 0 credentials mechanism is used (any user allowed) . max-port が上限と
5.3 TURN サーバーを構築する turnadmin コマンドでユーザーを登録するには次のように指定します。オプションの一 るので、直接 SQL 文を利用する必要はありません。 min コマンドを使います。スキーマの管理も含めてすべてこのコマンドが面倒を見てくれ DB でユーザー情報を管理するときは、先ほどパスワードの変換にも利用した turnad 能です。 Redis にも対応しています。ューザー情報の管理に利用する DB は設定ファイルで変更可 デフォルトでは SQLite を利用しますが、それ以外に MySQL 、 PostgreSQL 、 MongoDB 、 DB に登録されているユーザーを確認するには一 1 オプションを使います。 $ sud0 turnadmin —a —u username —r example ・ jp —p pa5Sw0rd k が一 a に変わっただけですね。 ューザを削除するときは -d オプションを使い、削除したいユーザのユーザ名と realm username [example ・ jp] $ turnadmin ー 1 を指定します。 $ sudo turnadmin —d —u username —r example ・ jp アプリで TURN サーバーを使うように指定する 63 'turn: 198.51.100.135:3478?transport=tcp' 'turn: 198.51.100.135:3478?transport=udp' urls : [ ' stun : 198.51.100.135 : 3478 ' } , {urls : iceservers: [ let pc = new RTCPeerConnection({ マリスト 5.12 TURN サーバーをリストに追加 ワードも指定する必要があります ( リスト 5.12 ) 。 していましたが、 TURN サーバーではそれに加えて user Ⅱ e と credential つまりパス サーバーのリストに TURN サーバーを追加します。 STUN サーバーでは urls だけ指定 STUN サーバーのときと同様、 RTCPeerConnection のコンストラクターに渡す ICE
2.2 メディアストリームの条件を指定する "deviceld" : "default" MediaDeviceInfo { "label" : "BUFFALO BSW50KM02 USB Camera ( 0411 : 0263 ) " : "videoinput 'groupld" "label": " 既定” "audiooutput " "kind" 'groupld" " d21504f46a05fC9C7ee6fa5ab64399b0f6dee47e9b30db018a3C49d0864b " マリスト 2.12 deviceld を利用してデバイスを指定 1et constraints = video : { width: {min: 640 } , height : audio : { echoCance11ation: true : 480 } , / / ローカルストレージにデバイス選択設定が保存されていたらそれを使う if (10ca1Storage. getltem( 'videoDeviceId' ) ) { constraints ['video'] ['deviceld'] 10ca1Storage . getltem( 'vide0DeviceId' ) ; if (10ca1Storage ・ getltem( 'audi0DeviceId' ) ) { constraints ['audio'] ['deviceld'] 10ca1Storage ・ getltem( 'audi0DeviceId' ) ; 1et mediaStream = await navigator. mediaDevices . getUserMedia(constraints) ; groupld は device 工 d とほぼ同様ですが、マイク内蔵 USB カメラのようにマイクとカ メラが一体となっている場合に同じ ID となる点が異なります。ただし、まだ未対応だっ たり、上手く判定できていなかったりするプラウザーが多いです。 します。 Chrome 独自実装の条件 当然 Chrome 以外のプラウザーでは利用できず、標準化されたものではないため 実は、条件に指定できる項目には Chr ( ) me だけで利用できる独自実装が多数存在 31 深人りしないほうがよいでしよう。 サービスでも Chrome 独自実装の条件を指定しているものがありますが、あまり 突然使えなくなってしまうこともじゅうぶん考えられます。大手商用 WebRTC
第 8 章開発に便利な Tips & Tricks 問題は、 LAN 内の別々のマシン同士で通信できることをテストしようとした場合で す。別のマシンからアプリを実行するには、 http : / / 192.168. x. x : xxxx/ というように サーバーが起動しているマシンの IP アドレスでアクセスすることになります。この場合 は HTTPS でもなく localhost でないため、 getUserMedia の実行に失敗してしまいます。 また、ポート開放の設定をしていない限り、 Wi-Fi に接続していないスマートフォンか ら手元のマシンにアクセスして開発中のアプリを実行してみることも不可能です。 もちろん、このようなテストはどこからでもアクセスでき、サーバー証明書を取得し ていて HTTPS で接続できるテストサーバーにいったん反映してから行うべきでしよう。 しかし、どうせなら手元のマシンで起動しているサーバーを利用してテストができれば、 デバッグや修正も簡単に行うことができて便利ではないでしようか。 そんなときに役立つのが ngr 。 k 、 6 というサービスです。このサービスは手元のマシン と ngrok のサーバーとの間でトンネルを作り、手元のマシンの任意のポートで起動して いるサーバーに外部からアクセスできるようにしてくれるものです。 HTTP だけでなく HTTPS 接続にも対応しているため、 getUserMedia も間題なく利用することができます。 インストール Mac の場合は Homebrew を使うのがお手軽です。それ以外の OS では、 ngrok のサイ トからアプリの人った ZIP ファイルをダウンロードし、任意の場所に展開します。 $ ngrok http [ 接続したいポート番号 ] したいポート番号を人力します。 ngrok を起動するには、コマンドラインで ngrok http に続けて半角スペースと、接続 使用方法 $ brew cask install ngrok 94 https ://ngrok.com * 6 で起動しているサーバーにアクセスできます。 のようなランダムな URL が生成されます。この URL で、起動時に指定したポート番号 起動に成功すると図 8.15 のような画面が表示され、 http(s) ://xxxxxxxx ・ ngrok ・ io
第 8 章開発に便利な Tips & Tricks 半角スペースに続けて起動オプションを追記します。 Mac や Linux の場合はターミナル からコマンドラインで指定して起動します。 6 。厄 ( h 「。 ( 2 ) のプロバティ 全般ショートカット互換性詳細 以前のバージョン 厘類 : 場所 : リンク先 ( 第 : △図 8.1 # Mac の場合 G 。。 9 に Ch 「。肥 ( 2 ) アプリケーション AppIication Windows での起動オプション指定 e h 「 on ¥ AppIic ion h 「 on 肥ざ [ 起動オプション ] $ open "/App1ications/Goog1e Chrome. app" --args [ 起動オプション ] または 84 https ://media.xiph.org/video/derf/ * 3 は --use-fake-device-for-media-stream も同時に指定しなければなりません。 をダウンロードして使用するとよいでしよう。この起動オプションを指定する場合 です。 Xiph.Org Foundation が配布している Y4M 形式のサンプルファイル * 3 など な一般的な形式のファイルではなく、 Y4M (YUV4MPEG2) 形式のファイルのみ 動画ファイルの映像に変更できます。ただし、ここで指定できるのは MP4 のよう -use-fake-device-for-media-stream 指定時のテストパターン映像を任意の —use—file-for—fake—video—capture=path/to/file . y4m ン映像・音声を取得するようになります。 getUserMedia で実際のキャプチャデバイスの映像・音声の代わりにテストパター —use—fake—device—for—media—stream なります。ツールを利用した自動テストを行うときに指定するとよいでしよう。 デバイスの使用許可を求めるダイアログが表示されず、自動的に許可されるように —use—fake—ui—for—media—stream file プロトコルのページでも getUserMedia を利用できるようになります。 —allow—file—access-from—files $ "/App1ications/Goog1e Chrome ・ app/Contents/MacOS/Goog1e Chrome" [ 起動オプション ]