« 自宅サーバ →次はドメイン? | メイン

家庭内線電話をAsteriskで!(Pogoplug)

前回のエントリー「話題の『Pogoplug Mobile』をLinux box化」で、Pogoplug Mobile+openpogoによるLinux Boxを自宅サーバに仕立て上げました。

HTTPサーバ、SMTPサーバ(relay only)、スクリプト言語(Perl)、ファイルサーバ(SAMBA)、OpenVPNなど一通りインストール済みです。
ちょっと変り種で、IP-PBX「Asterisk」を導入しました。以下、覚え書きです。

ippbx.png

◆前置き

スマートフォン(特にiPhone@ソフトバンク)のネット定額を逆手にのった、NTT陣営の「050 plus」が好調のようです。
OCNやぷらら等のNTT系のIP電話(050番号)が相手であれば、通話料無料(月額固定費315円のみ)です。
同じようなコンセプトのものを、フリーソフトで自宅IP-PBXを組んで、構築してみましょう。こちらは月額費用がかかりません。

Asterisk自体は、ありきたりのLinuxマシンにインストールできます。また、1CD LinuxやVMwareイメージでも配布されているようです。
需要が少ないので高価ですが、ルータのような「ボックス」でも売られています。
今回は、冒頭に上げたように「Pogoplug Mobile」が導入対象サーバです。

◆Asterisk on Pogoplug

バージョンは複数ありますが、色々検討して1.4にしました。インストールを始めましょう。

ipkg install asterisk14
ipkg install asterisk14-core-sounds-en-gsm
ipkg install asterisk14-extra-sounds-en-gsm

以上。

◆設定編

