Product SiteDocumentation Site

11.8. リアルタイムコミュニケーションサービス

リアルタイムコミュニケーション (RTC) サービスには音声、動画/ウェブカメラ、インスタントメッセージ (IM) およびデスクトップ共有などがあります。この節では RTC を活用するために必要な 3 種類のサービス、TURN サーバ、SIP サーバ、XMPP サーバについて簡単に紹介します。これらのサービスを準備、インストール、管理するための包括的かつ詳細な情報を参照するには、リアルタイムコミュニケーションクイックスタートガイドをご覧ください。これには Debian 固有の例も含まれています。
SIP と XMPP はどちらも同じ機能を持っています。SIP は音声と動画用としてよく知られています。これに対して XMPP は伝統的に IM プロトコル用と考えられています。しかし実際のところ SIP と XMPP のどちらを使っても音声、動画、IM サービスを提供することが可能です。ただし、さまざまな接続方法を選べるようにするためには SIP と XMPP の両方を同時に運用することを推奨します。
SIP サービスおよび XMPP サービスでは認証と秘匿性を保持する目的で X.509 証明書を使います。X.509 証明書を作成する方法の詳細は第 10.2.1.1 節「公開鍵基盤、easy-rsaを参照してください。また、リアルタイムコミュニケーションクイックスタートガイド にも有益な情報が含まれています。

11.8.1. RTC サービス用の DNS 設定

RTC サービスを提供するには DNS SRV および NAPTR レコードが必要です。falcot.com 用としてゾーンファイルに含める設定の見本は以下の通りです。
; the server where everything will run
server1            IN     A      198.51.100.19
server1            IN     AAAA   2001:DB8:1000:2000::19

; IPv4 only for TURN for now, some clients are buggy with IPv6
turn-server        IN     A      198.51.100.19

; IPv4 and IPv6 addresses for SIP
sip-proxy          IN     A      198.51.100.19
sip-proxy          IN     AAAA   2001:DB8:1000:2000::19

; IPv4 and IPv6 addresses for XMPP
xmpp-gw            IN     A      198.51.100.19
xmpp-gw            IN     AAAA   2001:DB8:1000:2000::19

; DNS SRV and NAPTR for STUN / TURN
_stun._udp  IN SRV    0 1 3467 turn-server.falcot.com.
_turn._udp  IN SRV    0 1 3467 turn-server.falcot.com.
@           IN NAPTR  10 0 "s" "RELAY:turn.udp" "" _turn._udp.falcot.com.

; DNS SRV and NAPTR records for SIP
_sips._tcp  IN SRV    0 1 5061 sip-proxy.falcot.com.
@           IN NAPTR  10 0 "s" "SIPS+D2T" "" _sips._tcp.falcot.com.

; DNS SRV records for XMPP Server and Client modes:
_xmpp-client._tcp  IN     SRV    5 0 5222 xmpp-gw.falcot.com.
_xmpp-server._tcp  IN     SRV    5 0 5269 xmpp-gw.falcot.com.

11.8.2. TURN サーバ

TURN は NAT ルータの背後にいるクライアントを助けるサービスであり、さらに他のクライアントと通信したり直接のメディアパスが見つからない状態でメディアストリームを中継する際に最も適切な方法を発見するファイアーウォールでもあります。エンドユーザに提供する RTC サービスをインストールする前に TURN をインストールすることを強く推奨します。
TURN とそれに関連する ICE プロトコルはオープン標準です。TURN および ICE プロトコルからの恩恵を受け、数多くの接続方法を提供してユーザの不満を低減するには、すべてのクライアントソフトウェアが ICE および TURN をサポートしている点を確認することが重要です。
ICE アルゴリズムを効果的に動作させるには、サーバが 2 種類の IPv4 アドレスを持つ必要があります。

11.8.2.1. TURN サーバのインストール

最初に resiprocate-turn-server パッケージをインストールします。
その後 /etc/reTurn/reTurnServer.config 設定ファイルを編集します。ここで忘れてはいけないのはサーバの IP アドレスを書き込むことです。
# your IP addresses go here:
TurnAddress = 198.51.100.19
TurnV6Address = 2001:DB8:1000:2000::19
AltStunAddress = 198.51.100.20
# your domain goes here, it must match the value used
# to hash your passwords if they are already hashed
# using the HA1 algorithm:
AuthenticationRealm = myrealm

UserDatabaseFile = /etc/reTurn/users.txt
UserDatabaseHashedPasswords = true
その後サービスを再起動してください。

11.8.2.2. TURN ユーザの管理

TURN サーバのユーザリストを管理するには htdigest ユーティリティを使います。
# htdigest /etc/reTurn/users.txt myrealm joe
サーバに /etc/reTurn/users.txt ファイルを再読み込みさせるにはファイル編集後に HUP シグナルを送信するか、/etc/reTurn/reTurnServer.config 内の自動再読み込み機能を有効化します。

11.8.3. SIP プロキシサーバ

