집에 있는 NAS에 TURN 서버를 구축해 보았습니다.
TURN 서버는 https://hub.docker.com/r/coturn/coturn 4.6.3 도커 이미지를 이용하였습니다.
서버 구축 및 실행
우선 turnserver.conf 설정 파일을 생성합니다.
# TURN 서버가 클라이언트 요청을 수신할 포트 설정
listening-port=3478
# TURN 서버에서 TLS 암호화된 요청을 처리할 포트 설정
tls-listening-port=5349
# TURN 서버가 미디어 데이터 전송에 사용할 동적 포트 범위
min-port=49100
max-port=49900
# WebRTC에서 사용되는 패킷의 지문(Fingerprint) 계산을 활성화
fingerprint
# 인증을 위한 Realm 설정 (서버 도메인 또는 IP)
realm=124.x.x.x
# TURN 서버에서 사용할 사용자 계정 정보
user=test:1234 # username:password 형식
# TURN 서버에서 허용할 총 사용자 할당량
total-quota=100 # 최대 사용자 수 제한
# TURN 서버의 대역폭 용량을 설정 (0은 제한 없음)
bps-capacity=0 # bps 제한 없음
# STUN/TURN Nonce 값이 오래된 경우 무효화 처리
stale-nonce
# 멀티캐스트 주소와의 연결을 비활성화
no-multicast-peers
# TURN 서버가 NAT 뒤에 있을 경우 외부에서 접근 가능한 공인 IP 설정
external-ip=124.x.x.x
# TURN 서버 로그 파일 위치
log-file=/var/tmp/turnserver.log
# 자세한 로그 출력을 활성화
verbose
# 로그 레벨 설정 (1: 최소, 4: 최대)
log-level=4
# CLI 인터페이스 설정 (관리 명령 실행)
cli-ip=127.0.0.1
cli-port=5766
cli-password=1234
# TURN 서버 할당의 기본 수명 (초 단위)
allocation-lifetime=100 # 클라이언트 할당 수명
# TURN 채널의 기본 수명 (초 단위)
channel-lifetime=600 # 채널 수명
turnserver.conf 파일을 NAS의 /volume1/docker/coturn 디렉토리에 저장합니다.
이제 docker 이미지를 다운로드 받고, coturn 서버를 구동하는 실행 명령어를 작성해야 합니다.
#!/bin/bash
# 스크립트 실행 시 오류 발생 시 중단
set -e
# Coturn Docker 컨테이너 실행
docker run -d \
--name coturn \
-p 3478:3478/tcp \
-p 3478:3478/udp \
-p 5349:5349/tcp \
-p 5349:5349/udp \
-p 5766:5766/tcp \
-p 49100-49900:49100-49900/udp \
-v /volume1/docker/coturn/turnserver.conf:/etc/turnserver.conf \
coturn/coturn:4.6.3
# 실행 완료 메시지
echo "Coturn 컨테이너가 성공적으로 실행되었습니다!"
run_coturn.sh 실행합니다.
root@my_nas:/volume1/docker/coturn# ./run_coturn.sh
23f870bf627e3543f96af322a1ca0a09714500a0a403aa88c944b9d83355860c
Coturn 컨테이너가 성공적으로 실행되었습니다!
docker ps 명령어를 실행하여 coturn 서버가 잘 실행되었음을 확인하였습니다.
23f870bf627e coturn/coturn:4.6.3 "docker-entrypoint.s…" 9 minutes ago Up 8 minutes 0.0.0.0:3478->3478/tcp, 0.0.0.0:3478->3478/udp, 0.0.0.0:5349->5349/tcp, 0.0.0.0:5349->5349/udp, 0.0.0.0:5766->5766/tcp, 0.0.0.0:49100-49900->49100-49900/udp coturn
relay 포트 발급 테스트
coturn 서버가 잘 구동되었으니 이제 테스트를 해보겠습니다.
테스트는 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 페이지에서 진행해 보았습니다.
Note: errors from onicecandidateerror above are not necessarily fatal. For example an IPv6 DNS lookup may fail but relay candidates can still be gathered via IPv4.
The server stun:124.x.x.x:3478 returned an error with code=701:
STUN binding request timed out.
The server turn:124.x.x.x:3478?transport=udp returned an error with code=701:
TURN allocate request timed out.
헉! timed out 오류가 발생합니다.
집에 있는 NAS가 NAT 뒤에 있기 때문에 발생하는 문제였습니다.
인터넷 공유기의 설정에 접속하여 포트포워딩 설정을 추가하겠습니다.
192.168.219.102는 NAS 아이피입니다.
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 페이지에서 다시 테스트를 해보겠습니다.
오~ 잘 됩니다.
48681 relay 포트가 정상적으로 발급되었음을 확인 할 수 있습니다.
마지막으로 서버 로그를 확인해 볼까요?
48681 relay 포트가 정상 발급되었고, 패킷을 주고 받은 이력까지 확인됩니다.
914: (26): INFO: IPv4. Local relay addr: 172.17.0.2:48681
914: (26): INFO: session 000000000000000001: new, realm=<124.x.x.x>, username=<test>, lifetime=600
914: (26): INFO: session 000000000000000001: realm <124.x.x.x> user <test>: incoming packet ALLOCATE processed, success
914: (26): INFO: session 000000000000000001: refreshed, realm=<124.x.x.x>, username=<test>, lifetime=0
914: (26): INFO: session 000000000000000001: realm <124.x.x.x> user <test>: incoming packet REFRESH processed, success
915: (26): INFO: session 000000000000000001: usage: realm=<124.x.x.x>, username=<test>, rp=4, rb=248, sp=4, sb=392
915: (26): INFO: session 000000000000000001: peer usage: realm=<124.x.x.x>, username=<test>, rp=0, rb=0, sp=0, sb=0
'WebRTC' 카테고리의 다른 글
TURN 서버를 통한 Relay 통신 원리 (0) | 2024.12.10 |
---|---|
NAT 종류에 따른 홀펀칭 (3) | 2024.11.12 |
NAT 종류 (0) | 2024.11.03 |
WebRTC 테스트를 위한 Docker 환경 구성 (0) | 2024.09.22 |