Discourse Voice용 STUN 및 TURN 서버 직접 설정하기

:warning: 저희가 호스팅을 제공하고 있다면, 이 설정은 이미 사이트에 사전 적용되어 있습니다. 이 가이드는 Discourse를 직접 셀프호스팅하는 관리자를 위한 것입니다.

Discourse Voice는 음성 및 영상 통화에 WebRTC를 사용합니다. 참가자들이 직접 연결할 수 있도록 돕는 공개 STUN 서버를 기본으로 제공합니다. 관리자는 이러한 서버를 교체하고, 직접 연결이 실패하는 네트워크를 지원하기 위해 TURN을 추가할 수 있습니다.

커뮤니티 전용 서버의 경우, 공유 시크릿(shared-secret) 인증을 사용하는 TURN과 빈 STUN 설정을 권장합니다. 이를 통해 TURN 비밀번호를 영구적으로 배포하지 않고도 공개 주소 탐색과 릴레이 폴백을 제공할 수 있습니다.

이 가이드는 Voice의 P2P(피어-투-피어) 통화에 적용됩니다. LiveKit을 사용하는 방은 LiveKit 자체의 ICE/TURN 설정을 사용합니다. Voice의 LiveKit 설정 알아보기.

STUN과 TURN은 무엇을 하는가?

  • STUN은 브라우저가 직접 연결을 시도할 수 있도록 공개 IP 주소와 포트를 발견하는 데 도움을 줍니다.
  • TURN은 직접 연결을 확립할 수 없을 때 미디어를 중계합니다.

인증된 TURN 할당은 브라우저의 공개 주소도 반환합니다. WebRTC는 이를 **서버 반사 후보(server-reflexive candidate)**로 사용할 수 있으며, 이는 별도의 STUN 서버 없이도 STUN의 주소 탐색 이점을 제공합니다. TURN 사양.

공유 시크릿 TURN이 설정된 경우, Voice는 STUN 설정이 비어 있더라도 직접 연결과 중계 연결을 모두 허용합니다. TURN 서버만 구성한다고 해서 모든 통화가 릴레이를 통해 이루어지도록 강제되지는 않습니다. Voice의 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

# 독립형 STUN 요청 비활성화.
# 인증된 TURN 할당은 여전히 클라이언트의 공개 주소를 반환합니다.
no-stun

min-port=49152
max-port=65535

no-multicast-peers

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

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

다음에 대한 수신 트래픽을 허용하세요:

포트 프로토콜 목적
3478 UDP 및 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 구성

관리자 → 설정에서 다음 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에 다음을 입력하세요:

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

// 없이 turn: 및 turns: URI를 사용하세요. 서버가 실제로 지원하는 엔드포인트만 나열하세요.

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

설정을 저장한 후, 참가자들이 통화를 나갔다가 다시 참여하도록 하여 새로운 설정을 적용받게 하세요.

3. 설정 확인

가정용 광대역과 모바일 데이터와 같은 서로 다른 네트워크의 두 참가자로 테스트하세요. 양방향으로 오디오가 작동하는지 확인한 후, 영상 및 화면 공유를 테스트하세요.

Chromium 브라우저의 경우, 참여하기 전에 chrome://webrtc-internals를 열세요:

  • srflx 후보는 발견된 공개 주소를 나타냅니다.
  • relay 후보는 사용 가능한 TURN 릴레이를 나타냅니다.
  • 선택된 후보 쌍은 실제로 미디어를 전송하는 연결을 보여줍니다.

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

coturn 로그에서 성공적인 인증된 할당을 확인하세요. 유효한 자격 증명이 없는 요청은 릴레이 할당을 받아서는 안 됩니다. 초기 401 인증 챌린지는 정상적이며, 반복적인 인증 실패는 조사해야 합니다.

서버를 커뮤니티 전용으로 유지하기

공유 시크릿은 Discourse와 TURN 서버에 남아 있습니다. 참가자는 대신 임시 자격 증명을 받습니다. Voice는 현재 할당 생성에 유효한 12시간 동안의 자격 증명을 생성하며, 확립된 할당은 갱신되는 동안 계속될 수 있습니다. Voice의 자격 증명 생성.

이것은 익명의 공개 릴레이를 방지하지만, TURN 자격 증명은 브라우저 오리지널에 묶여 있지 않습니다: 참가자는 임시 자격 증명을 복사하여 재사용할 수 있습니다. 남용을 제한하기 위해:

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

이 Discourse 배포를 위해 전용 시크릿을 사용하세요. no-stun이 활성화되면 서버는 익명의 독립형 STUN 서비스 제공도 중단합니다. Coturn 인증 및 액세스 제어.

대안

공개 STUN 서버만 교체

voice_stun_servers를 |로 구분된 자체 STUN URI로 설정하세요:

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 설정.

2개의 좋아요