Pages

2014년 10월 30일 목요일

[기타] Asterisk 을 이용한 voip 테스트

1. 무엇을 할 것인가?

먼저 위에서 언급한 내선번호 통화에 대해 구체적으로 정리하고자 한다. asterisk를 설치하고 간단한 설정을 마치면 sipdroid나 netdial 등의 소프트웨어를 스마트폰에 설치하여 한대는 내선번호 100번으로 또 다른 한대는 101번으로 할당하여 이들간의 통화가 가능하다. sipdroid나 netdial의 사용법은 인터넷 검색을 통해 쉽게 찾을 수 있을 것으로 생각한다.


[그림 1] 개념도

위 그림에서 볼 수 있는 것처럼 100, 101번의 전화번호는 asterisk에서 설정해 주는 값이며, 사용자의 전화에는 사용자 계정, 비밀번호, asterisk 서버를 지정해 주면된다. 물론 다른 설정도 많지만, asterisk에서 특별히 설정을 만지지 않는다면 voip 소프트웨어의 기본 설정으로도 잘 동작할 것이다.


2. asterisk 설치 및 설정

본인의 경우 설치에서는 큰 어려움이 없었으므로 이 글에서는 설명을 생략하겠습니다. 자세한 설명은Asterisk™: The Definitive Guide, Chapter 3. Installing Asterisk 을 참고해 주세요.
설정을 해 주어야 하는 화일은 2가지로, /etc/asterisk 아래에 sip.conf, extension.conf 입니다. (책에는 iax.conf 설정이 나와 있지만, 내선 통화에서는 필요하지 않은 화일입니다.) 아래 그림은 sip.conf와 extensions.conf가 어떻게 연결되는지를 보여주는 좋은 그림입니다.


[그림 2] sip.conf와 extensions.conf와의 관계


2.1 sip.conf 설정

------------------------------------------------------------------------------------
[general]
context=unauthenticated     ; default context for incoming calls
allowguest=no                 ; disable unauthenticated calls
srvlookup=yes                 ; enabled DNS SRV record lookup on outbound calls
udpbindaddr=0.0.0.0 ; listen for UDP requests on all interfaces
tcpenable=no ; disable TCP support

[office-phone](!) ; create a template for our devices
type=friend ; the channel driver will match on username first, IP second 
context=LocalSets ; this is where calls from the device will enter the dialplan
host=dynamic ; the device will register with asterisk
nat=yes ; assume device is behind NAT
; *** NAT stands for Network Address Translation, which allows
; multiple internal devices to share an external IP address.
secret=s3CuR#p@s5 ; a secure password for this device -- DON'T USE THIS PASSWORD!
dtmfmode=auto ; accept touch-tones from the devices, negotiated automatically
disallow=all ; reset which voice codecs this device will accept or offer
allow=ulaw ; which audio codecs to accept from, and request to, the device
allow=alaw ; in the order we prefer

; define a device name and use the office-phone template
[0000FFFF0001](office-phone)
; define another device name using the same template
[0000FFFF0002](office-phone)
------------------------------------------------------------------------------------
[]로 묶여진 섹션들이 4개 보이는 군요, general, office-phone, 0000FFFF0001, 0000FFFF0002. 
설명에 들어가기 앞서 dialplan에 대한 설명이 있어야 할 것 같습니다. 제가 지금까지 파악한 바로 dialplan은 전화를 거는 사람과 받는 사람을 어떻게 연결시켜 줄 것인지를 정의하는 문장들입니다. extensions.conf에 정의되는 문장들이 바로 dialplan 이죠.

general은 일반적인 설정값을 정의합니다. context를 unautenticated로 정의하면 전화 연결이나 통화 내용을 보호할 수 없다는 뜻 정도로 생각됩니다만.. 저도 정확히는 모르겠습니다. 원문을 참고해 주세요. allowguest가 no로 정의되어 있으므로 명시적으로 계정을 가진 사람만 통화를 할 수 있다는 뜻입니다. srvlookup 은 yes로 설정되었으므로 받는 사람이 위치한 네트워크를 dns 이름으로도 찾을 수 있도록 한 것으로 보입니다. 아~~~ 정확하게는 모르겠어요.. 처음이니까.. 그냥 따라 합니다.^^; udpbindaddr 은 asterisk 서버에 네트워크 인터페이스가 여러 개 있을 경우에 의미를 갖는 설정인데요. 특정 인터페이스가 아닌 모든 인터페이스를 사용하고자 할 때는 0.0.0.0을 씁니다. voip 전화는 udp를 이용하므로 tcpenable을 no로 설정하여 TCP는 사용하지 않습니다.

[office-phone]옆에 있는 (!) 보이시죠. 이 표시는 템플릿을 정의한다는 의미를 갖습니다. 이 예제에서 0000FFFF0001, 0000FFFF0002 총 2개의 sip 계정을 정의하고 있는데요. 각 사용자별로 공통된 사항은 템플릿으로 정의하여 계정옆에 템플릿 이름을 붙이면 템플릿과 다른 내용만 각 사용자 항목에서 정의하면 됩니다. 예를 들어 위의 sip.conf 화일에 
[0000FFFF0003](office-phone) ; template must be on same line and no space between
secret=@N0th3rP4S5
을 추가하면 [0000FFFF0003] 사용자에 대해서는 비밀번호를 다른 것으로 하겠다는 의미가 되겠습니다.

