2022-08-18 2022-08-18

websocketによるストリーミング機能をインターネット越しに利用するために通信を中継するサーバーを作成する手順を紹介します。


WebRTCはネットワークのセキュリティー対策によって接続できないことがあります。特に企業や学校といった組織ではFirewallが設置されていることがほとんどです。そのようなケースでは通信ポートの制限などによって接続ない場合があり、それを回避できないかどうかセキュリティー担当者に相談しても対応してもらうことは難しいかもしれません。

そこで今回はWebRTCを使わず、websocket通信でインターネット越しに通信できるようにするために、websocket通信をリレーするサーバーを作成する手順をご紹介します。

中継サーバーを建ててみよう


中継サーバーを用意する

まず、中継サーバーとしてグローバルIPが分かるサーバーを用意します。サーバーはAWSやVPSなど、お好きなものをご利用ください。利用できるサーバーをお持ちでなかったり、別で簡単に試したいなら、Linode(最近Akamaiに買収されました)の月額5USDのNanodeプランがおすすめです。海外のVPSサービスですが日本のリージョンも選択できます。サーバーを時間単位課金で作ってすぐ捨てる事が出来きます。従量課金ではないので、データ量の多い映像通信に使っても安心です。

新規でサーバーを契約した場合は、最低限のセキュリティ対策を実施しましょう。

【チュートリアル】VPSを借りたらやるべき最低限のセキュリティ初期設定

今回の記事では中継サーバーはUbuntuがインストールされていると仮定します。作業PCはMacとします。

ポートフォワーディング専用ユーザーの作成

ビューワーとカメラは双方向で通信します。中継サーバーとカメラデバイスの通信はsshのポートフォワーディングを利用します。ポートフォワーディングを利用するためにカメラデバイスからsshで中継サーバーにログインできる環境を作る必要がありますが、ログインして色々操作されては困るため、「ほとんど何もできないユーザー」を作って、sshはそのユーザーを利用するようにします。

中継サーバーにログインします。

まずユーザー追加します。portforward_userはユーザー名です。お好きな名前に置き換えることができます。

$ sudo adduser portforward_user

権限制限のシェルrbashを作成します(なければ)

$ ln -s /bin/bash /bin/rbash
#すでに存在する場合はエラーが表示されます。ln: failed to create symbolic link '/bin/rbash': File exists

/etc/shellsにrbashを登録します。ただしrbashが元々存在する場合は不要です。(ここではテキストエディタはnanoを使用しています。お好きなものをご利用ください)

$ sudo nano /etc/shells
...
/bin/csh
/bin/ksh
/bin/zsh
/bin/rbash #この行を追加します

ユーザーを切り替えます。

$ su - portforward_user

シェルを切り替えます。これでシェルがrbash(制限付きのbash)になります。

$ chsh
Password: #パスワードはなし
新しいシェル [/bin/bash]: /bin/rbash #/bin/rbashを入力します

ssh接続を安全かつ簡単にできるように公開鍵認証を利用します。公開鍵・秘密鍵を作業PCで作成しておきます。以下のコマンドを実行するとファイル名を聞かれるのでお好きなように命名します。ここではpf_rsaとします。

@作業PC
$ cd ~/.ssh #なければmkdir ~/.ssh
$ ssh-keygen -t rsa

権限を制限します。

@作業PC
$ chmod 600 ~/.ssh/pf_rsa

ここからの作業は中継サーバーに戻ります。

sshディレクトリ作成します(なければ)

$ su - portforward_user
$ mkdir ~/.ssh

ssh-keygenで生成した.pubファイルの中身をコピペで追記します。

$ nano ~/.ssh/authorized_keys

権限を限定します。

$ chmod 600 ~/.ssh/authorized_keys

rootでログインしなおします

$ su -

portforward_userのホームディレクトリにある.bash_profileのユーザーとグループをrootに変更 し、root以外が変更できないようにアクセス権を設定します。.bash_profileが無い場合は.profileで同様の内容を実施します。

$ cd /home/portforward_user
$ chown root .bash_profile #所有者をrootに変更。.bash_profileが無い場合は.profile
$ chgrp root .bash_profile #グループをrootに変更。.bash_profileが無い場合は.profile
$ chmod 755 .bash_profile #アクセス権を変更。.bash_profileが無い場合は.profile

portforward_userがsshを利用できるように設定します。

$ nano .bash_profile #.bash_profileが無い場合は.profile
# 最下行に以下の記述を追加します。
export PATH=/home/portforward_user

$ ln -s /bin/ssh /home/portforward_user/ssh

Firewall設定

通信用ポートを開いておく必要があります。

ここではファイヤーウォールにufwを使用した例でご紹介します。

まずインストールします(なければ)。

$ sudo apt-get install ufw

ポートを開きます

$ sudo ufw allow 8080
$ sudo ufw allow 80
$ sudo ufw allow 22

サービスを有効化して開始します。

$ systemctl enable ufw
$ systemctl start ufw
$ sudo ufw enable

備考:状態確認

$ sudo ufw status

Varnish

Varnishはリバースプロキシです。通常はCDNとして利用されることが多いですが、今回はビューワーとカメラデバイスの通信をリレーするための機能として利用します。ビューワーはグローバルIPの中継サーバーにリクエストを送り、それをVarnishが受けて、カメラのデバイスのポートフォワーディングに流すという形です。

Varnishをインストールします。

$ sudo apt-get install varnish

Varnishの待ち受けポートを変更します。

$ sudo nano /etc/systemd/system/multi-user.target.wants/varnish.service
# -a :6081の部分を -a :80に変更します。

Websocketをリレーしてカメラデバイスのポートフォワーディングに接続するように、設定ファイルを変更します。

デフォルトファイルをリネームしてバックアップしておきます。

$ sudo mv /etc/varnish/default.vcl /etc/varnish/default.vcl.bak

新しいファイルを開いて

$ sudo nano /etc/varnish/default.vcl

以下を書き込みます

vcl 4.0;

import std;

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv {
    if (req.http.upgrade ~ "(?i)websocket") {
        #if (!std.fnmatch("*k=your_key", req.url, 0)){
            #return(synth(403, "Access denied"));
        #}

        return (pipe);
    }
    return (pass);
}

sub vcl_pipe {
    if (req.http.upgrade) {
        set bereq.http.upgrade = req.http.upgrade;
        set bereq.http.connection = req.http.connection;
    }
}

sub vcl_backend_response {
}

sub vcl_deliver {
}

再起動して変更を適用します

$ systemctl daemon-reload
$ sudo systemctl restart varnish

 


接続する

カメラデバイス

ターミナルを2枚開きます。

ターミナル1枚目:

IP_OF_RELAYは中継サーバーのIPを入力します。これはリモート側の8080ポートとローカル側の9001を接続します。sshのポート番号を変更している場合は-pの番号をそれに合わせて変更します。

ssh portforward_user@IP_OF_RELAY -i ~/.ssh/pf_rsa -R 8080:localhost:9001 -p 22

ターミナル2枚目:

pserverの起動コマンドを実行します
コマンドについてはこちらのリンクを参照ください
https://blog.picam360.com/startpicam360withjetsonnano-6_jp/

ビューワー

websocketで接続します。アプリのWEBSOCKET欄に中継サーバーのIPアドレスとポートを入力します。

ws://IP_OF_RELAY:80

connect screen

以上、中継サーバーの作成手順でした。


Picam360リンク: