Discourse Live에 자체 STUN 및 TURN 서버 구성

:warning: Discourse 호스팅 서비스를 이용 중이라면 이 기능은 이미 사전 구성되어 있습니다. 이 가이드는 Discourse를 자체 호스팅하는 관리자용입니다.

Discourse Live는 음성 및 화상 통화를 위해 WebRTC를 사용합니다. 참여자가 직접 연결할 수 있도록 퍼블릭 STUN 서버가 기본으로 포함되어 있습니다. 관리자는 이러한 서버를 교체하고 TURN을 추가하여 직접 연결이 불가능한 네트워크를 지원할 수 있습니다.

커뮤니티 전용 서버의 경우, STUN과 TURN 서버 모두로 coturn을 실행하고, TURN은 공유 시크릿(shared-secret) 인증을 사용하는 것을 권장합니다. 이렇게 하면 영구적인 TURN 비밀번호를 배포하거나 서드파티 STUN 서버에 의존하지 않고도 퍼블릭 주소 탐지와 릴레이 폴백을 제공할 수 있습니다.

이 가이드는 Live의 P2P(peer-to-peer) 통화에 적용됩니다. LiveKit을 사용하는 방은 LiveKit 자체의 ICE/TURN 구성을 사용합니다. Live의 LiveKit 구성 정보 보기.

STUN과 TURN의 역할은 무엇인가요?

  • STUN: 브라우저가 퍼블릭 IP 주소와 포트를 탐지하여 직접 연결을 시도할 수 있도록 도와줍니다.
  • TURN: 직접 연결을 수립할 수 없을 때 미디어를 릴레이(중계)합니다.

퍼블릭 주소를 파악한 브라우저는 이를 서버 반사(server-reflexive, srflx) 후보로 제공할 수 있으며, 이를 통해 가정 및 사무실 NAT를 통한 직접 연결이 가능해집니다. 후보가 없으면 대부분의 통화가 TURN 릴레이로 폴백되어 지연 시간이 증가하고 릴레이 대역폭이 소모됩니다.

TURN을 실행하더라도 STUN은 열려 있어야 합니다. TURN 할당 응답에는 브라우저의 퍼블릭 주소도 포함되지만, Firefox 등 일부 브라우저만 이를 후보로 사용합니다. Chromium 기반 브라우저와 Safari는 별도의 STUN 바인딩 요청을 통해서만 퍼블릭 주소를 파악하며, 브라우저는 바인딩 요청에 자격 증명을 첨부하지 않습니다. 서버에서 STUN을 비활성화(no-stun)하거나 인증을 요구(secure-stun)하면, 해당 브라우저는 srflx 후보를 얻지 못해 참여하는 모든 통화가 릴레이됩니다.

공유 시크릿 TURN을 구성하면 Live는 직접 연결과 릴레이 연결을 모두 허용합니다. TURN을 구성한다고 해서 모든 통화가 릴레이를 통해 진행되는 것은 아닙니다. Live의 ICE 구성.

1. TURN 서버 준비

TURN REST API 공유 시크릿 인증을 지원하는 관리형 TURN 서비스를 사용하거나, 직접 coturn을 실행할 수 있습니다.

자체 호스팅 환경에서는 다음 사항을 준비해야 합니다:

  • 릴레이된 통화를 위해 충분한 대역폭과 퍼블릭 IP 주소를 가진 서버.
  • 해당 서버를 직접 가리키는 turn.example.com과 같은 호스트 이름.
  • TURN 리스너 및 UDP 릴레이 포트 범위에 대한 방화벽 접근 권한.
  • TLS를 통한 TURN을 제공하는 경우 유효한 인증서.

참여자의 브라우저는 TURN에 직접 연결합니다. 일반적인 HTTP 리버스 프록시나 CDN 프록시는 TURN 트래픽을 처리할 수 없습니다.

coturn 구성 예시

무작위 시크릿을 생성합니다:

openssl rand -hex 32

결과값은 비공개로 유지해야 합니다. coturn과 Discourse에 동일한 값을 입력합니다.

퍼블릭 IP가 직접 할당된 서버에서는 /etc/turnserver.conf에 다음 내용을 시작점으로 사용합니다:

listening-port=3478

fingerprint
realm=turn.example.com

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

