https://github.com/matrix-org/synapse/blob/develop/docs/turn-howto.md を読みながらVoIP用のTURNサーバを設置してSynapseから使うよう設定する。 ubuntuのパッケージを使うだけのお手軽版。


Turnサーバを用意してUbuntuのパッケージを入れる

試験環境
# cat /etc/issue
Ubuntu 20.04.1 LTS \n \l
パッケージのインストール
# apt-get update
# apt install coturn pwgen

サーバ証明書をコピーする

coturnはturnserverユーザの権限でサーバ証明書を読もうとするが、/etc/letsencrypt/live はrootしかアクセスできない。 coturnの設定ファイルにproc-user=rootと書くのも試したがcoturnごと落ちるので、 turnserverユーザだけ読める位置に証明書のコピーを置くことにした。

(turnserverユーザ/グループはubuntuのcoturnパッケージのインストール時に作成されます)

#/bin/bash
set -eux
SRCDIR=/etc/letsencrypt/live/juggler.jp
DSTDIR=/***********
mkdir -p $DSTDIR
cp $SRCDIR/fullchain.pem $SRCDIR/privkey.pem $DSTDIR/
chown -R turnserver:turnserver $DSTDIR
chmod -R o-rwx $DSTDIR

証明書更新の度に行う作業が増えたので、手持ちの更新手順書を更新しておく。


Turnサーバの設置

設定ファイルの存在確認
# cd /etc
# ls -ld turnserver.conf
-rw-r--r-- 1 root root 25983 Dec 14 22:50 turnserver.conf
オリジナルの保存
# cp -a turnserver.conf turnserver.conf.orig
static-auth-secret の生成
# pwgen -s 64 1
Ohf7hPHTVUp6hWD5RSbiCw897gimqU0FjQrvCspbs4BH842ooRwCEG534UkL1nvN

(これはサンプルです。私はこの値を使っていません。)

設定ファイルの編集
 # diff -Naru0 turnserver.conf.orig turnserver.conf
--- turnserver.conf.orig        2020-12-14 22:50:15.000000000 +0900
+++ turnserver.conf     2021-03-08 10:23:54.468540036 +0900
@@ -18 +18 @@
-#listening-port=3478
+listening-port=3478
@@ -30 +30 @@
-#tls-listening-port=5349
+tls-listening-port=5349
@@ -41 +41 @@
-#alt-listening-port=0
+alt-listening-port=0
@@ -46 +46 @@
-#alt-tls-listening-port=0
+alt-tls-listening-port=0
@@ -54,0 +55 @@
+listening-ip=153.126.151.77
@@ -154 +155 @@
-#verbose
+verbose
@@ -217 +218 @@
-#use-auth-secret
+use-auth-secret
@@ -225 +226 @@
-#static-auth-secret=north
+static-auth-secret=Ohf7hPHTVUp6hWD5RSbiCw897gimqU0FjQrvCspbs4BH842ooRwCEG534UkL1nvN
@@ -339 +340 @@
-#realm=mycompany.org
+realm=turn.juggler.jp
@@ -352,0 +354 @@
+user-quota=12 # 4 streams per video call, so 12 streams = 3 simultaneous relayed calls per user.
@@ -358,0 +361 @@
+total-quota=1200
@@ -403 +406 @@
-#no-tcp-relay
+no-tcp-relay
@@ -439 +442 @@
-#cert=/usr/local/etc/turn_server_cert.pem
+cert=/********/fullchain.pem
@@ -446 +449 @@
-#pkey=/usr/local/etc/turn_server_pkey.pem
+pkey=/********/privkey.pem
@@ -605,0 +609,4 @@
+denied-peer-ip=10.0.0.0-10.255.255.255
+denied-peer-ip=192.168.0.0-192.168.255.255
+denied-peer-ip=172.16.0.0-172.31.255.255
+allowed-peer-ip=153.126.151.77
coturn の再起動
# systemctl restart coturn
Listenアドレスとポートの確認
# netstat -nlap |grep turn
tcp        0      0 153.126.151.77:3478     0.0.0.0:*               LISTEN      nnn/turnserver
tcp        0      0 153.126.151.77:3478     0.0.0.0:*               LISTEN      nnn/turnserver
tcp        0      0 153.126.151.77:3478     0.0.0.0:*               LISTEN      nnn/turnserver
tcp        0      0 153.126.151.77:3478     0.0.0.0:*               LISTEN      nnn/turnserver
tcp        0      0 153.126.151.77:5349     0.0.0.0:*               LISTEN      nnn/turnserver
tcp        0      0 153.126.151.77:5349     0.0.0.0:*               LISTEN      nnn/turnserver
tcp        0      0 153.126.151.77:5349     0.0.0.0:*               LISTEN      nnn/turnserver
tcp        0      0 153.126.151.77:5349     0.0.0.0:*               LISTEN      nnn/turnserver
sctp                153.126.151.77:3478                             LISTEN      nnn/turnserver
sctp                153.126.151.77:3478                             LISTEN      nnn/turnserver
sctp                153.126.151.77:3478                             LISTEN      nnn/turnserver
sctp                153.126.151.77:3478                             LISTEN      nnn/turnserver
sctp                153.126.151.77:5349                             LISTEN      nnn/turnserver
sctp                153.126.151.77:5349                             LISTEN      nnn/turnserver
sctp                153.126.151.77:5349                             LISTEN      nnn/turnserver
sctp                153.126.151.77:5349                             LISTEN      nnn/turnserver
udp        0      0 153.126.151.77:5349     0.0.0.0:*                           nnn/turnserver
udp        0      0 153.126.151.77:5349     0.0.0.0:*                           nnn/turnserver
udp        0      0 153.126.151.77:5349     0.0.0.0:*                           nnn/turnserver
udp        0      0 153.126.151.77:5349     0.0.0.0:*                           nnn/turnserver
udp        0      0 153.126.151.77:3478     0.0.0.0:*                           nnn/turnserver
udp        0      0 153.126.151.77:3478     0.0.0.0:*                           nnn/turnserver
udp        0      0 153.126.151.77:3478     0.0.0.0:*                           nnn/turnserver
udp        0      0 153.126.151.77:3478     0.0.0.0:*                           nnn/turnserver
unix  2      [ ]         DGRAM                    16971766 nnn/turnserver

