본문 바로가기

Lecture & Tip/linux programming[리눅스]

Amazon EC2에 TURN 서버 설정하기.

Veckon 서비스는 WebRTC 기술을 사용한 서비스입니다.


WebRTC에서 NAT 내부에 존재하는 Peer간의 연결을 위해서는 STUN/TURN 서버가 필요해 저희는 임시적으로 구글의 public stun server를 사용하고 있었습니다. 하지만 아래와 같은 이유로 자체 서버를 확보하지 않으면 안되게 되었습니다.


1) 거대 시장인 중국에서 구글 서비스가 되지않아 public stun server로의 접근이 되지 않음. -> 구글이외의 STUN Server Service가 필요.

2) NAT에 설치된 방화벽중 일부에서 STUN 으로도 연결이 불가능한 경우 발생. -> TURN 서버 필요.


위와 같은 이유로 결국 TURN 서버를 자체 구축하기로 결정하였습니다.

그래서 일단 webrtc forum에서 활발하게 언급되어지고 있는 http://code.google.com/p/rfc5766-turn-server/ 를 사용하기로 했습니다.


간단히 TURN 서버에 대해 이야기하자면 P2P연결을 위해 NAT 내부망 Peer간의 연결을 도와주는 것이 STUN. 하지만 일부 경우에는 STUN으로 P2P가 불가능하여 중계서버가 Peer간의 통신 채널을 중계하게 되는데 이것이 바로 TURN. TURN 연결이 되면 엄밀히 말해 P2P 가 아니게 되는 것이지만 이는 일부의 경우에 해당하는 것이고, RTCPeerConnection 객체가 내부적으로 처리하는 것이기 떄문에 WebRTC API사용자 쪽에서는 P2P 로 봐도 무방하다고 생각됩니다. TURN 서버는 STUN/TURN 두가지 기능을 모두 지원하고 STUN 서버는 STUN기능만을 제공하기 때문에 TURN이 좀더 포괄적인 서버입니다.


서론이 길었으니 이제 설치를 해봐야죠.


1. Amazon에 ubuntu Instance를 생성합니다. 요건 너무나 잘 아실거라 생각되어서 일단 skip.


2. Instance에 ftp를 설치하고 http://code.google.com/p/rfc5766-turn-server/ 에서 download 합니다.

 - ftp 설치 ( #apt-get install vsftpd )


3. turn-server tar를 적당한 위치에 풀고 ./configure 후에 make 합니다. 저의 경우에는 configure 시에 openssl-devel package와 libevent2 package 가 필요하다고 하여 설치하였습니다. openssl-devel의 경우에는 apt-get 으로 쉽게 설치가능했지만 libevent2의 경우에는 따로 소스를 받아 빌드를 해야했습니다. 아래는 제가 참고한 libevent2의 설치법입니다.

 - libevent2 설치 : https://docs.aerospike.com/display/AS2/C+-+Libevent2/


4. 설치가 완료되면 바로 turnserver cmd로 실행이 가능합니다. 하지만 TURN서버 기능을 작동시키기 위해서는 user credential이 필요합니다. STUN의 경우에는 서버 초기 연결 중계만 하면 특별한 트래픽없이 지원이 가능해 부담이 없지만 TURN의 경우에는 Data 송수신까지 중계하기 때문에 서버에 부담이 되고 비용도 발생합니다. 그래서 TURN서버 기능을 위해서는 user credential을 생성해서 실행시켜야합니다. 

 - turnadmin 을 사용하여 user credential생성이 가능합니다. 하지만 동적인 key의 생성과 유저관리를 위해서는 postgress나 mysql에 저장된 유저 정보와 연결을 해서 사용하는 것을 추천합니다.(이 부분은 다른 포스트에서 다시 설명하겠습니다.)


5. turn 서버를 실행시키면 이제 한가지 넘어야할 장벽이 있습니다. TURN은 다른 peer들을 중계하는 입장이기 때문에 NAT외부에 존재하여야합니다. 한마디로 공인 IP가 필요합니다. 하지만 Amazon인스턴스는 EC2 의 NAT안에 존재하기 때문에 turn서버 설정시 external에서 접근 가능한 public ip를 할당해줘야합니다. 만약 그냥 실행 시키면 Amazon인스턴스의 private ip로 turn server가 실행이되어 외부접근이 불가능합니다.


그래서 인스턴스 콘솔창에서 아래와 같은 방법으로 public ip를 확인해서 turn 서버를 실행시킵니다.


curl http://169.254.169.254/2009-04-04/meta-data/public-ipv4


turn 서버를 실행시에는 turnserver -X <public_ip>를 설정하여 수행하시면 됩니다.


5. 이게 끝일까요? 가 아니고 turn 서버를 위해 amazon 인스턴스에 방화벽 구멍을 내주어야합니다. 방화벽설정은 EC2 management의 Security Group관리에서 설정가능합니다. 기본적으로 TCP/UDP 양쪽 Custom rule에 3478번을 열어줍니다. 3478은 turnserver의 연결 Default port입니다.

만약 turnserver 연결 포트를 변경하셨다면 당연히 여기도 바뀌어야합니다. 그리고 turn server가 relay를 위해 사용하는 udp port range를 잡아줍니다. 자기가 알맞게 적당히 설정하시면 됩니다.(ex : UDP 51000 ~ 52000)


6. User credential, Public IP, 방화벽 설정이 완료되면 드디어 TURN서버를 구동할 준비가 된것입니다.

이후 TLS/DTLS 기능을 위해서는 해당 사용 port를 다시 열어주어야하지만 제가 서비스하는 WebRTC에서는 TLS/DTLS지원이 아직 확정이되지 않아 이정도만 합니다


#turnserver -X <public_ip> --no-tls --no-dtls --min-port 51000 --max-port 52000 -o -u <userid:password> -r <realm> -a


위와같이 실행하시면 아래와 같이 나오면서 서버가 동작합니다.


RFC 5389/5766/6062/6156 STUN/TURN Server, version Citrix-1.7.2.0 'Superior Glokta'

File found: /usr/local/etc/turnserver.conf

File found: /usr/local/etc/turnserver.conf

File found: /usr/local/etc/turnuserdb.conf

===========Discovering listener addresses: =========

Listener address to use: 127.0.0.1

Listener address to use: xxx.xxx.xxx.xxx

Listener address to use: ::1

=====================================================

===========Discovering relay addresses: =============

Relay address to use: xxx.xxx.xxx.xxx

=====================================================

IO method (listener thread): epoll


이상 TURN서버 설치기를 마무리합니당~


부족한 내용이나 조언 감사히 받습니당 :-)