# no-stun 또는 secure-stun을 추가하지 마세요: 브라우저는 자격 증명 없이 STUN 바인딩 요청을 보내며,
# 많은 브라우저가 퍼블릭 주소 탐지를 위해 이에 의존합니다.

min-port=49152
max-port=65535

no-multicast-peers

# 이 예제는 TLS 없이 시작합니다.
no-tls
no-dtls

호스트 이름과 시크릿을 교체하고, 구성 파일을 보호한 후 coturn을 다시 시작합니다. 충돌하는 no-auth 또는 정적 user= 구성은 모두 제거하세요. Coturn의 공유 시크릿 모드는 필요한 인증 메커니즘을 내부적으로 활성화합니다. Coturn 구성 참조.

익명 STUN은 클라이언트 자신의 주소만 다시 보고할 뿐 트래픽을 릴레이하지 못하므로, 서버가 오픈 릴레이가 되는 것은 아닙니다. 최신 coturn 버전에서는 선택적 RFC 5780 및 MAPPED-ADDRESS 응답 속성이 기본적으로 비활성화되어 있어 바인딩 응답의 크기를 요청 크기에 가깝게 유지하고 리플렉션 공격에 대한 유용성을 제한합니다. rfc5780 및 stun-backward-compatibility는 비활성화된 상태로 두세요.

수신 트래픽에 대해 다음을 허용합니다:

포트 프로토콜 용도
3478 UDP STUN 및 TURN
3478 TCP TURN
49152–65535 UDP 릴레이된 미디어

해당 발신 트래픽도 허용해야 합니다. 릴레이 범위는 min-port와 max-port와 일치해야 합니다.

서버가 NAT 뒤에 있는 경우, coturn의 external-ip=PUBLIC_IP/PRIVATE_IP 매핑을 구성하고 리스너 및 릴레이 포트를 전달하세요. 릴레이 포트는 NAT를 거치더라도 포트 번호를 유지해야 합니다. Coturn 배포 옵션.

제한적인 네트워크를 위해 TLS 추가

TLS를 통한 TURN은 UDP를 차단하는 네트워크의 참여자에게 추가 연결 옵션을 제공합니다.

no-tls를 제거하고 다음과 같이 구성합니다:

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 서버 문서.

2. Discourse 구성

관리자 → 설정에서 다음 Live 설정을 검색합니다:

설정 값
live_stun_servers coturn 서버의 STUN URI — 기본 항목 교체
live_turn_secret coturn의 static-auth-secret에 사용한 값
live_turn_secret_servers |로 구분된 TURN URI
live_turn_servers 비어 있음
live_turn_username 비어 있음
live_turn_credential 비어 있음

위 구성의 경우 live_stun_servers에 다음을 입력합니다:

stun:turn.example.com:3478

live_turn_secret_servers에는 다음을 입력합니다:

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

TLS를 활성화한 경우 해당 엔드포인트를 추가합니다:

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

// 없이 stun:, turn:, turns: URI를 사용합니다. 서버에서 실제로 지원하는 엔드포인트만 나열하세요.

Chromium 기반 브라우저는 나열된 TURN 서버에도 STUN 요청을 보내므로, coturn이 익명 STUN에 응답하는 한 live_stun_servers가 비어 있어도 작동할 수 있습니다. STUN URI를 명시적으로 나열하면 설정이 더 명확해지고, 다른 브라우저도 지원하며, Live의 연결 진단 기능에서 독립적으로 테스트할 수 있습니다.

live_turn_secret_servers 목록은 공유 시크릿에서 생성된 자격 증명을 사용합니다. 별도의 live_turn_servers 목록은 고정된 사용자 이름과 비밀번호를 사용합니다. Live 설정 정의.

설정을 저장한 후, 참여자가 통화를 나갔다 다시 참여하여 새 구성을 가져오도록 합니다.

3. 설정 확인

가정용 광대역 및 모바일 데이터 등 서로 다른 네트워크에 있는 두 참여자로 테스트하고, 하나 이상의 브라우저(최소 하나 이상의 Chromium 기반 브라우저와 Firefox)에서 확인하세요. 양방향 오디오가 작동하는지 확인한 후, 비디오 및 화면 공유를 테스트합니다.

