架設 TURN server (coturn)

Hsu Jerry
8 min readMar 19, 2021

--

Photo by Filip Mroz on Unsplash

最近工作上需要開發webrtc ,雖然 google 有提供免費的STUN server ,但是真正在生產環境中,僅僅是靠STUN server來實現P2P轉發是不夠的,在對等NAT 下的客戶端是無法透過STUN來連線的,這時候我們就需要架設TURN server了。

目前比較簡易實現的開源TURN server 框架是COTURN這個套件,這裡將我安裝(踩雷)的步驟記錄下來,以免忘記,也提供給需要的人一些指引。

在開始之前

首先說明COTURN 是一套包含TURN和STUN server的套件,但是安裝之前有一些限制,如果是跟筆者一樣是個網路小白的話建議閱讀一下 :

  1. 必須安裝在Linux 系統下,筆者選擇的系統是Ubuntu 18.04 LTS
  2. 必須有一個固定IP
  3. COTURN 對硬體要求不高,但是對網路頻寬要求很高
  4. 必須要有一個網域,如果沒有的話下面的教學會提供一個免費申請網域的網站,但是免費網域只有30天
  5. 最好有SSL憑證,沒有的話下面會提供申請免費 SSL的辦法

正文開始

(1) 安裝coturn server

  1. 更新存儲庫
    sudo apt-get update
  2. 安裝Coturn
    sudo apt-get install coturn
  3. 安裝完成後,coturn服務將自動啟動。我們需要停止它以完成配置:
    sudo systemctl stop coturn
  4. 現在,我們將設置一個將運行Turnserver進程的用戶。該用戶將被添加到Turnserver的配置設置中,請自行替換<turnadmin>:
    sudo adduser <turnadmin>
    (為turnadmin設置密碼以完成該過程。不必使用turnadmin作為用戶。您可以設置任何用戶-新用戶或現有用戶)
  5. 現在,我們將turnadmin添加到該root組。這是必需的,因為在某些情況下,turnadmin進程無法訪問某些資源,否則將無法啟動,請自行替換<turnadmin>。
    sudo usermod -a -G root <turnadmin>

(2) 申請免費網域(如果有自己的域可以跳過)

  1. 網址: https://www.noip.com/
  2. 進入網址申請免費帳戶,免費帳戶最多可申請3組免費域名
  3. Hostname 打上你想設定的網址名稱,Record type 選DNS HOST(A),Domain 選一組你自己順眼的,IPV4 Address 打上你的公用IP,然後點選creathostname
    注意 : 免費帳戶申請的hostname 只有30天有效期,過期必須再次申請

(3) 申請SSL證書(如果自己有SSL證書就可跳過)

  1. 如果僅將Coturn用作STUN服務器,則此步驟是可選的。如果要將其實現為TURN服務器,則需要SSL。
    sudo apt-get install certbot
  2. 如果已經在運行Web服務器,請先停止該服務。然後為certbot運行以下命令以啟動臨時Web服務器以生成證書:
    sudo certbot certonly --standalone
  3. 上述命令會要求輸入你的email 和域名 , email最好別亂打,因為SSL證書都是有有效期限的,過期它會寄Email通知你,域名就要使用上面步驟申請的域名
  4. 密鑰生成過程結束後,將在/etc/letsencrypt/live/<domain>中找到證書文件,其中<domain>是服務器的域。

(4) 配置coturn server

  1. 新增coturn 資料夾存放key文件
    sudo mkdir /etc/coturn
    cd /etc/coturn
  2. 複製兩個證書文件,cert.pem,privkey.pem
    sudo cp /etc/letsencrypt/live/<domain>/cert.pem /etc/coturn
    sudo cp /etc/letsencrypt/live/<domain>/privkey.pem /etc/coturn
  3. 備份config檔案
    sudo cp /etc/turnserver.conf /etc/turnserver.conf.bak
  4. 修改turnserver.conf
    sudo nano /etc/turnserver.conf
  5. 在turnserver.conf 最下面新增以下

