# Discourse Voice用のSTUNサーバーとTURNサーバーを自分で設定する

**URL:** <https://meta.discourse.org/t/configure-your-own-stun-and-turn-servers-for-discourse-voice/414625>\
**Category:** Integrations\
**Tags:** voice\
**Created:** [2026 年 10 月 13 日午後 10:44 UTC](https://meta.discourse.org/t/configure-your-own-stun-and-turn-servers-for-discourse-voice/414625 "2026-10-13T22:44:52Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

**Author:** ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)\
**Post date:** [2026 年 10 月 13 日午後 10:44 UTC](https://meta.discourse.org/t/configure-your-own-stun-and-turn-servers-for-discourse-voice/414625/1 "2026-10-13T22:44:52Z")

</div>

> ⚠ 当サイトをご利用の場合は、すでにサイト側で事前設定が完了しています。このガイドは、Discourse をセルフホストしている管理者向けです。

Discourse Voice は、音声およびビデオ通話に WebRTC を使用します。参加者が直接接続できるよう支援するために、パブリックな STUN サーバーが同梱されています。管理者はこれらのサーバーを置き換え、直接接続が失敗するネットワークをサポートするために TURN を追加できます。

**コミュニティ専用のサーバーの場合、共有シークレット認証を使用し、STUN 設定を空にする TURN を推奨します。** これにより、永続的な TURN パスワードを配布することなく、パブリックアドレスの検出とリレーによるフォールバックを提供します。

このガイドは、Voice のピアツーピア通話に適用されます。LiveKit を使用しているルームは、代わりに LiveKit 独自の ICE/TURN 設定を使用します。[Voice の LiveKit 設定について学ぶ](https://github.com/discourse/discourse/blob/main/plugins/voice/docs/livekit.md)。

## STUN と TURN は何をするのか？

- **STUN** は、ブラウザがパブリック IP アドレスとポートを発見し、直接接続を試みるのを助けます。
- **TURN** は、直接接続を確立できない場合にメディアを中継します。

認証済みの TURN アロケーションは、ブラウザのパブリックアドレスも返します。WebRTC はこれを **サーバーリフレクティブ候補 (server-reflexive candidate)** として使用でき、個別の STUN サーバーなしで STUN のアドレス検出の利点を提供します。[TURN 仕様](https://www.rfc-editor.org/rfc/rfc8656.html#section-7.2)。

共有シークレット TURN が設定されている場合、Voice は STUN 設定が空であっても、直接接続とリレー接続の両方を許可します。 **TURN サーバーのみを設定しても、すべての通話がリレーを強制されるわけではありません。** [Voice の ICE 設定](https://github.com/discourse/discourse/blob/main/plugins/voice/lib/voice/ice_config.rb)。

## 1. TURN サーバーの準備

**TURN REST API 共有シークレット認証** をサポートするマネージド TURN サービスを使用するか、[coturn](https://github.com/coturn/coturn) を自分で実行できます。

セルフホスト環境の場合、以下の準備をしてください：

- 中継通話に十分な帯域幅とパブリック IP アドレスを持つサーバー。
- そのサーバーを直接指す `turn.example.com` のようなホスト名。
- TURN リスナーおよび UDP リレーポート範囲へのファイアウォールアクセス。
- TURN を TLS 経由で提供する場合の有効な証明書。

参加者のブラウザは TURN に直接接続します。通常の HTTP リバースプロキシや CDN プロキシでは TURN トラフィックを運ぶことはできません。

### coturn 設定の例

ランダムなシークレットを生成します：

```bash
openssl rand -hex 32

```

結果は秘密にしてください。coturn と Discourse に同じ値を入力します。

直接パブリック IP が割り当てられているサーバーでは、`/etc/turnserver.conf` に以下の内容をスタートポイントとして使用します：

```ini
listening-port=3478

fingerprint
realm=turn.example.com

use-auth-secret
static-auth-secret=REPLACE_WITH_YOUR_RANDOM_SECRET

# スタンドアロン STUN リクエストを無効化します。
# 認証済みの TURN アロケーションは依然としてクライアントのパブリックアドレスを返します。
no-stun

min-port=49152
max-port=65535

no-multicast-peers

# この例では TLS なしで開始します。
no-tls
no-dtls

```

ホスト名とシークレットを置き換え、設定ファイルを保護し、coturn を再起動してください。競合する `no-auth` や静的な `user=` 設定があれば削除してください。coturn の共有シークレットモードは、内部で必要な認証メカニズムを有効にします。[Coturn 設定リファレンス](https://github.com/coturn/coturn/blob/master/examples/etc/turnserver.conf)。

以下の入站トラフィックを許可してください：

| ポート | プロトコル | 目的 |
| --- | --- | --- |
| `3478` | UDP および TCP | ブラウザからの TURN への接続 |
| `49152–65535` | UDP | 中継されたメディア |

対応する出站トラフィックも許可してください。リレー範囲は `min-port` および `max-port` と一致する必要があります。

サーバーが NAT の背後にある場合、coturn の `external-ip=PUBLIC_IP/PRIVATE_IP` マッピングを設定し、リスナーポートとリレーポートをフォワードしてください。リレーポートは NAT を通過する際にポート番号を保持する必要があります。[Coturn デプロイオプション](https://github.com/coturn/coturn/wiki/turnserver)。

### 制限的なネットワーク向けに TLS を追加する

TLS 経由の TURN は、UDP がブロックされているネットワークの参加者に対して別の接続オプションを提供します。

`no-tls` を削除し、以下を設定します：

```ini
tls-listening-port=5349
cert=/path/to/fullchain.pem
pkey=/path/to/privkey.pem

```

`5349/TCP` を開き、coturn が証明書と鍵を読み取れることを確認し、証明書更新後に再起動してください。

TURN サーバーでそのポートが利用可能な場合、代わりに `443/TCP` を使用できます。これは制限的なネットワークで役立つ場合がありますが、一部のネットワークではポート 443 上の非 HTTP トラフィックも検査・ブロックします。ブラウザが TCP または TLS 経由で TURN に到達する場合でも、UDP リレー範囲は依然として必要です。[Coturn サーバードキュメント](https://github.com/coturn/coturn/wiki/turnserver)。

## 2. Discourse の設定

**管理画面 → 設定** で、これらの Voice 設定を検索します：

| 設定 | 値 |
| --- | --- |
| `voice_stun_servers` | 空 — デフォルトエントリを削除 |
| `voice_turn_secret` | coturn の `static-auth-secret` に使用した値 |
| `voice_turn_secret_servers` | `|` で区切られた TURN URI |
| `voice_turn_servers` | 空 |
| `voice_turn_username` | 空 |
| `voice_turn_credential` | 空 |

上記の設定の場合、`voice_turn_secret_servers` には以下を入力します：

```plaintext
turn:turn.example.com:3478?transport=udp|turn:turn.example.com:3478?transport=tcp

```

TLS を有効にした場合、そのエンドポイントを追加します：

```plaintext
turn:turn.example.com:3478?transport=udp|turn:turn.example.com:3478?transport=tcp|turns:turn.example.com:5349?transport=tcp

```

`//` なしの `turn:` および `turns:` URI を使用してください。サーバーが実際にサポートするエンドポイントのみをリストアップしてください。

`voice_turn_secret_servers` リストは、共有シークレットから生成された認証情報を使用します。別の `voice_turn_servers` リストは、固定のユーザー名とパスワードを使用します。[Voice 設定定義](https://github.com/discourse/discourse/blob/main/plugins/voice/config/locales/server.en.yml)。

設定を保存し、参加者に通話から離脱して再参加してもらい、新しい設定を取得させます。

## 3. セットアップの確認

家庭用ブロードバンドとモバイルデータなど、異なるネットワークの 2 人の参加者でテストしてください。双方向で音声動作を確認し、その後、ビデオと画面共有をテストします。

Chromium ベースのブラウザでは、参加前に `chrome://webrtc-internals` を開きます：

- `srflx` 候補は、発見されたパブリックアドレスを表します。
- `relay` 候補は、利用可能な TURN リレーを表します。
- 選択された候補ペアは、実際にメディアを運んでいる接続を示します。

**成功した直接通話は、リレーが動作することを証明しません。** TURN を必要とするネットワークからもテストするか、`iceTransportPolicy: "relay"` と一時的な認証情報を持つ WebRTC テストクライアントを使用してください。

coturn のログを確認し、認証済みのアロケーションが成功していることを確認します。有効な認証情報がないリクエストは、リレーアロケーションを取得してはいけません。最初の `401` 認証チャレンジは正常ですが、繰り返し発生する認証失敗は調査が必要です。

## サーバーをコミュニティ専用に保つ

共有シークレットは Discourse と TURN サーバー上に保持されます。参加者には一時的な認証情報が渡されます。Voice は現在、アロケーション作成に 12 時間有効な認証情報を生成します。確立されたアロケーションは、更新されている間継続できます。[Voice の認証情報生成](https://github.com/discourse/discourse/blob/main/plugins/voice/lib/voice/ice_config.rb)。

これにより、匿名のオープンリレーを防ぐことができますが、TURN 認証情報はブラウザのオリジンに紐付けられていません：参加者は一時的な認証情報をコピーして再利用できます。悪用を制限するために：

- Voice のアクセスを意図されたグループに制限する。
- リレー帯域幅とアロケーション数を監視する。
- コミュニティに適した coturn のアロケーションクォータと帯域幅制限を設定する。
- TURN ホストから到達可能なプライベート、リンクローカル、その他の内部宛先へのリレーアクセスをブロックする。
- coturn を最新に保ち、共有シークレットが漏洩した場合にローテーションする。

この Discourse デプロイメント用に専用のシークレットを使用してください。`no-stun` を有効にすると、サーバーは匿名のスタンドアロン STUN サービスを提供することも停止します。[Coturn 認証とアクセス制御](https://github.com/coturn/coturn/blob/master/README.turnserver)。

## 代替手段

### パブリック STUN サーバーのみを置き換える

`voice_stun_servers` を、`|` で区切った独自の STUN URI に設定します：

```plaintext
stun:stun.example.com:3478

```

リレーを必要としない場合は、TURN 設定を空にしてください。STUN だけでは、すべてのネットワークで通話を機能させることはできません。`no-stun` で設定された coturn サーバーでは、このエンドポイントを提供できません。

### 固定のユーザー名とパスワードで TURN を使用する

プロバイダーが共有シークレット認証をサポートしていない場合、`voice_turn_servers`、`voice_turn_username`、`voice_turn_credential` を設定します。共有シークレット設定は空にしてください。

参加者にはこれらの固定認証情報が渡されるため、サイト外での再利用が容易になります。また、Voice は現在、静的な TURN サーバーが設定され、STUN リストが空の場合に、リレー接続を強制します。プロバイダーがサポートしている場合は、共有シークレット認証を優先してください。[Voice の ICE 設定](https://github.com/discourse/discourse/blob/main/plugins/voice/lib/voice/ice_config.rb)。

---

_[View the full topic](https://meta.discourse.org/t/configure-your-own-stun-and-turn-servers-for-discourse-voice/414625)._
