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
用のゾーンファイルに含める設定の見本は以下の通りです。
; すべてのサービスが実行されるサーバ
server1 IN A 198.51.100.19
server1 IN AAAA 2001:DB8:1000:2000::19
; 一部の TURN クライアントは IPv6 の取り扱いにバグがあるので TURN サービスは IPv4 アドレスのみ
turn-server IN A 198.51.100.19
; SIP サービス用の IPv4 と IPv6 アドレス。
sip-proxy IN A 198.51.100.19
sip-proxy IN AAAA 2001:DB8:1000:2000::19
; XMPP サービス用の IPv4 と IPv6 アドレス。
xmpp-gw IN A 198.51.100.19
xmpp-gw IN AAAA 2001:DB8:1000:2000::19
; STUN と TURN サービス用の DNS SRV および NAPTR レコード
_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.
; SIP サービス用の DNS SRV および NAPTR レコード
_sips._tcp IN SRV 0 1 5061 sip-proxy.falcot.com.
@ IN NAPTR 10 0 "s" "SIPS+D2T" "" _sips._tcp.falcot.com.
; XMPP サーバとクライアント用の DNS SRV レコード
_xmpp-client._tcp IN SRV 5 0 5222 xmpp-gw.falcot.com.
_xmpp-server._tcp IN SRV 5 0 5269 xmpp-gw.falcot.com.
TURN は NAT ルータの背後にいるクライアントを助けるサービスです。さらに TURN は他のクライアントと通信するための最も適切な方法、直接のメディアパスが見つからない状態でメディアストリームを中継するための最も適切な方法を発見するファイアウォールでもあります。エンドユーザに提供する RTC サービスをインストールする前に TURN サーバをインストールすることを強く推奨します。
TURN とそれに関連する ICE プロトコルはオープン標準です。TURN および ICE プロトコルからの恩恵を受け、数多くの接続方法を提供してユーザの不満を低減するには、すべてのクライアントソフトウェアが ICE および TURN をサポートしている点を確認することが重要です。
ICE アルゴリズムを効果的に動作させるには、サーバが 2 種類の公開 IPv4 アドレスを持つ必要があります。
11.8.2.1. TURN サーバのインストール
最初に resiprocate-turn-server パッケージをインストールします。
その後 /etc/reTurn/reTurnServer.config
設定ファイルを編集します。ここで忘れてはいけないのはサーバの IP アドレスを書き込むことです。
# 以下でサーバの IP アドレスを指定します。
TurnAddress = 198.51.100.19
TurnV6Address = 2001:DB8:1000:2000::19
AltStunAddress = 198.51.100.20
# 以下で認証レルム名を指定します。既にパスワードが HA1
# アルゴリズムでハッシュ化されているならば、この値はハッシュ化
# の際に使った認証レルム名と一致しなければいけません。
AuthenticationRealm = myrealm
UserDatabaseFile = /etc/reTurn/users.txt
UserDatabaseHashedPasswords = true
その後サービスを再起動してください。
TURN サーバのユーザリストを管理するには htdigest ユーティリティを使います。
#
htdigest /etc/reTurn/users.txt myrealm joe
サーバに /etc/reTurn/users.txt
ファイルを再読み込みさせるにはファイル編集後に HUP シグナルを送信するか、/etc/reTurn/reTurnServer.config
内の自動再読み込み機能を有効化します。
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
設定ファイルを編集します。ここでは必ず SIP プロキシサーバの IP アドレスを記入してください。以下の例では TLS、IPv4、IPv6 を使う標準的な SIP および WebSockets/WebRTC を設定しています。
# 以下では TLS 上の SIP 接続用に Transport1 を設定しています。ポート
# 5061 番を指定していますが、ファイアウォールの背後にいるクライアント
# を考慮する必要があるならば、ポート 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 は IPv6 向けの 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
# 以下では WebSocket (WebRTC) 上の SIP 接続用に Transport3 を設定
# しています。ポート 8443 番の代わりに 443 番を使うことも可能です。
Transport3Interface = 198.51.100.19:8443
Transport3Type = WSS
Transport3TlsDomain = falcot.com
# ブラウザに証明書を送信するよう要求しますが、現在これをサポートする
# ブラウザは存在しませんので 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 は IPv6 向けの 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 は内部ネットワーク上の Asterisk サーバに対する
# TCP 接続を可能にするものです。ファイアウォールを設定して、
# ポート 5060 番を通過する通信を外部に漏らさないようにしてください。
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
その後、新しい設定を使ってサービスを再起動します。
それではウェブインターフェース http://sip-proxy.falcot.com:5080
にアクセスして、ドメイン、ローカルユーザ、静的ルーティングを追加して設定を完了させましょう。
最初にローカルドメインを追加します。リストからドメインを追加したり削除したら、必ずこの作業をやり直す必要があります。
SIP プロキシはローカルユーザと完全な SIP アドレスの間で電話呼び出しをルーティングする方法を知っています。デフォルト設定を上書きする必要がある場合のみルーティング設定を行う必要があります。たとえば電話番号を認識させたり、プレフィックスを追加したり、SIP プロバイダに電話番号をルーティングする場合などがこれに相当します。
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";
}
falcot.com
ドメインを有効化するには、このファイルへのシンボリックリンクを /etc/prosody/conf.d/
の中に作ってください。これを行うには以下のコマンドを実行します。
#
ln -s /etc/prosody/conf.avail/falcot.com.cfg.lua /etc/prosody/conf.d/
その後、新しい設定を使ってサービスを再起動します。
一部の管理操作は prosodyctl
コマンドラインユーティリティを使って実行することが可能です。たとえば、/etc/prosody/prosody.cfg.lua
の中で指定した管理者アカウントをユーザアカウントに追加するには、以下のコマンドを実行します。
# prosodyctl adduser joe@falcot.com
11.8.5. ポート 443 番でサービスを実行する
すべての RTC サービスをポート 443 番で実行したいと思う管理者がいるかもしれません。こうすることで、他のポートがふさがれていたり HTTP プロキシサーバを通じてインターネットトラフィックをルーティングしているような、ホテルや空港などのリモート場所から接続するユーザを受け入れることが可能になります。
この方針を採用する場合、それぞれのサービス (SIP、XMPP、TURN) に別々の IP アドレスを設定する必要があります。しかし、すべてのサービスは同じホスト上で運用することが可能です。なぜなら Linux は 1 台のホスト上で複数の IP アドレスを取り扱うことが可能だからです。この場合、それぞれのサービスに対する設定ファイルおよび DNS SRV レコードの中でポート番号 (今回の場合 443 番) を指定しなければいけません。
Falcot は顧客がウェブサイトから電話をかけることができるようしたいと思っています。また Falcot の管理者は障害復旧策の一部として WebRTC を使いたいと思っています。こうすることでスタッフは自宅からウェブブラウザを使って会社の電話システムにログインし、緊急時にも通常と同じ環境で作業を行うことが可能になります。
WebRTC は急速に進化している技術で、jessie-backports またはテスト版ディストリビューションに含まれるパッケージを使うことが不可欠です。
JSCommunicator は包括的かつノーブランドの WebRTC 電話で、PHP などのスクリプトサポートをサーバ側で用意する必要がありません。JSCommunicator はもっぱら HTML、CSS、JavaScript だけで作られています。JSCommunicator は他の数多くの WebRTC サービスの基盤となっており、先進的なウェブパブリッシングフレームワークの部品でもあります。
jscommunicator-web-phone パッケージをインストールすることは WebRTC 電話をウェブサイトにインストールする最も素早い方法です。
jscommunicator-web-phone パッケージを使うには 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 = {
// ウェブサーバ環境
webserver: {
url_prefix: null // 設定済みならば、その値を sounds/ 以下の URL に前置します
},
// STUN/TURN メディアリレー
stun_servers: [],
turn_servers: [
{ server:"turn:turn-server.falcot.com?transport=udp", username:"joe", password:"j0Ep455d" }
],
// WebSocket 接続
websocket: {
// ここでは falcot.com ドメイン証明書とポート 8443 番を
// 指定しています。これは falcot.com 用 repro.config
// ファイルの Transport3 および Transport4 に相当します
servers: 'wss://falcot.com:8443',
connection_recovery_min_interval: 2,
connection_recovery_max_interval: 30
},
...
クリックして電話をかける機能を備えたウェブサイトの中でもさらに先進的なサイトでは、典型的にサーバ側スクリプトを使って
config.js
ファイルを動的に生成しています。
DruCall のソースコードを読むと PHP を使って
config.js
ファイルを動的に生成する方法がわかります。
この章では、利用できるサーバソフトウェアのうちのほんのわずかなソフトウェアだけに注目しました。しかしながら、ほとんどの一般的なネットワークサービスについて言及しました。今や、より技術的な章に入る準備が整ったと言えます。具体的に言えば、一部の概念に関してより詳細を解説し、大規模な配備と仮想化について説明します。