目次
- Coturnの概要と役割
- STUN/TURN/ICEプロトコルの基礎
- Dockerを使用したCoturnサーバーの構築手順
- ファイアウォールとネットワーク設定
- WebRTCクライアントとの統合
Coturnの概要と役割
CoturnはNAT(Network Address Translation)環境下での通信問題を解決するための、オープンソースのSTUN/TURNサーバー実装です。WebRTCのようなリアルタイム通信アプリケーションにおいて、クライアント間のP2P接続を確立する重要な役割を果たします。
STUN/TURN/ICEプロトコルの基礎
STUN (Session Traversal Utilities for NAT)
クライアントが自身のグローバルIPアドレスとポート番号を発見するためのプロトコルです。これにより、直接のP2P接続が可能かどうかを判断します。
TURN (Traversal Using Relays around NAT)
STUNでの直接接続が困難な場合(対称NATや企業ファイアウォール環境など)、TURNサーバーがリレーノードとしてデータを中継します。
ICE (Interactive Connectivity Establishment)
WebRTCで使用される接続確立フレームワーク。STUNとTURNを組み合わせ、最適な通信経路を動的に選択します。
Dockerを使用したCoturnサーバーの構築手順
1. 環境準備
# Dockerの動作確認
docker --version
docker-compose --version
# Coturnイメージの取得
docker image pull coturn/coturn:latest
2. 設定ファイルの作成
# ディレクトリ構造の作成
mkdir -p /opt/webrtc/turnserver
cd /opt/webrtc/turnserver
# 設定ファイルの編集
vim turn.conf
3. turn.confの設定内容
# ネットワーク設定(グローバルIP/ローカルIP)
external-ip=203.0.113.10/10.0.1.100
# リスニング設定
listening-ip=10.0.1.100
listening-port=443
tls-listening-port=5349
# 認証メカニズム
use-auth-secret
static-auth-secret=your-super-secret-key-here
realm=webrtc.example.com
# リレーポート範囲
relay-min-port=50000
relay-max-port=55000
# セキュリティ強化
no-multicast-peers
no-loopback-peers
no-cli
4. Docker Composeによるデプロイ
version: '3.8'
services:
coturn:
image: coturn/coturn:latest
container_name: turnserver
network_mode: host
restart: always
volumes:
- ./turn.conf:/etc/coturn/turnserver.conf:ro
environment:
- TURN_USERNAME=webrtc-user
- TURN_PASSWORD=secure-password-2024
5. コンテナの起動
docker-compose up -d
ファイアウォールとネットワーク設定
Ubuntu/Debian環境での設定
# UFWファイアウォールの設定
sudo ufw allow 443/tcp
sudo ufw allow 443/udp
sudo ufw allow 5349/tcp
sudo ufw allow 5349/udp
sudo ufw allow 50000:55000/udp
# 設定の有効化
sudo ufw reload
RHEL/CentOS環境での設定
# firewalldの設定
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=443/udp
sudo firewall-cmd --permanent --add-port=5349/tcp
sudo firewall-cmd --permanent --add-port=5349/udp
sudo firewall-cmd --permanent --add-port=50000-55000/udp
# 設定の再読み込み
sudo firewall-cmd --reload
WebRTCクライアントとの統合
JavaScriptクライアント設定例
const peerConnectionConfig = {
iceServers: [
{
urls: [
'stun:stun.l.google.com:19302',
'turn:webrtc.example.com:443?transport=udp',
'turn:webrtc.example.com:443?transport=tcp'
],
username: 'webrtc-user',
credential: 'secure-password-2024'
}
]
};
// RTCPeerConnectionの初期化
const pc = new RTCPeerConnection(peerConnectionConfig);
// ICE候補の収集
pc.onicecandidate = (event) => {
if (event.candidate) {
console.log('ICE candidate:', event.candidate);
}
};
接続テスト
公式のテストツールを使用してTURNサーバーの動作を確認できます:
Trickle ICEテストページ
以下の情報を入力してテストを実施:
- STUN/TURN URI: turn:webrtc.example.com:443
- Username: webrtc-user
- Password: secure-password-2024
「Gather candidates」ボタンをクリック後、srflxとrelayタイプの候補が表示されればTURNサーバーは正常に動作しています。