WebRTC 기술은 사실상
서로 다른 네트워크 환경의 사용자를 어떻게 연결할 수 있을까 / 클라이언트와 서버의 부하를 어떻게 나눌까
를 주로 고민해야 하는 기술이라고 생각하면 된다.
기본적으로 3가지의 ICE candidates이 있는데
NAT 뒤의 사용자란?
간단하게 설명하면 공유기/와이파이 환경에서 사용하는 사용자를 연결하는 사용자이다. 공유기는 NAT를 통해 내부 네트워크와 외부 네트워크 간의 트래픽을 관리한다. 내부 네트워크의 사설 IP 주소를 공인 IP 주소로 변환하여 외부와 통신할 수 있도록 한다.
NAT의 방식도 Cone류 방식과 Symmetric 방식으로 나누어지게 되는데, Symmetric 방식의 경우 TURN 서버 중계가 필요하다.
따라서 WebRTC로 각 사용자의 오디오/비디오를 P2P로 연결하려면 필수적으로 STUN/TURN 서버가 필요하다.
WebRTC용 STUN/TURN 서버를 만들 때 주로 Coturn이 활용된다.
WebRTC 프로젝트에서 OpenVidu를 사용하는 경우도 있는데 여기도 Coturn이 내재되어 있다.
Docker를 통해 Coturn을 설정하는 방법을 공유드리지만 환경에 따라 추가적인 작업이 필요할 수 있다.
(WebRTC는 TLS가 필수적이고, 해당 설정은 추후에 추가하겠다.)
# 폴더 만들기
mkdir coturn-server
cd coturn-server
vim docker-compose.yml
# docker-compose.yml 파일
services:
coturn:
image: coturn/coturn:latest
container_name: coturn-server
restart: always
ports:
- '3478:3478/udp'
- '3478:3478/tcp'
- '5349:5349/udp'
- '5349:5349/tcp'
- '49152-49200:49152-49200/udp'
volumes:
- ./turnserver.conf:/etc/turnserver.conf:ro
command: turnserver -c /etc/turnserver.conf --verbose
포트의 범위는 일부러 작게 설정하였으니 coturn-docker참고해서 결정하면 된다.
vim turnserver.conf
# turnserver.conf 파일
listening-port=3478
tls-listening-port=5349
listening-ip=0.0.0.0
relay-ip=0.0.0.0
# 인증 방식 설정
lt-cred-mech
fingerprint
# 실제 서버의 외부 IP로 변경하세요
external-ip=[공인 아이피]
# 사용자 인증 정보 (실제 값으로 변경하세요)
user=[ID]:[PW]
realm=[realm]
server-name=[server.name]
# 미디어 포트 범위
min-port=49152
max-port=65535
verbose
# coturn-server 폴더 내에서
실행 : docker-compose up -d
끄기 : docker-compose down