こんにちは。インフラエンジニアのTYです。普段はAWSやAzureなどのクラウドサービスを扱ったサービスの構築及び、検証などの業務を行っています。
システム導入時の検証でAsteriskを使用したPBX環境を構築しました。今回はAsteriskについてご紹介致します。
1.Asterisk概要
AsteriskはオープンソースのPBX(Private Branch eXchange)です。PBXはオフィスやコールセンターなどのように1つの親番号に着信しそこから適切な内線電話機やオペレーターに通話を転送する必要がある際に使用されます。
AsteriskはPSTNやSIPプロトコルによる通信はもちろんのこと、ACDシステムにWebRTCの機能を持たせて、利用することが可能です。
*ACD(Automatic Call Distribution):着信呼自動分配装置
*WebRTC(Web Real-Time Communication):ブラウザから発信される映像や音声・その他ファイルといったデータを優れた処理能力で通信する技術
Asteriskの一部機能となりますが、次項からAsteriskをSIPサーバーとして構築し、SIPによる内線通話を実現する環境を構築したいと思います。
2.構築
AWS EC2インスタンスにUbuntuをインストールし、そこにAsteriskをインストールしてSIPサーバーを構築していきたいと思います。
簡単な構成は以下の図のようになります。
では、構築していきましょう。
2.1 AWS
今回はAWS EC2インスタンスを利用します。もちろんローカル環境で行っても問題ありません。
2.1.1 EC2インスタンスの起動
Ubuntuを選択してセットアップを進めます。インスタンスタイプは小さいもので大丈夫です。
2.1.2 セキュリティグループ
以下のように設定します。
※SIPで使うUDPポートはデフォルトでは5060ですが、外部にAseteriskを構築する場合は、5060で空けないようにします。SIPのデフォルトポートを変更することでSIPを利用した攻撃の可能性を低減することができます。
2.2 Asteriskの導入
2.2.1 Asteriskのインストール
作成したEC2インスタンスにSSHでログインします。システムが更新されているか確認してください。
$ sudo apt-get update
今回aptでのインストールではAsteriskで使用を予定している機能が含まれていなかったため、今回はソースをダウンロードし、コンパイル時に使用する機能を含める状態にして
ビルドします。
$ cd ~
$ wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz
$ tar -xvf asterisk-18[tab]
$ cd asterisk-18.[tab]
$ sudo su
# contrib/scripts/install_prereq install
# ./configure --with-pjproject-bundled
# make menuselect
# make && make install && make config
# exit
$ cd ~
$ make menuselect はデフォルトのままsave&exitで大丈夫です。
最後に以下コマンドを実行しAsteriskのサンプル設定ファイルをインストールします。
~/asterisk-18.19.0$ make sample
2.2.2 Asteriskの設定
内線電話番号を2つ設定し、お互いに通話がつながるようにします。この際に設定する必要のあるファイルは”pjsip.conf”と”extensions.conf”の2つです。
/etc/asteriskに移動すると以下のようにたくさんのファイルがあると思いますので、一旦”pjsip.conf”と”extensions.conf”のファイル名を変更します。
$ mv pjsip.conf pjsip_conf_bak
$ mv extensions.conf extensions_conf_bak
それでは設定していきましょう。
まずはpjsip.confです。SIPサーバーに関する設定や内線電話(SIPクライアント)からの認証情報を設定します。
/etc/asterisk/pjsip.conf を以下のように設定します。
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5070 #デフォルトでは5060
[6001]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=6001
aors=6001
rewrite_contact = yes # 6001がNAT環境下の場合、必要。
[6001]
type=auth
auth_type=userpass
password=userpassword
username=6001
[6001]
type=aor
max_contacts=10
[6002]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=6002
aors=6002
rewrite_contact = yes # 6002がNAT環境下の場合、必要。
[6002]
type=auth
auth_type=userpass
password=userpassword
username=6002
[6002]
type=aor
max_contacts=10
“6001”,”6002”の type=auth にある”userpassword” は自由に設定してください
続いてextensions.confです。内線電話(SIPクライアント)からの発着信時のルールをここに記述します。
/etc/asterisk/extensions.confを以下のように設定します。
[from-internal]
exten = 100,1,Answer()
same = n,Wait(1)
same = n,Playback(hello-world)
same = n,Hangup()
# 6001がコールされたらSIPの6001を呼び出す
exten = 6001,1,Dial(PJSIP/6001,30,r)
same = n.Hangup()
# 6002がコールされたらSIPの6001を呼び出す
exten = 6002,1,Dial(PJSIP/6002,30,r)
same = n.Hangup()
ここまで設定出来たら以下のコマンドでAsteriskを再起動します。
$ systemctl status saterisk
ここまででAsteriskの設定は完了です。実際にSIPクライアントを接続し通話を行ってみましょう。
3.実機テスト
3.1 SIPクライアント設定
前章までの設定でAsteriskはSIPサーバーとしての機能を持つことができています。実際に通話ができるか確認する際には設定したAsteriskにSIPクライアントを登録(レジスト)して利用します。SIPクライアントはなんでも大丈夫ですが、今回はSIPクライアントとしてZoiperを利用します。
手元の端末2台にzoiperをインストールしたら起動し右下の歯車マークからAccountsを選択します。次にSIPAccountsを以下のように設定します。
設置画面には以下のように設定します。青枠のDomainの部分にはご自身のAsteriskサーバーのIPアドレスorドメインを入力、Passwordにはpjsip.confで設定したパスワードを入力してください。入力できたらregisterを選択し以下の画像のようにStatusがOKになればAsteriskにSipクライアントがレジストされています。
もう片方のSipクライアントも上記と同様にpjsip.confで設定したSipアカウントの情報を入力してください。本記事の内容通りだと6002のSIPアカウントがあると思います。
3.2 内線番号6001から内線番号6002に発信
ここまで設定ができたらZoiperの左下にあるDialPadから6001のアカウントなら6002にダイヤルし発信してみてください。うまく設定ができていれば6002のクライアントに着信するはずです。
4.まとめ
これでAsteriskを簡単なSIPサーバーとして構築し内線環境を構築することができました。この程度の設定で内線通話ができることは始めて構築した際は結構感動しました。
今回は内線の環境ですがTwilioやひかり電話などをAsteriskにレジストすることで、PSTN回線を用いてSIPクライアントと通話することなどもできますし、Asteriskはhttpサーバーの機能もあるため、Websocketサーバーとして運用することでWebRTC-Sipクライアントの通話も構築次第で可能になります。
私もまだまだ勉強中ですが、そのあたりの設定も機会があればまたお話ししたいと思います。
ありがとうございました。