SIP プロキシサーバはさまざまな組織、SIP トンネルプロバイダ、Asterisk などの SIP PBX、SIP フォン、SIP を使うソフトフォン、WebRTC アプリケーションなどの間での SIP 接続の着信および発信を管理します。
SIP PBX のセットアップを試みる前に SIP プロキシをインストールおよび設定することを強く推奨します。SIP プロキシは PBX に到達する数多くのトラフィックを正常化し、高い接続性能と復元性能をもたらします。

11.8.3.1. SIP プロキシのインストール

最初に repro パッケージをインストールします。repro パッケージは jessie-backports のパッケージを使うことを強く推奨します。なぜなら、jessie-backports のパッケージには接続性能と復元性能を最大化する最新の改良がなされているからです。
次に /etc/repro/repro.config 設定ファイルを編集します。ここでは必ずサーバの IP アドレスを記入してください。以下の例では TLS、IPv4、IPv6 を使う標準的な SIP および WebSockets/WebRTC を設定しています。
# Transport1 will be for SIP over TLS connections
# We use port 5061 here but if you have clients connecting from
# locations with firewalls you could change this to listen on port 443
Transport1Interface = 198.51.100.19:5061
Transport1Type = TLS
Transport1TlsDomain = falcot.com
Transport1TlsClientVerification = Optional
Transport1RecordRouteUri = sip:falcot.com;transport=TLS
Transport1TlsPrivateKey = /etc/ssl/private/falcot.com-key.pem
Transport1TlsCertificate = /etc/ssl/public/falcot.com.pem

# Transport2 is the IPv6 version of Transport1
Transport2Interface = 2001:DB8:1000:2000::19:5061
Transport2Type = TLS
Transport2TlsDomain = falcot.com
Transport2TlsClientVerification = Optional
Transport2RecordRouteUri = sip:falcot.com;transport=TLS
Transport2TlsPrivateKey = /etc/ssl/private/falcot.com-key.pem
Transport2TlsCertificate = /etc/ssl/public/falcot.com.pem

# Transport3 will be for SIP over WebSocket (WebRTC) connections
# We use port 8443 here but you could use 443 instead
Transport3Interface = 198.51.100.19:8443
Transport3Type = WSS
Transport3TlsDomain = falcot.com
# This would require the browser to send a certificate, but browsers
# don't currently appear to be able to, so leave it as None:
Transport3TlsClientVerification = None
Transport3RecordRouteUri = sip:falcot.com;transport=WSS
Transport3TlsPrivateKey = /etc/ssl/private/falcot.com-key.pem
Transport3TlsCertificate = /etc/ssl/public/falcot.com.pem

# Transport4 is the IPv6 version of Transport3
Transport4Interface = 2001:DB8:1000:2000::19:8443
Transport4Type = WSS
Transport4TlsDomain = falcot.com
Transport4TlsClientVerification = None
Transport4RecordRouteUri = sip:falcot.com;transport=WSS
Transport4TlsPrivateKey = /etc/ssl/private/falcot.com-key.pem
Transport4TlsCertificate = /etc/ssl/public/falcot.com.pem

# Transport5: this could be for TCP connections to an Asterisk server
# in your internal network.  Don't allow port 5060 through the external
# firewall.
Transport5Interface = 198.51.100.19:5060
Transport5Type = TCP
Transport5RecordRouteUri = sip:198.51.100.19:5060;transport=TCP

HttpBindAddress = 198.51.100.19, 2001:DB8:1000:2000::19
HttpAdminUserFile = /etc/repro/users.txt

RecordRouteUri = sip:falcot.com;transport=tls
ForceRecordRouting = true
EnumSuffixes = e164.arpa, sip5060.net, e164.org
DisableOutbound = false
EnableFlowTokens = true
EnableCertificateAuthenticator = True
さらに htdigest ユーティリティを使ってウェブインターフェース用の管理者パスワードを管理します。ユーザ名は admin でなければいけません。また、レルム名は repro.config で指定したものに一致しなければいけません。
# htdigest /etc/repro/users.txt repro admin
その後、新しい設定を使ってサービスを再起動します。

11.8.3.2. SIP プロキシの管理

ウェブインターフェース http://sip-proxy.falcot.com:5080 にアクセスして、ドメイン、ローカルユーザ、静的ルーティングを追加して設定を完了させます。
最初にローカルドメインを追加します。リストからドメインを追加したり削除したら、必ずこの作業をやり直す必要があります。
SIP プロキシはローカルユーザと完全な SIP アドレスの間で電話呼び出しをルーティングする方法を知っています。デフォルト設定を上書きする必要がある場合のみルーティング設定を行う必要があります。たとえば電話番号を認識させたり、プレフィックスを追加したり、SIP プロバイダに電話番号をルーティングする場合などがこれに相当します。

11.8.4. XMPP サーバ

XMPP サーバはローカル XMPP ユーザと公開インターネット上の他のドメインに所属する XMPP ユーザの間の接続を管理します。
Prosody は人気の XMPP サーバであり、Debian サーバ上で安定動作します。

11.8.4.1. XMPP サーバのインストール

