NAS에 TURN 서버 구축하기

 

집에 있는 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 뒤에 있기 때문에 발생하는 문제였습니다.
인터넷 공유기의 설정에 접속하여 포트포워딩 설정을 추가하겠습니다.

LGU+ 포트포워딩 설정 화면

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' 카테고리의 다른 글

WebRTC의 ICE Candidate 처리 순서 문제  (0) 2024.12.26
TURN 서버를 통한 Relay 통신 원리  (0) 2024.12.10
NAT 종류에 따른 홀펀칭  (3) 2024.11.12
NAT 종류  (0) 2024.11.03
WebRTC 테스트를 위한 Docker 환경 구성  (0) 2024.09.22