listening-port=3478

tls-listening-port=5349

alt-listening-port=3479

alt-tls-listening-port=5350

external-ip=<your public ip> # 這裡填上你的公用IP

fingerprint

lt-cred-mech

server-name=<domain> # 這裡填上之前申請的域名

user=<turnadmin>:<turnpwd> # 這裡填上你要使用的coturn帳號:密碼

realm=<domain> # 這裡填上之前申請的域名

cert=/etc/coturn/cert.pem

pkey=/etc/coturn/privkey.pem

cipher-list="DEFAULT"

log-file=/var/log/turnserver.log

simple-log

verbose

TURNSERVER_ENABLED=1

6. sudo nano /etc/default/coturn 將TURNSERVER_ENABLED=1註解打開

(5) 添加turnserver的管理員用戶

sudo turnadmin -a -u <turnadmin> -r <domain> -p <turnpwd>

注意 : <turnadmin>和<turnpwd>是之前步驟1–4設定的帳號和密碼,<domain>是步驟2申請的域名

(6) 開始服務

  1. 啟動Coturn服務器
    sudo systemctl start coturn
  2. 檢查狀態
    sudo systemctl status coturn
  3. 如果沒有錯誤,則應顯示類似以下內容:

coturn.service - coturn

Loaded: loaded (/usr/lib/systemd/system/coturn.service; disabled; vendor preset: disabled)

Active: active (running) since Sat 2020-05-30 09:46:00 UTC; 2 weeks 3 days ago

Docs: man:coturn(1)

man:turnadmin(1)

man:turnserver(1)

Process: 27244 ExecStart=/usr/bin/turnserver -o -c /etc/coturn/turnserver.conf --pidfile /run/coturn/turnserver.pid (code=exited, status=0/SUCCESS)

Main PID: 27245 (turnserver)

CGroup: /system.slice/coturn.service

└─27245 /usr/bin/turnserver -o -c /etc/coturn/turnserver.conf --pi…

(7) 啟用防火牆

sudo ufw allow 3478

注意: 若是使用ssh連線遠端主機,必須先開啟22端口,避免防火牆打開將22端口禁用導致連線中斷
sudo ufw allow 22
sudo ufw enable

若是架設伺服器在雲端VM上,須注意如下 :

  1. GCP VM目前實測無法使用,請注意
  2. Azure VM 和AWS EC2實測可以使用,但需要多一個步驟,需在網路輸入和輸出新增規則如下:
    輸入防火牆規則:
    來源:Any,來源連接埠範圍:49157–65535,目的地連接埠範圍:3478,通訊協定:udp,動作:允許
    輸出防火牆規則:
    來源:Any,來源連接埠範圍:3478,目的地連接埠範圍: 49157–65535,通訊協定:udp,動作:允許

(8) 測試服務

  1. 要檢查服務器是否正常運行,請使用免費工具:
    TrickleICE:https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
  2. 對於STUN服務器,輸入為 stun:<domain>:3478
  3. 對於TURN服務器,輸入為 turn:<domain>:3478,另外需輸入TURN username和TURN password (這是4–5設定的帳號和密碼),按下gather candidates
  4. 顯示為 done 代表測試成功,若很久才顯示 done 也是代表失敗,記得去 /var/log/turnserver.log 查看問題
  5. 在你自己的webrtc 專案的js code 新增如下:

'iceServers': [

{ url: 'stun:mysite.com:3478' },

{

url: 'turn:mysite.com,

credential: 'turnpwd',

username: 'turnadmin'

}

]

至此就大功告成!!

下次有空再來發一篇webrtc的文章,webrtc真的是有夠難的……

--

--

Hsu Jerry
Hsu Jerry

Written by Hsu Jerry

對於coding有高度熱情,喜歡思考、提出問題、探究事物的規律, 目前任職於東捷資訊股份有限公司,負責AI以及影像處理相關功能開發