BLOG main image
WonJae Lee

분류 전체보기 (544)
diAry - 日記 - 일기 (283)
Lecture & Tip (92)
Favor (164)
nutra forskolin
超울트라판..
potty training chart
超울트라판..
251,838 Visitors up to today!
Today 8 hit, Yesterday 36 hit
daisy rss
tistory 티스토리 가입하기!
Daum view
2013.04.02 14:30

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서버 설치기를 마무리합니당~


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







komzirak | 2014.10.06 10:47 신고 | PERMALINK | EDIT/DEL | REPLY
안녕하세요.
TURN 서버 EC2 Type은 어떤 것으로 하셨나요? 그리고, 혹시 운영하시면서 발생한 문제는 없으셨나요?
nurinamu | 2014.10.06 14:30 신고 | PERMALINK | EDIT/DEL
현재 c3 종류로 사용합니다. TURN을 Geo Route와 함꼐 사용하느라 여러대를 돌리고 있습니다. 그래서 지역별로 장애가 발생하는 지역에 따라 인스턴스 레벨을 올립니다.
rafael | 2014.10.07 19:12 신고 | PERMALINK | EDIT/DEL | REPLY
그러면 아마존에 TURN 서버를 지역별로 1대만 운영하시고 계시나요?
장애에 대한 즉각적인 자동화 대응을 위해 2대를 운영하고 1대 장애 발생시 다시 launching 하려는 방법을 고민중인데요.
그리고 TURN 서버 장애판단은 어떻게 하시는지 궁금합니다.
| 2014.11.19 11:29 | PERMALINK | EDIT/DEL | REPLY
비밀댓글입니다
nurinamu | 2015.01.09 15:07 신고 | PERMALINK | EDIT/DEL
아고 답변이 늦었습니다; 요새 블로그할 시간이 없어서;;
webrtc 서비스를 위해서 시그널서버는 필수이고
STUN,TURN은 선택입니다.
P2P가 아닌 중계상황에 대한 처리를 안하시려면 STUN만으로 충분하며, STUN서버는 공개된 것들이 많기 때문에 굳이 만들지 않으셔도 됩니다. :-)
Name
Password
Homepage
Secret
prev"" # next

www.flickr.com
www.flickr.com