openpogoにインストールすると、設定ファイルは/opt/etc/asterisk/*.confに配置されています。
"とりあえず"内線電話として使うには、sip.conf、extensions.conf、rtp.conf あたりを設定すればよいです。

sip.conf ... 内線電話端末用のアカウント/パスワード、外部SIPサーバへのregister情報 を記載します。
extensions.conf ... ダイヤルプラン(何番にかけると内線何番を呼び出す、0発信すると外線(ITSP)経由で電話するetc)を記載します
rtp.conf ... 通話で使うudpポートなどを指定します。
voicemail.conf ... ボイスメール(留守番電話)のアカウント/パスワードなどを設定します。

・内線端末を設定する

sip.confにアカウント情報を記載します。(サンプルとして201~209の内線が定義済ですが、ここでも一例として載せています)


[201]
type=friend
username=201
secret=パスワード
canreinvite=no
host=dynamic
dtmfmode=rfc2833
callgroup=1
pickupgroup=1
nat=yes
mailbox=201

次にダイヤルプラン...201が押されたら内線SIP/201を呼び出すというルール...を、extensions.confへ記述します。サンプルとして[demo]コンテキストが定義済です。話中ならvoicemailに転送されます。


exten => _201,1,Dial(SIP/201,30,tT)
exten => _201,n,NoOp(${DIALSTATUS})
exten => _201,n,GotoIf($["${DIALSTATUS}"="BUSY"]?vm-rec)
exten => _201,n,GotoIf($["${DIALSTATUS}"="NOANSWER"]?vm-rec)
exten => _201,n,GotoIf($["${DIALSTATUS}"="CHANUNAVAIL"]?vm-rec)
exten => _201,n,Hangup
exten => _201,n(vm-rec),Answer()
exten => _201,n,Wait(1)
exten => _201,n,Voicemail(201,u)
exten => _201,n,Hangup

3cxphone.png 次に端末側の設定をします。SIPを喋れるIP電話機のほか、パソコン用やスマホ用にフリーソフトのSIPフォン(ソフトフォン)を導入すれば端末になります。 ここではスマートフォンで使う想定ですので、SIPサーバのポート指定(5060以外)できて、動作が安定している「3CX Phone」を選びました。

通話するためには、当然ですが、同じような設定が複数(201用と202用...と)必要です。
画面イメージは、内線番号201として登録した端末から、内線205にダイヤルしているものです。

・外部SIPサーバへ登録

内線同士で通話できたら、外線発信したい/外線から着信したいと思いますね。
インターネットサービスプロバイダをISPと呼ぶのに対して、インターネット電話のはITSP(Internet Telephony Service Provider)と呼ぶようです。
さて、OCNやぷらら等を著名なプロバイダであれば、050番号がセットになっていると思いますので、それが使えます。
フレッツ光/ADSLで、SIPアカウントが不明の場合(ISPのWebページにアクセスすると、VoIP機能付きルータにアカウント/パスワード/各種サーバが自動設定される場合)は、その設定ページのHTMLソースを覗いてみてください:-)。

sip.confの[general]セクションに、SIPサーバへの register の記載と、当該SIPサーバ用のコンテキストを記載をします。
詳細は、ITSP接続 - VOIP-Info.jp Wikiをご参照ください。
変わったサンプルで、localphone を使ったsip.confの記述例をご紹介します。


register => アカウント:パスワード@localphone
;;
[localphone]
type=friend
username=アカウント
fromuser=アカウント
fromdomain=localphone.com
secret=パスワード
canreinvite=no
dtmfmode=rfc2833
insecure=port,invite
host=localphone.com
callgroup=1
nat=yes

登録した内線から、外線をかけたい。外線から着信して、「はい、○○です。内線番号を押してください」風な自動応答・内線取次ぎをしたいとします。extensions.confにダイヤルプランを作ります。


[demo]
;
; We start with what to do when a call first comes in.
exten => s,1,Wait(1) ; Wait a second, just for fun
exten => s,n,Answer ; Answer the line
exten => s,n,Set(TIMEOUT(digit)=5) ; Set Digit Timeout to 5 seconds
exten => s,n,Set(TIMEOUT(response)=10) ; Set Response Timeout to 10 seconds
exten => s,n(instruct),BackGround(hello) ;
exten => s,n,WaitExten ; Wait for an extension to be dialed.
;
; # for when they're done with the demo
exten => #,1,Playback(demo-thanks) ; "Thanks for trying the demo"
exten => #,n,Hangup ; Hang them up.
;
; A timeout and "invalid extension rule"
exten => t,1,Goto(#,1) ; If they take too long, give up
exten => i,1,Playback(invalid) ; "That's not valid, try again"
;
;
; 外線0発信 via Localphone
exten => _00[3589].,1,Wait(1)
exten => _00[3589].,n,Dial(SIP/0081${EXTEN:2}@localphone,10,T)
exten => _00[3589].,n,Hangup()

BackGround(hello)が、自動応答メッセージです。「はい、○○です」を吹き込んで、/opt/var/lib/asterisk/sounds/hello.gsm を事前に用意してください。
gsm形式へのコンバートはWindows用なら、Switchがおすすめです。

発信は0発信を用意しました。海外に発信しないように0発信+0[3589]限定 (03、050、080、090 など国内電話に限定)の例です。
例なので頑張っていないので、052なども繋がります。050番号の無料通話先ごとにSIPサーバを分けたりとか、いろいろできると思います。

localphoneの電話のかけ方は、00 + 国番号(日本81) + 先頭0を除いた日本国内の電話番号 になります。
0発信で03-1234-5678に電話したい場合、端末からダイヤルする番号 と localphoneへの電文は以下のとおりです。
ダイヤル:00312345678
SIPサーバ:0081312345678 
※ダイヤルプランにある{$EXTEN:2}は、2桁飛ばした以降のダイヤル=「312345678」の意味です。


・NAT越え

ブロードバンドルータのNAT配下にAsteriskを設置する場合、VOIP-Info.jp Wikiが役に立つと思います。

うちのPogoplugもNAT配下にあります。
ダイナミックDNSでグローバルIPが常に特定できるようにする、ルータのIPマスカレード機能でSIPとRTPのポートを通す、Asteriskにそれらを設定する、の3段階で可能でした。
ちなみに、SIPのポートはsip.confにあります(デフォルト:5060/UDP)。ただし、うちのルータはIP電話対応なのでか、使っていなくてもシステム予約なのか、5060/UDPを開放できなかったので、別ポートを指定しています。
RTPで使用するポートはrtp.confで指定されています。

sip.confの抜粋です。


bindport=5061 ; UDP Port to bind to (SIP standard port is
; bindport is the local UDP port that Asterisk w
;;
externhost=xxxx.dydns.org
localnet=192.168.1.0/255.255.255.0

◆結び

スマートフォンからインターネット経由で、自宅PBXにregisterさせることも可能ですので、OCNドットフォンやぷららフォンなどブロードバンド回線に紐づいたIP電話を、月額費用なしで利用することができます。
理論的には可能な一方で、公開する=セキュリティ(アタックされる⇒海外に電話される⇒身に覚えのない請求etc)も色々と気を使わないといけません。
パスワードを類推困難にしたり、外線発信番号を特殊にしたり、ネットワーク接続可能なドメインを限定したり、VPNを用いたり...。

Asteriskについては、こちらのサイトをとても参考にさせていただきました。
VoIP-Info.jp Wiki