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

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