最初に prosody パッケージをインストールします。prosody パッケージは jessie-backports のパッケージを使うことを強く推奨します。なぜなら、jessie-backports のパッケージには接続性能と復元性能を最大化する最新の改良がなされているからです。
次に /etc/prosody/prosody.cfg.lua 設定ファイルを検査します。ここではサーバを管理することを許可するユーザの JID を書き込むことを忘れないでください。
admins = { "joe@falcot.com" }
また、各ドメインに対する設定ファイルも必要です。/etc/prosody/conf.avail/example.com.cfg.lua からサンプルをコピーして、これを起点にしてください。以下は falcot.com.cfg.lua の例です。
VirtualHost "falcot.com"
        enabled = true
        ssl = {
                key = "/etc/ssl/private/falcot.com-key.pem";
                certificate = "/etc/ssl/public/falcot.com.pem";
                }
このドメインを有効化するには、このファイルへのシンボリックリンクを /etc/prosody/conf.d/ の中に作ってください。これを行うには以下のコマンドを実行します。
# ln -s /etc/prosody/conf.avail/falcot.com.cfg.lua /etc/prosody/conf.d/
その後、新しい設定を使ってサービスを再起動します。

11.8.4.2. XMPP サーバの管理

一部の管理操作は prosodyctl コマンドラインユーティリティを使って実行することが可能です。たとえば、/etc/prosody/prosody.cfg.lua の中に管理者アカウントを追加するには、以下のコマンドを実行します。
# prosodyctl adduser joe@falcot.com
設定をカスタマイズする方法に関する詳しい情報を参照するには Prosody のオンライン文書をご覧ください。

11.8.5. ポート 443 番でサービスを実行する

すべての RTC サービスをポート 443 番で実行したいと思う管理者がいるかもしれません。こうすることで、他のポートがふさがれていたり HTTP プロキシサーバを通じてインターネットトラフィックをルーティングしているような、ホテルや空港などのリモート場所から接続するユーザを受け入れることが可能になります。
この方針を採用する場合、それぞれのサービス (SIP、XMPP、TURN) に別々の IP アドレスを設定する必要があります。しかし、すべてのサービスは同じホスト上で運用することが可能です。なぜなら Linux は一台のホスト上で複数の IP アドレスを取り扱うことが可能だからです。この場合、それぞれのプロセスに対する設定ファイルおよび DNS SRV レコードの中でポート番号、ここでは 443 番、を指定しなければいけません。

11.8.6. WebRTC の追加

Falcot は顧客がウェブサイトから電話をかけることができるようしたいと思っています。また Falcot の管理者は障害復旧策の一部として WebRTC を使いたいと思っています。こうすることでスタッフは自宅からウェブブラウザを使って会社の電話システムにログインし、緊急時にも通常と同じ環境で作業を行うことが可能になります。
WebRTC は急速に進化している技術で、jessie-backports またはテスト版ディストリビューションに含まれるパッケージを使うことが不可欠です。
JSCommunicator は包括的かつノーブランドの WebRTC 電話で、PHP などのスクリプトサポートをサーバ側で用意する必要がありません。JSCommunicator はもっぱら HTML、CSS、JavaScript だけで作られています。JSCommunicator は他の数多くの WebRTC サービスの基盤となっており、先進的なウェブパブリッシングフレームワークの部品でもあります。
jscommunicator-web-phone パッケージをインストールすることは WebRTC 電話をウェブサイトにインストールする最も素早い方法です。このパッケージは WebSocket 転送をサポートする SIP プロキシを要求します。repro SIP プロキシで WebSocket 転送を有効化するために必要な詳細除法を参照するには第 11.8.3.1 節「SIP プロキシのインストール」をご覧ください。
jscommunicator-web-phone をインストールしたら、これを使う方法はさまざまあります。最も簡単な方法は、Apache 仮想ホスト設定ファイルから /etc/jscommunicator-web-phone/apache.conf を読みこんだり、Apache 仮想ホスト設定ファイルにこれをコピーする方法です。
この web-phone ファイルがウェブサーバから利用できるようになったら、/etc/jscommunicator-web-phone/config.js をカスタマイズして、TURN サーバと SIP プロキシを指定します。以下はその例です。
JSCommSettings = {

  // Web server environment
  webserver: {
    url_prefix: null            // If set, prefix used to construct sound/ URLs
  },

  // STUN/TURN media relays
  stun_servers: [],
  turn_servers: [
    { server:"turn:turn-server.falcot.com?transport=udp", username:"joe", password:"j0Ep455d" }
  ],

  // WebSocket connection
  websocket: {
      // Notice we use the falcot.com domain certificate and port 8443
      // This matches the Transport3 and Transport4 example in
      // the falcot.com repro.config file
    servers: 'wss://falcot.com:8443',
    connection_recovery_min_interval: 2,
    connection_recovery_max_interval: 30
  },

  ...
クリックして電話をかける機能を備えたウェブサイトのうち、より先進的なサイトでは、典型的にサーバ側スクリプトを使って config.js ファイルを動的に生成しています。DruCall のソースコードを読むと PHP を使って config.js ファイルを動的に生成する方法がわかります。