P2P 방에서 방의 ⋮ 메뉴를 열고 연결 진단을 선택합니다:

  • STUN/TURN 서버 아래에서 각 서버는 접근 가능(Reachable) 상태로 표시되어야 합니다. TURN 서버에는 **릴레이 주소(Relay address)**가, UDP 서버에는 **퍼블릭 주소(Public address)**가 나열되어야 합니다. "Public address: None"은 STUN 요청에 응답이 없었음을 의미하므로, no-stun/secure-stun 설정과 3478/UDP 포트 개방 여부를 확인하세요.
  • 동료(Peers) 아래에서 경로는 각 연결이 미디어를 전송하는 방식을 표시합니다: 직접(동일 네트워크), 직접(STUN을 통한 NAT), 또는 TURN을 통한 릴레이. 대부분의 일반 가정 네트워크 참여자는 직접 연결됩니다.
  • **보고서 복사(Copy report)**는 문제 해결 담당자와 공유할 수 있는 텍스트 보고서를 생성합니다. 참여자의 IP 주소가 포함되므로 비공개로 공유하세요.

Chromium 브라우저에서는 chrome://webrtc-internals에서 더 낮은 수준의 동일한 세부 정보를 확인할 수 있습니다:

  • srflx 후보는 탐지된 퍼블릭 주소를 나타냅니다.
  • relay 후보는 사용 가능한 TURN 릴레이를 나타냅니다.
  • 선택된 후보 쌍은 실제로 미디어를 전송하는 연결을 나타냅니다.

성공적인 직접 통화는 릴레이가 정상적으로 작동함을 증명하지 않습니다. TURN이 필요한 네트워크에서도 테스트하거나, iceTransportPolicy: "relay"와 임시 자격 증명을 사용하는 WebRTC 테스트 클라이언트를 사용하세요.

coturn 로그에서 인증이successful한 할당을 확인하세요. 유효한 자격 증명이 없는 요청은 릴레이 할당을 획득하면 안 됩니다. 초기 401 인증 챌린지는 정상입니다. 반복적인 인증 실패는 조사가 필요합니다.

커뮤니티 전용 서버 유지 관리

공유 시크릿은 Discourse와 TURN 서버에만 보관됩니다. 참여자에게는 임시 자격 증명이 전달됩니다. 현재 Live는 할당 생성에 대해 12시간 동안 유효한 자격 증명을 생성하며, 갱신되는 동안 기존 할당은 계속 유지됩니다. Live의 자격 증명 생성.

이렇게 하면 익명 오픈 릴레이는 방지되지만, TURN 자격 증명은 브라우저 출처와 연결되지 않으므로 참여자가 임시 자격 증명을 복사하여 재사용할 수 있습니다. 남용을 제한하려면:

  • Live 접근을 의도된 그룹으로 제한하세요.
  • 릴레이 대역폭 및 할당 수량을 모니터링하세요.
  • 커뮤니티에 적합한 coturn 할당 할당량 및 대역폭 제한을 설정하세요.
  • TURN 호스트에서 도달 가능한 프라이빗, 링크 로컬 및 기타 내부 대상에 대한 릴레이 접근을 차단하세요.
  • coturn을 최신 상태로 유지하고 공유 시크릿이 노출되면 교체하세요.

이 Discourse 배포에 전용 시크릿을 사용하세요. 서버는 누구나 보낼 수 있는 익명 STUN 요청에도 응답합니다. 이는 예상된 동작이며, 대역폭 소모가 적고 릴레이 접근 권한을 부여하지 않습니다. Coturn 인증 및 접근 제어.

대안

퍼블릭 STUN 서버만 교체

live_stun_servers를 |로 구분된 자체 STUN URI로 설정합니다:

stun:stun.example.com:3478

릴레이가 필요하지 않으면 TURN 설정은 비워 둡니다. STUN만으로는 모든 네트워크에서 통화를 작동시킬 수 없습니다.

고정 사용자 이름과 비밀번호가 있는 TURN 사용

제공자가 공유 시크릿 인증을 지원하지 않는 경우, live_turn_servers, live_turn_username, live_turn_credential을 구성하세요. 공유 시크릿 설정은 비워 둡니다.

참여자에게 고정 자격 증명이 전달되므로 사이트 외부에서 재사용하기가 더 쉬워집니다. 또한, 현재 Live는 정적 TURN 서버가 구성되고 STUN 목록이 비어 있을 때 릴레이 연결을 강제합니다. 제공자가 지원하는 경우 공유 시크릿 인증을 우선적으로 사용하세요. Live의 ICE 구성.

3개의 좋아요