Asterisk
Asterisk は完全な PBX (構内交換機) ソフトウェアです。Linux, BSD, Windows, macOS などで動作し、PBX が通常備えている機能は全て含まれています。Asterisk は4つのプロトコルで Voice over IP を実現し、比較的安価なハードウェアでほぼ全ての規格の電話装置と一緒に使うことが可能です。
Asterisk はボイスメールサービス、電話帳、電話会議、自動音声応答、コールキューイングを実現します。また、三者通話、発信者番号通知サービス、ADSI、IAX、SIP、H.323 (クライアントとゲートウェイの両方)、MGCP (コールマネージャのみ)、SCCP/Skinny をサポートしています。
この記事では家庭ネットワークにおけるシンプルな設定を説明し、SIP ソフトフォンを使って LAN 上の他の SIP ソフトフォンと会話できるようにします。
目次
インストール
asteriskAUR パッケージをインストールしてください。Cisco の IP 電話を使用する場合はパッチが適用されている asterisk-ciscoAUR パッケージを使うことが推奨されます (https://issues.asterisk.org/jira/browse/ASTERISK-13145 を参照)。
あるいは、asterisk-lts-20AUR パッケージをインストールすると、長期サポートリリースを入手できます(現在の最新 LTS メジャーバージョンは Asterisk 20です)。Asterisk LTS リリースは機能が少ない傾向にありますが、ずっと長い間メンテナンスされます。すべての asterisk バージョンのリリースサイクルに関する完全な詳細については、Asterisk Versions ページを参照してください。
インストールしたら asterisk.service
systemd サービスを有効化および起動してください。
SIP ソフトフォンと最低2つのマシンが必要です。SIP フォンとしては Blink (blinkAUR)、 Linphone (liblinphone-gitAUR) または X-Lite (xlite-binAUR) が推奨されます。
ilbc コーデックのサポートを有効にするには PKGBUILD の build
セクションの冒頭に以下を追加してください:
cd ${srcdir}/${pkgname}-${pkgver}/contrib/scripts echo | ./get_ilbc_source.sh
設定
Asterisk 20 から、従来の chan_sip
モジュールはデフォルトでコンパイルされなくなりました。Asterisk 21 がリリースされると(2023年10月予定)、chan_sip
は完全に削除されます(すでにマスターブランチから削除されています)。もし res_pjsip
よりも chan_sip
を使用したい場合は、asterisk-lts-18AUR をインストールしてください。これは、chan_sip
をビルドした最後の LTS リリースでした。
res_pjsip
は、より新しく、より高性能な Asterisk チャネルモジュールで、標準の SIP(Session Initiation Protocol)プロトコルをサポートしています。これは、多くのキャリア、電話会社、インターネット電話サービスプロバイダ(ITSP)、および企業で使用されている主要な VoIP(Voice over Internet Protocol)プロトコルです。ただし、res_pjsip
は、古い chan_sip
よりも設定がかなり複雑です。
広く受け入れられている Asterisk コミュニティの意見では、既存の設定がある場合に限り chan_sip
を使用し、res_pjsip
へのアップグレードも計画することを提案しています。新規インストールの場合は、res_pjsip
が推奨されます。上記で述べたように、chan_sip
はもはやメンテナンスされておらず、セキュリティ修正も(古い LTS リリースを除いて)行われないため、新しい Asterisk PBX 管理者は、サポートされている SIP チャネルドライバー(つまり、res_pjsip
)を選択するべきです。
既存の chan_sip
設定がある場合、Asterisk 20 でビルドするには、次の手順を実行します:asteriskAUR の PKGBUILD を編集し、build()
関数内で次の行を変更します:
PKGBUILD
make MENUSELECT_CFLAGS= OPTIMIZE= DEBUG= ASTVARRUNDIR="/run/$pkgname" NOISY_BUILD=1
これを menuselect ツールをビルドする呼び出しでプレフィックスし、chan_sip
を有効にします:
PKGBUILD
make menuselect.makeoptions && \ menuselect/menuselect --enable chan_sip && \ make MENUSELECT_CFLAGS= OPTIMIZE= DEBUG= ASTVARRUNDIR="/run/$pkgname" NOISY_BUILD=1
この手順は、asteriskAUR パッケージの更新ごとに行う必要がありますが、asteriskAUR が Asterisk 21 に移行すると、この手順は機能しなくなることに注意してください。
PJSIP
インストール後、Asterisk は res_pjsip
設定を /etc/asterisk/pjsip.conf
に持っています。Asterisk に同梱されているサンプルファイルには、いくつかの基本的な例が含まれていますが、すべての pjsip オプションには網羅されていません。続行する前に、Asterisk Wiki Security best practices article と Configuring res_pjsip を読むことをお勧めします。
この記事には、基本的なシングル SIP 電話と複数の SIP トランクの例が含まれており、SIP Station SIP trunks, from Sangoma を使用しています。SIP Station の推奨に従って、2つの SIP トランクが冗長性のために SIP Station で設定されています。次の例は、Sangoma/Digium D60 ハードウェア電話を使用してテストされましたが、SIP 2.0 準拠のハードウェア電話またはソフトウェア電話でも十分です。
この例では、Asterisk PBX サーバーと SIP 電話がプライベートな IPv4 LAN 上にあり、NAT ルーターがサーバー/電話と WAN/インターネットの間にあると仮定しています。IPv6 を使用したい場合は、Configuring res_pjsip for IPv6 の記事をお読みください。
modules.conf
まず、res_pjsip.so
が noload =
でプレフィックスされていないことを確認してください。この例では、require =
プレフィックスを使って、chan_pjsip.so
のロードに失敗した場合に Asterisk がロードに失敗するようにしています。これは絶対に必要ではありませんが、res_pjsip
がロードされない場合、Asterisk がロードされる意味がないかもしれません。
/etc/asterisk/modules.conf
;... require = chan_pjsip.so ;...
pjsip.conf
pjsip.conf
の設定に取り掛かる前に、PJSIP Configuration Wizard を確認してください。これは、1つの SIP プロバイダー/ ITSP のみの簡単なユースケースに役立ち、pjsip オブジェクトの多くを自動的に処理します。
ファイル pjsip.conf
は、ini 形式の設定ファイルで、[section-headers-in-square-brackets]
と、ハッシュ(#
)またはセミコロン(;
)をコメント文字として使用します。セクションヘッダーの下の各行は key=value
ペアで、セクション固有のキーを指定された値に設定します。セクションヘッダーには、閉じる角括弧の後に (!)
を追加できることに注意してください。これは、セクションがテンプレートであり、後で pjsip.conf
内で使用することを示しています。以前に定義されたテンプレートを使用してセクションをインスタンス化するには、セクションヘッダーに (template-name)
を追加してください。
transport セクション
Asterisk で使用する SIP トランクを定義するために、PJSIP にはネットワーク transport
という概念があります。Asterisk Wiki によると、トランスポートセクションは res_pjsip
がトランスポート層でどのように動作するかを設定します。例えば、TCP、UDP、WebSockets などのプロトコルや、TLS/SSL などの暗号化方式の設定オプションをサポートしています。
トランスポートセクションの名前は自由に設定できますが、その意味が分かりやすい名前にすることを推奨します。以下の例では、SIP に UDP を使用し、NAT デバイスを経由することを示すために、[transport-udp-nat]
という名前を付けています。
/etc/asterisk/pjsip.conf
[transport-udp-nat] type=transport ; signifies this is a transport definition protocol=udp ; specifies this uses the UDP transport protocol ; this transport binds to all configured network interfaces, ; replace with the IP address of the desired interface. 0.0.0.0 means all interfaces bind=0.0.0.0 ; ===== NOTE, the following directives are OPTIONAL local_net=10.20.30.0/24 ; specify the networks that this Asterisk server should consider as local/LAN networks. Change this to the local LAN subnet (in CIDR notation) local_net=127.0.0.0/8 ; specify the networks that this Asterisk server should consider as local/LAN networks (this one sets it to the IPv4 loopback network) external_media_address=96.69.199.60 ; specify the external/WAN IP address for RDP media (audio) external_signaling_address=96.69.199.60 ; specify the external/WAN IP address for SIP (signaling)
1 つの IP アドレス/ポート、または IP アドレス/プロトコルの組み合わせにつき、使用できるトランスポートは 1 つだけであることに注意してください。
複数のトランスポートプロトコル(例: TCP と UDP の両方)を設定したい場合は、それぞれのプロトコルを異なる IP アドレスにバインドする必要があります。同様に、同じプロトコルで複数のトランスポートを定義したい場合は、それぞれのトランスポート定義で異なるポートを使用する必要があります。
registration セクション
次に、SIP トランクが使用する登録を定義します。SIP ステーションの登録は、まずテンプレートを使用して定義されることに注意してください(セクション名の末尾に (!)
を付けます)
各テンプレートは、そのテンプレートを使用する各セクションに共通の設定を定義し、各セクション自体には、そのセクション専用のオプションのみを設定します。
/etc/asterisk/pjsip.conf
[sipstation-reg](!) type=registration transport=transport-udp-nat contact_user=15055551234 retry_interval=60 ; ==== ... several other templates and sections will appear here ; ==== including the authentication sections, etc., which are also used by the registration ; ==== .... [siptsation-reg1](sipstation-reg) outbound_auth=sipstation-auth1 server_uri=sip:trunk1.freepbx.com ; trunk1 provided by SIP Station client_uri=sip:my_username@trunk1.freepbx.com [siptsation-reg2](sipstation-reg) outbound_auth=sipstation-auth2 server_uri=sip:trunk2.freepbx.com ; trunk2 provided by SIP Station client_uri=sip:my_username@trunk2.freepbx.com
authentication セクション
ここでは、認証テンプレートと、SIP ステーショントランクで使用する特定の認証セクションを定義します。
/etc/asterisk/pjsip.conf
[sipstation-auth](!) type=auth password=Super*Secret@Password! username=my_username ; ==== ... more templates may appear here [sipstation-auth1](sipstation-auth) realm=trunk1.freepbx.com [sipstation-auth2](sipstation-auth) realm=trunk2.freepbx.com
endpoint セクション
エンドポイントは、電話機やリモートサーバーなどの SIP デバイスの設定プロファイルのようなものです。 ここでは、トランスポートの設定、エンドポイントから発信された通話が処理される Asterisk ダイヤルプランのコンテキスト、およびエンドポイントで使用可能なオーディオコーデックを定義します。 SIP ステーショントランクの場合、次の設定を定義します:
/etc/asterisk/pjsip.conf
[sipstation-endpoint](!) type=endpoint transport=transport-udp-nat context=from-external ; Dialplan context, defined in extensions.conf or related file disallow=all ; disallows all codecs, including default ones, unless explicitly allowed below allow=ulaw ; standard G.711, uncompressed PCM codec. Uses the most bandwidth allow=gsm ; another standard, compressed codec. Uses less bandwidth than ulaw ; other codecs are available, and have different attributes. Some require paid licenses to use. aors=sipstation-aors ; AOR - Address of Record, to be defined later ;direct_media=no ; setting this may not allow audio to pass through NAT direct_media=yes rtp_symmetric=yes ; ==== ... more template definitions [sipstation-endpoint1](sipstation-endpoint) outbound_auth=sipstation-auth1 from_domain=trunk1.freepbx.com [sipstation-endpoint2](sipstation-endpoint) outbound_auth=sipstation-auth2 from_domain=trunk2.freepbx.com
identify セクション
res_pjsip_endpoint_identifier_ip モジュールが、受信パケットがどのエンドポイントからのものかを判断する方法を制御します、SIP ステーショントランクの場合、次の設定を定義します:
/etc/asterisk/pjsip.conf
[sipstation-identify](!) type=identify ; this is the LAN IP address of the NAT router, which calls from the SIP Station ; trunks may appear to come from (because of NAT). match=10.20.30.254/32 [sipstation-id1](sipstation-identify) endpoint=sipstation-endpoint1 match=192.159.66.3 ; IP address of trunk1.freepbx.com [sipstation-id2](sipstation-identify) endpoint=sipstation-endpoint2 match=162.253.134.142 ; IP address of trunk2.freepbx.com
AOR (Address Of Record) セクション
AOR オブジェクト (Address of Record) の主な機能は、Asterisk にエンドポイントの連絡先を知らせることです。 AOR セクションが関連付けられていないと、エンドポイントに接続できません。 SIP ステーショントランクの場合、次の設定を定義します:
/etc/asterisk/pjsip.conf
[sipstation-aors] type=aor contact=sip:trunk1.freepbx.com contact=sip:trunk2.freepbx.com
phone セクション
最後に、Asterisk に登録する SIP 電話のために必要なセクションを定義します。これは、SIP ステーショントランクと似たような複数のセクションがあります。複数のローカル SIP 電話が Asterisk PBX に登録する予定の場合は、これらをテンプレートで拡張してください。 リモート電話 (WAN/インターネットからのもの)も設定できますが、それはこの例の範囲外です。
/etc/asterisk/pjsip.conf
[home-phone] type=endpoint transport=transport-udp-nat context=from-internal ; Dialplan context that gets executed when a user dials from this phone disallow=all allow=ulaw allow=gsm auth=home-phone-auth aors=home-phone [home-phone-auth] type=auth auth_type=userpass password=MyPhonePa$$word0 username=home-phone [home-phone] type=aor max_contacts=1
PJSIP の管理
Asterisk CLI では、res_pjsip
に関するいくつかのコマンドが利用可能で、すべて pjsip
コマンドでプレフィックスが付けられています。Asterisk CLI にアクセスするには、以下のコマンドを asterisk
ユーザーとして入力します:
$ asterisk -rvvv
これは、Asterisk がすでに実行中であることを前提としています(例:systemd サービスユニット経由)Asterisk CLI に入ると、プロンプトが hostname*CLI>
と表示されます。利用可能な PJSIP コマンドのリストを表示するには、help pjsip
と入力します。
PJSIP の登録リストを表示するには、以下のコマンドを入力します:
hostname*CLI> pjsip show registrations
<Registration/ServerURI..............................> <Auth....................> <Status.......> --------------------------------------------------------------------------------------------- siptsation-reg1/sip:trunk1.freepbx.com sipstation-auth1 Registered (exp. 2062s) siptsation-reg2/sip:trunk2.freepbx.com sipstation-auth2 Registered (exp. 2069s) Objects found: 2
PJSIP エンドポイントのリストを表示するには、次のように入力します:
hostname*CLI> pjsip show endpoints
Endpoint: <Endpoint/CID.....................................> <State.....> <Channels.> I/OAuth: <AuthId/UserName...........................................................> Aor: <Aor............................................> <MaxContact> Contact: <Aor/ContactUri..........................> <Hash....> <Status> <RTT(ms)..> Transport: <TransportId........> <Type> <cos> <tos> <BindAddress..................> Identify: <Identify/Endpoint.........................................................> Match: <criteria.........................> Channel: <ChannelId......................................> <State.....> <Time.....> Exten: <DialedExten...........> CLCID: <ConnectedLineCID.......> ---------------------------------------------------------------------------------------------- Endpoint: home-phone Not in use 0 of inf InAuth: home-phone-auth/home-phone Aor: home-phone 1 Contact: home-phone/sip:home-phone@10.20.30.229:506 f91928f561 NonQual nan Transport: transport-udp-nat udp 0 0 0.0.0.0:5060 Endpoint: sipstation-endpoint1 Not in use 0 of inf OutAuth: sipstation-auth1/mw3FSBsPPjQ7 Aor: sipstation-aors 0 Contact: sipstation-aors/sip:trunk1.freepbx.com 256c242e36 NonQual nan Contact: sipstation-aors/sip:trunk2.freepbx.com c07c6c7180 NonQual nan Transport: transport-udp-nat udp 0 0 0.0.0.0:5060 Identify: sipstation-id1/sipstation-endpoint1 Match: 10.20.30.254/32 Match: 192.159.66.3/32 Endpoint: sipstation-endpoint2 Not in use 0 of inf OutAuth: sipstation-auth2/mw3FSBsPPjQ7 Aor: sipstation-aors 0 Contact: sipstation-aors/sip:trunk1.freepbx.com 256c242e36 NonQual nan Contact: sipstation-aors/sip:trunk2.freepbx.com c07c6c7180 NonQual nan Transport: transport-udp-nat udp 0 0 0.0.0.0:5060 Identify: sipstation-id2/sipstation-endpoint2 Match: 10.20.30.254/32 Match: 162.253.134.142/32 Objects found: 3
chan_sip
asterisk サーバーを動かしたら、後は2つのファイルを編集すれば設定できます: sip.conf
と extensions.conf
。asterisk の設定ディレクトリ (/etc/asterisk
) に移動して、sip.conf
を編集して以下を記述してください:
[me1] type=friend username=me1 secret=PASSWORD host=dynamic context=house [me2] type=friend username=me2 secret=PASSWORD host=dynamic context=house
これで house
コンテキストに二人の SIP ユーザー me1
と me2
が作成されます。パスワードは PASSWORD
です。
次にコンテキストを定義します。extensions.conf
を以下のように編集:
[house] exten => 100,1,Dial(SIP/me1) exten => 101,1,Dial(SIP/me2)
これでコンテキスト house
が作成され SIP ユーザー me1
にエクステンション 100 が、SIP ユーザー me2
にエクステンション 101 が割り当てられます。後は実際に動作するか確認するだけです。
保留音
保留音はとても楽しい機能です。簡単に設定することができます。/etc/asterisk/musiconhold.conf
を編集して以下を追加してください:
[default] mode=files directory=mohmp3
後は合法的に入手したお気に入りの MP3 を /var/lib/asterisk/mohmp3
にコピーしてください。
ボイスメール
Asterisk にはボイスメール機能が存在します。設定する方法は多数ありますが、この記事ではシンプルな設定方法だけを紹介します。
voicemail.conf
を作成・編集:
[general] format=gsm|wav49|wav serveremail=asterisk attach=no mailcmd=/usr/sbin/sendmail -t maxmessage=180 maxgreet=60 [default] 100 => 1234,Me,me@mydomain.com
[general]
の設定の内容は こちら を見て下さい。Postfix が正しくセットアップされていれば PBX からメールの通知がユーザーに送信され、attach=yes
と定義されている場合、メールに音声ファイルが添付されます。
次にメールボックスの設定です。フォーマットは:
mailbox => password,user,email
上記の場合、'Me' というユーザー名でメールアドレスが me@mydomain.com、パスワードが 1234 のメールボックス 100 が設定されます。
それから、ボイスメールボックスにメッセージを残す方法と、記録されたメッセージにアクセスする手段を用意する必要があります。
extensions.conf
に戻り、既存のエントリを次のように変更します:
exten => 100,1,Dial(SIP/me1,20) exten => 100,2,Voicemail(100@default)
最初の 'exten' は 'Dial()' で20秒間電話を呼び出します。応答がない場合、default コンテキストの 100 番のボイスメールボックスに転送します。
さらに以下のように設定することで実際にボイスメールにアクセスすることができます:
exten => 600,1,VoiceMailMain,s100@default
600 番を呼び出すと、'VoiceMailMain' アプリケーションは default コンテキストの 100 番に行きます。s
で自動ログインが許可されます。
PSTN に接続
ここまで設定できたら、次は外線と繋ぎましょう。OnSIP などのプロバイダが必要です。asterisk に接続する手順がプロバイダによって用意されているかもしれないため、このセクションは共通のことだけ記述します。
一般的なセットアップ
sip.conf
[general] register => username:password@sip.specific.com [whatever] fromdomain=specific.com host=sip.specific.com insecure=very ; check with provider username=usernameduh secret=passwordduh type=peer
extensions.conf
[outboundwithCID] ; this can be whatever exten => _1NXXNXXXXXX,1,SetCIDNum(15555551234) exten => _1NXXNXXXXXX,2,Dial(SIP/${EXTEN}@whatever) exten => _1NXXNXXXXXX,3,Congestion() exten => _1NXXNXXXXXX,103,Busy() [default] ; This should be set in your sip.conf for incoming calls ;These should to be changed to your actual number ; ie 15555555555 exten => 1NXXNXXXXXX,1,Answer() exten => 1NXXNXXXXXX,2,Playback(ttt-weasels) exten => 1NXXNXXXXXX,3,HangUp()
- 発信(outbound)コンテキストでは、ダイアルした番号を全てサービスプロバイダに送信します。2 の 'whatever' は
sip.conf
の設定と一致させる必要があります。 - もちろん、着信(inbound)番号計画は、あなたが望むように変更することができます。例えば、
Dial(SIP/me1)
とすることで、誰かがあなたの番号に電話をかけると、あなたのコンピュータの SIP 電話に転送されるようにすることができます。それから、ボイスメールなどを追加します。
iax.conf
まず、FWD にログインして、FWD 側の IAX を有効にします。これは extra features の下にあり、作者は有効化するのに少し時間がかかると主張しているのを覚えておいてください。
そして iax.conf
の 'general' セクションを以下のように編集:
register => FWDNUMBER:PASSWORD@iax2.fwdnet.net disallow = all allow = ulaw
そして末尾に以下を追加:
[iaxfwd] type=user context=fromiaxfwd auth=rsa inkeys=freeworlddialup
これにより、FWD からの呼び出しが許可されます。
extensions.conf
'[globals]' の一番上に以下を記述:
FWDNUMBER=MYFWDNUMBER ; your calling number FWDCIDNAME="MyName"; your caller id FWDPASSWORD=MYFWDPASSWORD ; your password FWDRINGS=sip/office ; the phone to ring FWDVMBOX=1000 ; the VM box for this user
次に、これを発信用のコンテキストに追加します:
exten => _393.,1,SetCallerId,${FWDCIDNAME} exten => _393.,2,Dial(IAX2/${FWDNUMBER}:${FWDPASSWORD}@iax2.fwdnet.net/${EXTEN:3},60,r) exten => _393.,3,Congestion
「393」は好きなように変更できます。これは、「転送」番号をダイヤルする前にダイヤルするものです。例えば、「744561」をダイヤルする場合は、「393744561」をダイヤルします。
そして最後に、着信です。
[fromiaxfwd] exten => ${FWDNUMBER},1,Dial(${FWDRINGS},20,r) exten => ${FWDNUMBER},2,Voicemail,u${FWDVMBOX} exten => ${FWDNUMBER},102,Voicemail,b${FWDVMBOX}
内線番号の 55555(有志のテスト回線)、514(会議)にかけてみてください。
音声
音声は /var/lib/asterisk/xx
フォルダに保存します。xx
は言語コードです。例えば英語なら "en" になります。新しい音声を追加したいときはこのフォルダにコピーしてください。以下のフォルダ構造を守って下さい:
/var/lib/asterisk/sounds/xx /var/lib/asterisk/sounds/xx/digits /var/lib/asterisk/sounds/xx/letters /var/lib/asterisk/sounds/xx/phonetic
sip.conf
の language パラメータを編集してください:
[general] ... language=en ...
音声が入手できる場所:
- http://downloads.asterisk.org/pub/telephony/sounds/
- https://packages.debian.org/wheezy/all/asterisk-prompt-xx
- voip-info.org
MeetMe
MeetMe は電話会議をできるようにするアプリケーションです。設定は簡単です。
meetme.conf
を編集:
conf => 1000
extensions.conf
を編集:
exten => 999,1,MeetMe(1000|M)
999 にダイアルすることで会議 1000 に入ることができます。|M
を設定することで誰もいないときは保留音が鳴ります。誰かが会議に参加すると保留音は自動的に消えます。
Asterisk コンソールとソフトフォン
Asterisk を立ち上げてください:
# asterisk -vvvvvvc
詳細な出力がされる Asterisk CLI が立ち上がります。
Asterisk が既に起動している場合、以下のコマンドを実行:
# asterisk -r
SIP クライアントを起動して sip.conf
の情報にあわせて設定してください。Asterisk CLI に戻って以下のように表示されることを確認:
Registered SIP 'me1' at 192.168.0.142 port 5061 expires 60
これで me1
から 101
にダイアルして me2
と会話できるはずです。
トラブルシューティング
404 Not Found エラーが表示される場合は extensions.conf
とダイアルした電話番号を確認してください。