office-phone 섹션에서 type은 peer, user, friend가 가능합니다. peer는 전화를 거는 사람의 IP 주소와 udp port 번호를 참조해서 적합한 사용자 인지를 인식하고 user는 사용자 계정을 가지고 적합성을 판단합니다. friend는 peer와 user를 합쳐놓은 것입니다. 책에서는 friend를 사용하는 것을 추천하고 실제 설정도 그렇게 되어 있네요. context에는 LocalSets로 정의되어 있는데요. extensions.conf에 LocalSets이 섹션으로 정의되어 있습니다. 여기에는 dialplan을 위한 참조점으로 보시면 되겠습니다. host를 dynamic으로 등록하면 IP를 동적으로 할당받는 환경에서도 voip 전화에 할당된 IP 주소를 인식할 수 있습니다. 명시적으로 IP 주소를 할당하여 사용할 수도 있습니다. 사설IP를 쓰는 환경이라면 nat를 yes로 해 주어야 겠죠. secret는 계정에 대한 비밀번호입니다. dtmf는 touch-tone과 관련이 있다는데.. 뭔지 모르겠습니다. disallow와 allow는 음성통화시 사용되는 codec을 정의하는 부분인데요. 정의하기전에 disallow=all로 하여 일단 모든 코덱을 쓰지 않는 것으로 설정한 후 사용할 코덱을 설정합니다. allow중 위에 있는 줄이 더 높은 사용 우선순위를 갖습니다.

이 책에서는 계정이름으로 장치의 MAC 주소를 사용할 것을 권장하고 있습니다. 예를 들면, 0000FFFF0001, 0000FFFF0002 이지요. 하지만, 공백이 없는 영문과 숫자로 구성된 아이디면 아무거나 사용할 수 있습니다. 사용자 계정과 관련하여 흥미있는 내용이 있는데요. 전화를 걸 때는 내선 번호인 100, 101을 이용하지만, 수신했을 때 발신자 정보에는 전화건 사람의 계정 이름이 나옵니다. 

sip.conf 를 위의 내용으로 입력한 후 저장합니다. sip.conf의 수정된 내용을 asterisk에 반영하기 위해 서버를 죽였다가 살리거나, CLI에서 아래와 같이 입력해 줍니다.
*CLI> module reload chan_sip.so
참고로 asterisk를 실행시킬 때 
$ sudo asterisk -vvvc
위 명령어를 이용하면 asterisk가 무슨 일을 하고 있는지 자세히 볼 수 있고 CLI도 입력할 수 있습니다.

sip 모듈을 다시 실행시킨 후 
*CLI> sip show peers
*CLI> sip show users
를 실행시키면 sip.conf에 입력한 내용이 시스템에 어떻게 반영되었는지 볼 수 있습니다.

예)
*CLI> sip show peers
Name/username Host Dyn Nat ACL Port Status
0000FFFF0001/0000FFFF0001 192.168.1.100 D N 5060 Unmonitored
0000FFFF0002/0000FFFF0002 192.168.1.101 D N 5060 Unmonitored

* 혹시 sip.conf가 시스템이 이미 존재해서 이 문서에서 추가된 내용을 어떻게 넣어야 할지 고민하시는 분이 있다면 mv로 원 화일을 과감히 백업하시고 이 문서에 있는 예제로 대체해서 테스트해 주세요.


2.2 extensions.conf 설정

------------------------------------------------------------------------------------
[LocalSets]
exten => 100,1,Dial(SIP/0000FFFF0001) ; Replace 0000FFFF0001 with your device name
exten => 101,1,Dial(SIP/0000FFFF0002) ; Replace 0000FFFF0002 with your device name

exten => 200,1,Answer()
    same => n,Playback(hello-world)
    same => n,Hangup()
------------------------------------------------------------------------------------

책의 5장에 extensions.conf의 각 라인에 대한 자세한 설명은 없습니다. 하지만 간단하죠. LocalSets 섹션은 sip.conf의 context에서 나왔던 설정값이죠. 그 부분이 여기로 점프하도록 되어 있는거죠. 그리고 내선(extension) 번호 100번은 SIP 계정, 0000FFFF0001으로 101번은 0000FFFF0002으로 맵핑되는 것입니다. 중간에 1은 뭔지 모르겠어요. 그리고 200번 번호는 테스트용으로 전화를 걸면 자동으로 전화수신이 되고 1초 정도 후에 자동으로 끊어집니다. 전화를 걸고 바로 수화기를 귀에 대면 "Hello"라는 여성의 목소리를 들을 수 있습니다. asterisk 콘솔에는 전화가 걸려왔다는 표시가 되고 hello-world를 뿌리고 전화가 끊어진다는 표시가 나와요..

화일을 저장한 후 아래 명령을 이용해 변경된 사항을 적용합니다.
*CLI> dialplan reload

이제 전화할 준비가 되었군요. 100번으로 설정된 전화에서 101번으로 전화를 걸어보세요. 코덱이 나빠서 그런데 조금씩 끊기고 딜레이도 좀 있는 것 같지만, 벨도 울리고 전화도 됩니다. 감격입니다.

댓글 없음:

댓글 쓰기