手帳

  • 2022-07-06
  • IT系

さて、IT技術者としてはスキルが乏しいので、最近友達から情報をもらって少しでも自分の知見を広げようとしています。

Unreal Engine5もそうなのですが、今回はWebRTCという技術です。

リアルタイムで音声や映像などを通じたコミュニケーションについてはSkypeやLINEなどのVoIP/VoLTEという技術がありましたがそれを利用して通信機能やサービスを利用するのにはかなり大変でした。

しかし(何年頃からかは知りませんが)今ではブラウザがWebRTCという技術を実装してくれているので、自分のような弱小技術者でも比較的に時間をかけずにサービスをを開始することができるようになっています。

実際はクライアント環境(ブラウザ、ネットワークなど)の違いについて細かく解消するのが大変なので、既存のサービス用のSDKを使ってサービスをお客さんに提供する予定ですが、その技術について勉強することで新しい知見を得られるのが楽しそうなのでちょっと足を踏み入れてみました。

参考

WebRTCの歴史とこれから – Speaker Deck

0. coTURNのインストール準備

PC同士で直接データのやり取りをするためにはいくつかの問題がありますが、「データを送信したい相手をどうやって探し出すか」というのが難しい問題となります。

それを解決するための専用のサーバーがSTUN・TURNサーバーです。

参考)【初心者向け】STUN/TURNサーバをざっくり解説してみた – Qiita

coTURNというのは、このSTUN/TURNサーバーを実装してくれるオープンソースソフトウェアです。

OSSは無料で使えるのですが、知識が乏しい自分にとって自分のサーバー環境でインストールする時に必要なカスタマイズに時間を取られたくないので、人様が使っているものと同じものと利用してみたいと思います。

0-1) Amazon EC2でUbuntu18.04をインストール

これは本家を参考にしてもらえれば完璧かと。自分ですら何も見ずにEC2でUbuntu18.04をインストールしたインスタンスを開始できたのでとにかくやってみれば楽ちんかと。

参考)チュートリアル: Amazon EC2 Linux インスタンスの開始方法 – Amazon Elastic Compute Cloud

0-2) ポートの開放

次にサーバーとの通信で使うポートを開けてあげます。AWS EC2の管理画面から利用しているインスタンスをクリックして、下の方にあるセキュリティタブを開きます。

まだセキュリティグループは1つしか無いのでそれをクリックし、「インバウンドルールのルールを編集」で開放するポートを追加します。

実際に設定するのは、以下のスクショのWebRTCとコメントしている内容です。

HTTPとHTTPSについては最初から設定してあるはずです。

他にもSSHのポートなどありますがそれは絶対に極秘です。

0-2) IPアドレスでSSL証明書を発行(ZeroSSLを利用)

Let’s EncryptのSSLでも行けるという話が最近はありますが、そちらは独自ドメインの取得がヒッツなので、今回はIPアドレスだけでサーバー証明書(SSL証明書)がもらえるzeroSSLを使うことにします。

Free SSL Certificates and SSL Tools – ZeroSSL

実際の取得方法については特に困ったところがなかったので割愛します。

ZeroSSLでもらった

  • ca_bundle.crt:中間証明書
  • certificate.crt:SSL証明書・サーバー証明書
  • private.key:SSLの秘密鍵

※SSL証明書と秘密鍵が対になっている。それと中間証明書とSSLの証明書をまとめたのが完全な証明書(Fullchain)ということになります。

は、とりあえず、

crtファイルは、/etc/ssl/に、keyファイルは/etc/ssl/keyディレクトリに一旦アップロードします。

※ローカルPCからサーバー内にアップするのには、Teratermだと「ファイル>SSH SCP」利用するのが便利です。

coTURNでは、完全な証明書が必要なので、

sudo cp /etc/ssl/certificate.crt /etc/ssl/certificate.crt.original
sudo cat /etc/ssl/ca_bundle.crt >> /etc/ssl/certificate.crt 

で、certificate.crtのバックアップをとりつつ、ca_bundle.crtファイルの中身をcertificate.crtに追記してあげます。

1. coTURNのインストールと設定

基本的にはこちらのサイトのとおりです。

Setup Your Own CoTurn Server Using AWS EC2 Instance | by Narendiran Krishnan | The Startup | Medium

ここまででStep 2: EC2 Instance security group settingsが終了しています。

Step 5: Make changes in the turnserver.conf file / coturn setting fileで、turnserver.confの内容を自分は以下のようにしました。

listening-port=3478 #アンコメント
tls-listening-port=5349 #アンコメント
min-port=49152 #アンコメント
max-port=65535 #アンコメント
fingerprint #アンコメント
lt-cred-mech #アンコメント
server-name=12.345.678.910 #Amazon EC2の該当インスタンスのパブリック IPv4 アドレス
realm=12.345.678.910 #Amazon EC2の該当インスタンスのパブリック IPv4 アドレス

#certとpkeyのファイルは、先程アップロードした&完全な証明書を指定
#cert=/usr/local/etc/turn_server_cert.pem
cert=/etc/ssl/certificate.crt
#pkey=/usr/local/etc/turn_server_pkey.pem
pkey=/etc/ssl/private/private.key

cipher-list="ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS" #アンコメントして記載
dh2066 #アンコメント
log-file=/var/log/turn.log #アンコメント
simple-log #アンコメント
no-tlsv1 #アンコメント
no-tlsv1_1 #アンコメント

それとユーザーを追加してあげます

sudo turnadmin -a -u userhogehoge -r 12.345.678.910 -p hogehogepassword

※12.345.678.910は、turnserver.confのrealmで設定した値です。(今回はIPアドレス)

sudo systemctl start coturn

でサーバーを起動し、稼働状況を確認した時に以下の写真のようになっていればOKです。

sudo systemctl status coturn

2. TURNサーバーの確認

ちゃんとTURNサーバーとして働いているかどうかを確認するために以下のサイトでチェックしてみます。

Trickle ICE

まず、デフォルトに設定されているGoogleのSTUNサーバーを削除し、先程設定したTURNサーバーを入力。

※IPアドレスの後ろに、:3478?transport=tcpをつけて下さい。
3478は、turnserver.confで「listening-port」で設定したポート番号です。

Add Serverボタンを押します。

あとは、下の方にあるGather candidateを押す。

こんな感じで、Component Typeの最後にrelayがあって、その次にDoneの表記が出ていればOK。

クライアント環境によっては、TLSを使って遣り取りをする必要があるためそちらの方も確認してあげます。

先程登録したサーバーをクリックして「Remove Server」を押して設定を削除し、今度はturnsの設定を入れてあげます。

※IPアドレスの後ろに、:5349?transport=tcpをつけて下さい。
5349は、turnserver.confで「tls-listening-port」で設定したポート番号です。

先ほどと同じようにGather candidatesを押して、同様の結果が出れば成功です。