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通りで接続を確認した。オッケー!