Skip to content

Instantly share code, notes, and snippets.

@uemuraj
Last active December 27, 2020 00:47
Show Gist options
  • Select an option

  • Save uemuraj/1909514059a056f3a024 to your computer and use it in GitHub Desktop.

Select an option

Save uemuraj/1909514059a056f3a024 to your computer and use it in GitHub Desktop.
TURNサーバの構築

TURNサーバの構築

WebRTCを使ってみよう! で紹介されている rfc5766-turn-server は既に更新が終わり、別のプロジェクトになっています。

coturn を代わりに使用します。 https://github.com/coturn/coturn/wiki/Downloads から最新バージョンをダウンロードしてビルドします。

※ダウンロードページに turnserver-*-amazon-aws-ec2-x86_64.txt というファイルあり! EC2 ではこの内容にも注意すること

ビルドに必要なパッケージをインストール

$ sudo -s
# cd
# yum -y install openssl openssl-devel sqlite sqlite-devel libevent libevent-devel
# yum -y install make gcc

ソースコードをダウンロードしてビルド

# wget http://turnserver.open-sys.org/downloads/v4.5.0.3/turnserver-4.5.0.3.tar.gz
# tar xzf turnserver-4.5.0.3.tar.gz 
# cd turnserver-4.5.0.3
# ./configure
# make
# make install

雛形から設定ファイルを作成

# cp /usr/local/etc/turnserver.conf.default /usr/local/etc/turnserver.conf
# vi /usr/local/etc/turnserver.conf

設定ファイルの変更点は以下の通り: WebRTCを使ってみよう! とは似ていても異なるので注意

  • listening-port=80
  • tls-listening-port=443
  • listening-ip=xxx.xx.x.xx … サーバのプライベートIP
  • relay-ip=xxx.xx.x.xx … サーバのプライベートIP
  • external-ip=xx.xx.xx.xx … サーバのパブリックIP
  • lt-cred-mech … コメントを外して有効化
  • userdb=/usr/local/var/db/turndb … ローカルでビルドした場合は場所が異なる
  • realm=example.com … 使用したい名前に変える
  • cert=/usr/local/etc/turn_server_cert.pem … コメントを外して有効化(実際にこのファイルも用意する必要あり)
  • pkey=/usr/local/etc/turn_server_pkey.pem … 同上

サーバ証明は Let's Encrypt で取得しました:

# cp /etc/letsencrypt/live/turn.example.com/fullchain.pem /usr/local/etc/turn_server_cert.pem
# cp /etc/letsencrypt/live/turn.example.com/privkey.pem /usr/local/etc/turn_server_pkey.pem

ユーザを追加

https://github.com/coturn/coturn/wiki/CoturnConfig を参考にしてください。

# export PATH=$PATH:/usr/local/bin
# turnadmin -a -u ninefingers -p youhavetoberealistic -r example.com

ユーザ情報の管理に SQLite データベースを使用する設定になっているので、以下のコマンドで内容を確認してみてください。

# sqlite3 /usr/local/var/db/turndb "SELECT * FROM turnusers_lt"

サービスを起動

最初は手で起動して機能することを確かめます:

# /usr/local/bin/turnserver -v -c /usr/local/etc/turnserver.conf

機能することが分かったらデーモンスクリプトを書きます: EC2 向けにアドレスを書き換える処理が入れてあります

/etc/init.d/turnserver
#!/bin/bash
### BEGIN INIT INFO
# Provides:          STUN/TURN
# Required-Start:    $local_fs $network $remote_fs
# Should-Start:
# Required-Stop:     $local_fs $network $remote_fs
# Should-Stop:
# Default-Start:     3 4 5
# Default-Stop:      0 1 2 6
# Short-Description: a TURN relay server
# Description:       a TURN relay server implementation.
### END INIT INFO

. /etc/init.d/functions

PID_FILE="/var/run/turnserver.pid"

case $1 in

  start)
        echo -n "Starting turnserver "

        LOCAL=$(/usr/bin/curl -s http://169.254.169.254/latest/meta-data/local-ipv4)
        EXTERNAL=$(/usr/bin/curl -s http://169.254.169.254/latest/meta-data/public-ipv4)

        /bin/sed -i "s/^relay-ip=[0-9.]*/relay-ip=${LOCAL}/" /usr/local/etc/turnserver.conf
        /bin/sed -i "s/^listening-ip=[0-9.]*/listening-ip=${LOCAL}/" /usr/local/etc/turnserver.conf
        /bin/sed -i "s/^external-ip=[0-9.]*/external-ip=${EXTERNAL}/" /usr/local/etc/turnserver.conf

        /usr/local/bin/turnserver --daemon --pidfile "$PID_FILE" -c /usr/local/etc/turnserver.conf > /dev/null
        RETVAL=$?
        if [ $RETVAL = 0 ]; then
            echo_success
        else
            echo_failure
        fi
        echo
        ;;
  stop)
        echo -n "Shutting down turnserver "
        killproc -p "$PID_FILE" turnserver
        RETVAL=$?
        echo
        ;;
  status)
        status -p "$PID_FILE" turnserver
        RETVAL=$?
        ;;
  *)
        echo "Usage: $(basename "$0") { start | stop | status }"
        ;;
esac

exit $RETVAL

後はサービス登録すればいつも通り使えます。

# chmod +x /etc/init.d/turnserver
# chkconfig --add turnserver
@uemuraj
Copy link
Copy Markdown
Author

uemuraj commented Dec 27, 2020

2016年1月に書いたものです。
ちょっと古いので、あまりあてにしないでくださいね...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment