BLOG main image
WonJae Lee

분류 전체보기 (544)
diAry - 日記 - 일기 (283)
Lecture & Tip (92)
Favor (164)
nutra forskolin
超울트라판..
potty training chart
超울트라판..
251,836 Visitors up to today!
Today 6 hit, Yesterday 36 hit
daisy rss
tistory 티스토리 가입하기!
Daum view
'Lecture & Tip/linux programming[리눅스]'에 해당되는 글 10건
prev"" #1 #2 next
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
2008.08.08 15:57
삼성 DM-Z59a에 CentOS5를 깔고 NVIDIA드라이버를 설치하는데

계속 실패를 하였다. log를 확인해보니 'nvidia.ko'를 insmod할때 애러가 나는 것..

'-1 : no such device' 두둥.....왜 카드를 못찾지?

구글 박사님 서치 후...

/boot/grub/grub.conf에다가 noapci acpi=off 를 추가했더니...

덜컥 된다...이런 당황스런...냠냠..어쨌든 미션 컴플릿~!!!




Name
Password
Homepage
Secret
2008.07.08 18:57

일단 하드 속도 체크를 한다.

$ hdparm -t /dev/hda <--자신의 hdd가 잡혀있는 device

엔터를 치면
/dev/hda:

 Timing buffered disk reads:  XXX MB in  XXX seconds =  XX MB/sec
하고 속도가 나오는데 난 3.8이 나왔다.

사실 리눅스에 붙어있는 하드가 SATA2인데 dev/hda로 잡힌 것이 이상한 것이다.

부팅이 될때 hda부터 검색이되어 SATA하드가 일반 hda로 잡혀서 그렇단다.
그래서 이것을 고치기위해

/boot/grub/grub.conf 파일을 열어서

kernel옵션 맨 뒤에 hda=none 이라고 넣어준다.

재부팅하고 위의 속도체크를 해보면!!~~!!!

나의 경우 76.2MB/sec가 나왔다 무려 20배 속도업!!!

버벅이던 리눅스 장비야 가라~ 유후~

이미 아는 이야기 뒷북이라면 그냥~ ㅋㅋ





Name
Password
Homepage
Secret
2007.11.26 22:45

I'm sure that the attribute values are set on xbinder structure, But XBinder always lost all values when it encodes.

ex code)

Init_a_ELEM(&pctxt, &a_ELEM);
a_ELEM.u.attr1.value = blurblur;
a_ELEM.u.attr2 = int_val;
rtXmlSetEncBufPtr(&pctxt, ouput_string, 1024);
XmlE_a_ELEM(&pctxt, &a_ELEM);

result)
<a />


-,.-;;;;;;;

.
So I was googling, but the result is useless...
.
!
.
When I see the sample code, I found something...and changed the code

ex code)

Init_a_ELEM(&pctxt, &a_ELEM);
a_ELEM.u.attr1.value = blurblur;
a_ELEM.u.attr2 = int_val;
a_ELEM.m.attr1Present = TRUE;   //added
a_ELEM.m.attr2Present = TRUE;   //added
rtXmlSetEncBufPtr(&pctxt, ouput_string, 1024);
XmlE_a_ELEM(&pctxt, &a_ELEM);

result)
<a attr1="blurblur" attr2="int_val"/>

o,.0);;; it works;;;;

Why did I write this useless article?

Because there are so many people who did kill the time as like me..;;








Name
Password
Homepage
Secret
2007.11.22 15:52
This is a example to get size of specific file.

#include <sys/stat.h>

int main(){
  struct stat buffer;
  stat("FILE LOCATION",&buffer);
  printf("file size : %d\n", buffer.st_size);
}

Is it worthy? kk

I forgot where it is from but I know only found this by google. :)




Name
Password
Homepage
Secret
prev"" # next

www.flickr.com
www.flickr.com