LennyでAsteriskというIP-PBXを動かしてみました(その2) | 雲の上はいつも青空

雲の上はいつも青空

不思議な経歴をもつエンジニア!?の徒然なブログです。
お仕事関係の話が多いと思いますが、コメントとかもらえると中の人はとても喜びます(^O^)/

それではオープンソースでIP-PBXを実現する、Asteriskの設定と構築を行います。
その1で書いたように、アジルフォンproの契約を行うと、以下の情報が取得できます。

外線着信番号    これは03から始まるお馴染みの電話番号
アジルフォンNo. 外線着信番号と1対1で発行されます
パスワード アジルフォンのWebサイトにあるmyページのログインパスワードと同じ
sipサーバ名 インターネットのグローバル側に設置されています

雲の上はいつも青空-IPフォン2インターネットを利用してのsipサーバとの接続について、本来、外線着信はインバウンド接続(外からLAN内に設置されているsipサーバにパケットがやってくる)になるのですが、動的IPやNATを越える事を考慮して、利用者のsipサーバが、ITSP(Internet Telephony Service Provider)側のsipサーバへ最初にコネクションを張っておいて、そのコネクションを使ってサーバ間で通信を行うようになっています。
これをAsteriskの世界ではレジストすると表現します。

このため、利用回線のIDであるアジルフォンNo.とパスワードが必要となるわけです。

今回構築するVoIPネットワークは、以下のようになります。

1.外線が着信するITSP側にあるsipサーバ
2.自宅内ネットワーク(ローカル側)にAsteriskで構築したIP-PBX(sipサーバ)
3.iCOM製VP-71:無線LAN接続のコードレスIPフォン
4.X-lite:PCにインストールするソフトウェアIPフォン


3と4のIPフォンには内線番号をふります。200,201,202の三つを割り当てました。

【Asteriskのインストール】
それでは、Windows server 2008 Foundationで動いているVMware Serveで仮想化されたLennyへ、Asteriskをインストールします。

インストール自体は簡単で、aptitude install asterisk だけで、全て必要なプログラムはインストールされます。システム自体も、VoIPカードやISDNカード等の特殊なハードウェアを使わないのであれば、仮想化されたシステムであっても問題なく動作します。

LennyでインストールされるAsteriskは1.4.21というバージョンで、Debian用にチューンされています。本家のサイトからtarボールをもってきて自力でコンパイルというのも良いのですが、ちょっとバージョンが古くてもdebパッケージで運用することをお勧めします。

【Asteriskの設定】
それでは、Asteriskの設定をはじめます。
まずは、動作与件を整理しておきましょう。

1.外線からの着信は全ての内線(200,201,202)を呼び出す
2.発信は電話番号1を優先して使い、ビジーの時に電話番号2を使う
3.着信後の保留が可能(保留音を流す)
4.着信後、内線へ転送が可能
5.着信後、外線へ転送が可能
6.転送が終了するまで保留音を流す


設定するファイルは3つです。
普通にsipというプロトコルだけで構築するなら、sip.confとextension.confの二つのファイルを設定すればおしまいですが、今回、ローカル側のsipサーバとITSP側のsipサーバとの接続に、Asterisk独自のIAX2というプロトコルを使って接続しているので、ちょっと設定内容が一般とは異なります。
※IAX2に関してはこちらが詳しいです。
/etc/asterisk/sip.conf

[general]
allowguest=no
maxexpirey=3600
defaultexpirey=3600
context=extd
port=5060
bindaddr=0.0.0.0
srvlookup=yes
disallow=all
allow=ulaw
language=jp

[200]
type=friend
username=200
secret=200pass
canreinvite=no
host=dynamic
mailbox=200

[201]
type=friend
username=201
secret=201pass
canreinvite=no
host=dynamic
qualify=4000 ←201に無線IPフォンを設定してます。これは4秒おきのkeep alive!
mailbox=201

[202]
type=friend
username=202
secret=202pass
canreinvite=no
host=dynamic
mailbox=202
無線のIPフォンは省電力の為にスリープすることがあり、そうすると呼び出しに時間がかかるので、4秒おきにパケットを送り眠らないようにしています。

また、mailboxの指定は留守録を使わないときでも設定だけをしておくと、ログがワーニングに埋まることが避けられます。
usernameとsecretは、端末認証に使うIDとパスワードです(上記のは例)。
これはLAN内なので、パスワードは全部同じでも良いですが、無線IPフォンだけはちょっとひねったパスワードにしておくと良いかもしれません。