turnサーバでの作業はここまで。


Synapseサーバの設定変更

homeserver.yamlの編集

(turn関係だけ抜粋)

$ diff -Naru0 homeserver.yaml.orig homeserver.yaml
--- homeserver.yaml.orig        2021-03-07 01:18:59.548334869 +0900
+++ homeserver.yaml     2021-03-08 10:25:32.221379383 +0900
@@ -1086 +1096,6 @@
-#turn_uris: []
+turn_uris: [
+  "turns:turn.juggler.jp?transport=udp",
+  "turns:turn.juggler.jp?transport=tcp",
+  "turn:turn.juggler.jp?transport=udp",
+  "turn:turn.juggler.jp?transport=tcp"
+]
@@ -1090 +1105 @@
-#turn_shared_secret: "YOUR_SHARED_SECRET"
+turn_shared_secret: "Ohf7hPHTVUp6hWD5RSbiCw897gimqU0FjQrvCspbs4BH842ooRwCEG534UkL1nvN"
@@ -1100 +1115 @@
-#turn_user_lifetime: 1h
+turn_user_lifetime: 1h
@@ -1108 +1123 @@
-#turn_allow_guests: true
+turn_allow_guests: false
Synapseの再起動
$ docker-compose down && docker-compose up -d

動作確認

https://test.voip.librepush.net/ で緩いテストが行える。

  • voIPテスト用のMatrixユーザを作っておく
  • サイトURL、ユーザ、パスワードをテストサイトに指定する

テスト結果

一回目

エラーとなった。証明書の問題でcoturnがポート5349をListenしていなかった。syslogに警告が出てた。証明書を読める位置にコピーして対応した。

二回目

TURN onlyでSTUNをサポートしていないと言われた。Synapseの設定にturns: スキーマだけではなく turn: スキーマを追加した。

三回目

ポート443でもListenすればファイアウォールを越えられるぞと言われたが、悪いな443はnginxに使わせてるんだ。今回は手を加えない。


動作確認(手動)

Android端末二つで{Wifi,au} x {Wifi,docomo系NVMO} の組み合わせ4通りで接続を確認した。オッケー!