iax.confで、ITSP側のsipサーバへレジストする設定を記述します。
以下は例として、アジルフォンNO.が899991と899992、パスワードはpasswordとしています。
また、899991が着信電話番号1で、899992が電話番号2に対応しているものとします。
/etc/asterisk/iax.conf

[general]
language=jp
disallow=all
allow=ulaw
jitterbuffer=no
forcejitterbuffer=no

register => 899991:password@sip.agile.ne.jp
register => 899992:password@sip.agile.ne.jp

[899991]
type=user
context=inbound
auth=plaintext

[899992]
type=user
context=inbound
auth=plaintext

次が一番難関だったextension.confです。
この設定ファイルで、子機がダイヤルしたときのAsteriskの挙動を規定します。
/etc/asterisk/extension.conf

[general]
writeprotect=no
priorityjumping=no

[inbound]
exten => s,1,Dial(SIP/200&SIP/201&SIP/202,120,t) ←着信した全部の子機を鳴らす
exten => s,n,Hangup

[extd]
exten => _0.,1,Set(CALLERID(num)=899991)
exten => _0.,n,Dial(IAX2/899991:password@sip.agile.ne.jp/${EXTEN},120,T)
exten => _0.,n,Dial(IAX2/899992:password@sip.agile.ne.jp/${EXTEN},120,T)
exten => _0.,n,Hangup
exten => _1.,1,Set(CALLERID(num)=899991)
exten => _1.,n,Dial(IAX2/899991:password@sip.agile.ne.jp/${EXTEN},120,T)
exten => _1.,n,Dial(IAX2/899992:password@sip.agile.ne.jp/${EXTEN},120,T)
exten => _1.,n,Hangup
exten => _20Z,1,Dial(SIP/${EXTEN},120,tT)
exten => _20Z,n,Hangup
まずは、generalにあるpriorityjumpingに注目してください。
これはAsteriskでも古いバージョンで有効だった機能だそうで、互換性維持のため残っているので、先々なくなるとの事です。
私も最初は、priorityjumpingをonにした設定を書いていたのですが、動作確認が終わった時点でその設定は捨てました。この部分の解説を書き出すと長くなるのですが、priorityjumpingをonにすると、プライオリティーの部分がbusyの時に+101されると記憶しておくと良いかもしれません。
※Dialコマンド発行時のプライオリティーが2だとすると、busyのときは+101されて103になる。

今回は、プライオリティーはnを設定したので自動発番の機能を使っています。

■以上の設定を行いAsteriskを動作させると、一番最初に書いた与件はすべて満たします。
 しかし、回線が2つあるのに電話番号1を使っているときに、その同じ着信電話番号1に電話がかかってくると当然のことながら相手には話中になってしまいます。

独立した2つの番号を持っているので、これは仕方の無い事なんでしょう…
やっぱりITSP側にあるsipトランクを使ってシステムを組んでみたいです。
※3回線くらいでトランクサービス、お願いします>ITSPの中の人

■ちょっと長くなってしまったので、無線IPフォンの設定と、デフォルトでは鳴らない保留音の話は次回に書くことにします。

最後にpriorityjumpingをonにしたときの設定です。ご参考までに…
[general]
writeprotect=no
priorityjumping=yes
[inbound]
exten => s, 1,Dial(SIP/200&SIP/201&SIP/202,120,t)
exten => s, 2,Congestion
exten => s,102,Busy
[extd]
exten => _0., 1,Set(CALLERID(num)=8583553)
exten => _0., 2,Dial(IAX2/899991:password@sip.agile.ne.jp/${EXTEN},120,T)
exten => _0., 3,Congestion
exten => _0.,103,Dial(IAX2/899992:password@sip.agile.ne.jp/${EXTEN},120,T)
exten => _0.,104,Congestion
exten => _0.,204,Busy
exten => _1., 1,Set(CALLERID(num)=8583553)
exten => _1., 2,Dial(IAX2/899991:password@sip.agile.ne.jp/${EXTEN},120,T)
exten => _1., 3,Dial(IAX2/899992:password@sip.agile.ne.jp/${EXTEN},120,T)
exten => _1., 4,Congestion
exten => _1.,103,Busy
exten => _2XX, 1,Dial(SIP/${EXTEN},120,tT)
exten => _2XX, 2,Congestion
exten => _2XX,102,Busy

0から始まる通常の電話番号は、899991の回線で発信を試み、もしbusyだと
プライオリティナンバーに+101されるので、103へ飛びます。
そこで、今度は899992の回線で発信を行う。…という動作をします。

1から始まる特番(117とか177…)は、なぜか二行続けて書いてもうまくいきました。
理由はわかりませんww