2017-09-27

Asterisk のおさらい

Asterisk、Grandstream Wave、zoiper がページビューが多いので、今回 Asterisk のおさらいの意味で、とくに重要な sip.conf と extensions.conf の実例と、記述の仕方・意味などを書いてみたいと思います。


Asterisk は最低限、これら sip.conf と extensions.conf の定義が必要です。

このほかにも、留守録の設定や関連プログラム、これをメール通知するプログラムと設定、FAX送受信のプログラムと設定などを必要に応じて追加していきますが、まずは上の二つが最低限ないと動作させられません。


実例では、留守録とFAX送受信を含んでいますが、それらを除けば sip.conf と extensions.conf だけで動作します。


これらの定義の中に、コメントとして記述の仕方や意味などを記載していますので、参考にしてください。


まずは、外線(ひかり電話や 050 IP 電話)のレジスト(Asteriskサーバーへの登録)をします。

しかる後に、外線を経由した発着信や内線の設定・内線の呼出し方などを定義していきますが、実例では外線発信はできない設定にしてあります。

着信時の振る舞いなどは参考になると思います。

テキストファイルにコピペして必要箇所を修正したものを、オリジナルの sip.conf および extensions.conf と置き換えて、Asterisk を再起動または、CLI で reload すれば反映されます。




この設定はブラステルを使うからできる設定を含んでいます。

ブラステルは複数デバイスでレジストできるので、スマホにも設定しています。

ですから、Asterisk からレジストし、なおかつ複数のスマホからレジストし、家電話用の ATA (HT701) からもレジストできるのです。


こういう「芸当」はブラステルしかできません。


ほかの ITSP の場合は、最後にレジストしたデバイスだけが有効です。

ですから、着信時に Asterisk でリングバックトーンを流しながらスマホで電話をとる(受ける)ことができてしまうのです。


こういうことが可能なので、Asterisk も使い勝手を向上させるのに役立っているわけですね。



sip.conf

; 各行の1桁目が ";" で始まる行はコメント行。また、行の途中にある場合はそこから後ろはコメントとみなされる
; 行がすべて空行は、その行がないものとして扱われる
; 行はテキストエディターの CRLF(復帰改行) で終わる
; コンテキストは全般を意味する "[general]" とそれ以外の任意名の "[コンテキスト名]" からなる
; 最初に、全般の定義を行い、そのあと個別のコンテキストを定義する
;

[general]
allowguest=no                ; ゲストアクセス拒否
alwaysauthreject=yes         ; 攻撃者が有効なSIPユーザー名をスキャンすることを防止。
;                            ; また、別途コンテキスト定義でもわかりにくい名前を付けるとより強固
maxexpirey=3600              ; 着信レジストの最大有効時間 3600 秒
defaultexpirey=3600          ; 発着信レジストのデフォルトの有効時間 3600秒
bindport=5062                ; デフォルトのポート番号 (5060ではなく、5062にしている)
language=ja                  ; 言語 (日本語)

localnet=192.168.aaa.0/255.255.255.0 ; Asterisk にアクセスできるローカルアドレスとネットマスク

; 使用するコーデックの定義。[general] に記述した場合は、内線などのコンテキストに記述しないとき有効
; 各コンテキスト内に記述の場合は、それが各コンテキスト内で有効
disallow=all                 ; コーデックをすべて無効化。以下に有効にするコーデックを順に定義
allow=ulaw                   ; G.711μ -- ひかり電話は必須
allow=ilbc                   ; iLBC ---- 圧縮効率と音声品質のバランスがいい
allow=opus                   ; Opus ---- 今後の主流になりそうな高品質
allow=gsm                    ; GSM  ---- 昔のアナログ携帯のコーデック(互換性のため定義)
allow=alaw                   ; G.711a -- 互換性のため定義

videosupport=no              ; Videoサポートしない

sendrpid=yes                 ; 以下を参照 (転送時: 大もとの発番を有効にするか、転送GWの番号を有効にするか)
;
; sendrpid (発信電番) は、次のように振る舞うようだ
;   yes : Remote-Party-ID を使用 (Remote="発信元電番"を使用の意味のようだ)
;         なりすまし防止の対象にならないみたい
;   pai : P-Asserted-Identify ("主張された電番" CALLERID(num) を使用の意味)
;         なりすまし防止で強制的に発信電番 (転送GWの番号) に置き換えられる
;;;;;;;;;;;;;;;
;

; register は、[general] 内に記述する。
; "register => ユーザ名:パスワード:ユーザ名@サーバーのアドレス名/番号" のようにコロンで区切る。
; このときの、スラッシュの後ろの番号は、extensions.conf のエクステンション番号にあたる。
; "/番号" は省略できるが、最初の省略された register のエクステンション番号は "s" になる。
;
;**** ひかり電話のレジスト
register => 3:パスワード:ユーザID@abcdefgh-hikari-denwa/200 ; "abcdefgh" は任意の英大小文字/数字からなる文字列
;                                                         ; これはSIPユーザー名をわかりにくくするため
;                                                         ; 先頭の"3"はVDSLルーターでの内線番号
;                                                         ; ユーザIDはVDSLルーターでの内線設定時の「ユーザID」
;                                                         ; パスワードはVDSLルーターでの内線設定時の「パスワード」

;**** ブラステル1 (家電話)のレジスト
register => ユーザID@softphone.spc.brastel.ne.jp:パスワード:ユーザID@softphone.spc.brastel.ne.jp/2910
;           先頭の "ユーザID@softphone.spc.brastel.ne.jp" がブラステルの「ユーザ名」で、
;           ユーザIDは、ブラステルカードのアクセスコード欄の「USER ID」

;**** ブラステル2 (GW) のレジスト
register => ユーザID@softphone.spc.brastel.ne.jp:パスワード:ユーザID@softphone.spc.brastel.ne.jp/2920

;**** FUSION のレジスト
register => ユーザ名:パスワード:ユーザ名@smart.0038.net
;           Fusionの場合、「ユーザ名」は電番の 050xxxxyyyy の"xxxxyyyy"
;           "/番号" は記述されていないが、FAX送受信で使用のために別途定義したコンテキスト名と対応付けられるから。
;           対応付けは iax.conf ファイルの "iaxmodem" (ソフトウェアモデム) のコンテキストにて行う。
;
;**** 各電番のコンテキスト定義 (どういう性質の電番なのかを定義する)
;
[abcdefgh-hikari-denwa]    ;** ひかり電話のコンテキスト
type=friend                ; user:着信専用、peer:発信専用、friend:発着信用
secret=パスワード            ; なるべく長い英数大小文字/数字、特殊文字からなるパスワードが好ましい
directmedia=no             ; Asteriskが音声ストリームを中継のときは"no"、直接やりとりは"yes"
username=ユーザ名           ; VDSLルーターの内線設定時の「ユーザID」
fromuser=3                 ; VDSLルーターのひかり電話の内線番号
host=192.168.aaa.bbb       ; VDSLルーターのアドレス 
fromdomain=192.168.aaa.bbb ; VDSLルーターのドメインアドレス
context=ijklmnop           ; extensions.conf で対応付けられるコンテキスト名。任意文字列(英数大小文字/数字)
;                          ; extensions.conf ではこのコンテキスト名のセクションでひかり電話の振る舞いを定義する             
insecure=port,invite       ; 接続時どのポートからでもOK (port)。また、着信時の認証不要 (invite)
dtmfmode=rfc2833           ; DTMF の種類 (通常はRFC2833)
;

[abcdefgh-brastel1]
;** ブラステル1 のコンテキスト
type=friend
secret=パスワード
username=ユーザ名 (USER ID)
fromuser=(同上)
host=softphone.spc.brastel.ne.jp
fromdomain=softphone.spc.brastel.ne.jp
context=ijklmnop
insecure=port,invite
dtmfmode=rfc2833
directmedia=no
nat=force_rport,comedia    ; NAT越えが必要なとき
;

[abcdefgh-brastel2]
;** ブラステル2 のコンテキスト
type=friend
secret=パスワード
username=ユーザ名 (USER ID)
fromuser=(同上)
host=softphone.spc.brastel.ne.jp
fromdomain=softphone.spc.brastel.ne.jp
context=ijklmnop
insecure=port,invite
dtmfmode=rfc2833
directmedia=no
nat=force_rport,comedia
;

[qrstuvwx-fusion]
; ** FUSIONのコンテキスト
type=friend
username=ユーザ名
fromuser=ユーザ名
secret=パスワード
directmedia=no
allow=slin
context=ijklmnop
dtmfmode=rfc2833
insecure=port,invite
host=smart.0038.net
fromdomain=smart.0038.net
faxdetect=t38 ; Fusion は T.38 に対応している (ブラステルは対応していないので "t38pt_udptl=no" で行を置き換える)
; cng : Redirects the call to the fax extension in the dialplan if a CNG tone is detected.
; t38 : Redirects the call to the fax extension in the dialplan if a T.38 reinvite is received.
; yes : Enables both CNG and T.38 fax detection.
; no  : Disables fax detection. This is the default.
;

;
;#*#*# 内線2010--2020
[1234abcd-2010]
; 内線2010
type=friend
cid_number=2010      ; ソフトフォンアプリで電番表示される番号
;                                 ; これは、コンテキストが "1234abcd-2010" なので、
;                                 ; この行の定義がないと "1234abcd-2010" と表示されるため
secret=パスワード
context=ijklmnop
directmedia=no
host=dynamic
dtmfmode=rfc2833
qualify=5000             ; ミリ秒。この時間を越えるとレジストが外れる (自動再レジストされる)
;

[1234abcd-2020]
; 内線2020
type=friend
cid_number=2020
secret=パスワード
context=ijklmnop
directmedia=no
host=dynamic
dtmfmode=rfc2833
;
;:::: end of sip.conf ::::


extensions.conf

; 記述の仕方は、sip.conf と類似 (各行ごとに記述、コメントの扱いは同じ)
; [general] で全般的なことを定義
; [コンテキスト名] でそのコンテキスト内の記述をする

[general]
;
writeprotect=no     ; CLI (Asteriskのコマンドライン・インタフェース) での変更を不許可
priorityjumping=no  ; n+101 ジャンプ機能は無効 (n+101 ジャンプはAsteriskの古いバージョンの名残り)
;
;【ダイヤルプラン】
;
;    1. ひかり電話の外線着信
;
;       事前に着信時の振る舞いを設定しておく。着信は設定に従う。
;
;       この設定に従って、ブラステル1 への転送か、または留守録にする。
;       設定は内線 400 で、次のように設定する
;            "1" 応答          : 転送電話設定 (ブラステル1 への転送)
;            "7" 応答          : 留守録音設定
;
;    2. 内線 99 呼び出しは全員の内線呼び出し
;
;    3. 内線から内線への相互呼び出しができる
;
;    4. 内線から外線発信はできない (外線発信は家電話で行う。Asteriskサーバーのセキュリティ対策の一つ)
;      (国内固定、国内携帯、フリーダイヤル、サービス番号(110, 119, 117, 104 など)、海外発信はできない)
;
;    5. 内線から 100 を呼び出すと、音声追っかけ再生テストができる
;      (話した内容をオウム返しに返してくれるので、音声品質や遅延を聞きながら確認できる)
;
;    6. FAX送受信は Fusion で行う
;
;
; エクステンションの記述は "exten => エクステンション番号,順序番号,アプリケーション" のように記述する
; 例: exten => 1111,1,Dial(SIP/1234,20) ; 順序番号は 1,2,3... と記述するか、"n" で 2以降を表すことができる
;      この例では、1111がダイヤルされると、Dialアプリケーションは1234を20秒間呼出すことを意味している
;     exten => 1234,1,Dial(SIP/${EXTEN},25) ; ${EXTEN} はエクステンション番号を示すので 1234 と記述したものと同じ
;      つまり、1234がダイヤルされると1234を25秒間呼出す
;
;
; パターンマッチングの意味
; _1[1-3] は    11,12,13
;         または _1[123]   と同じ
; _1X     は    10 〜 19   と同じ
; _1Z     は    11 〜 19   と同じ
; _1N     は    12 〜 19   と同じ
; _1.     は    1XXX...XXX (X:0〜9,任意の桁数) と同じ
;                

[globals]

; グローバル変数 (コンテキスト間で有効) の定義 (なくてもいい。必要箇所で直接記述してもいい)
MYNUMBER=0A12345678               ; ひかり電話番号を記述
BRASTELNUMBER1=050B1234567        ; 家電話のブラステルの番号を記述 
BRASTELNUMBER2=050C1234567        ; 電話転送時のゲートウェイとして使用
FUSIONNUMBER=050D1234567          ; FAXに使うFusionの番号を記述
;

[ijklmnop]                        ; コンテキスト名。sip.congfの各コンテキストの"context=ijklmnop"に定義の名前

;                                 ; [default] に代えてコンテキスト名は少し複雑な名前を用いる。
;                                 ; [default] は既知のため、攻撃者が類推しにくい名前にするため
;

;#*#*# Brastel1〜2 が外線着信したら呼出し音を 50秒間流し、無応答ならば留守録にする。
exten => _29[1-2]0,1,Goto(2990,1) ; パターンマッチングで 2910 と 2920 のいずれかがダイヤルされたときの記述
;                                 ; 本例では、ブラステル1 または、ブラステル2 がダイヤルされたときにここに飛んでくる
;                                 ; (sip.conf の register を参照)
;                                 ; 例では 2910 または、2920 はエクステンション番号 2990 の 1番目に飛ぶ
;
exten => 2990,1,Ringing()         ; リングバックトーン (呼出し音) を発信者に流す
exten => 2990,n,Wait(50)          ; 50秒間待つ (電話を取るのを待つ。この間は呼出し音は鳴り続ける)
exten => 2990,n,Goto(200,rec-voice) ; 50秒経ったら留守録に移る (エクステンション番号 200 の rec-voice ラベルに飛ぶ)
;
;
;#*#*# 2010 と 2020 の呼び出し定義 (内線相互呼び出し)
;
exten => _20[1-2]0,1,Dial(SIP/1234abcd-${EXTEN},30) ; "1234abcd-${EXTEN}" は、sip.conf でのコンテキスト名
exten => _20[1-2]0,n,Hangup()     ; オンフック処理 (通話の終了)
;
;
;#*#*# ボイスメールの再生 (留守電Box: 500番)
;
exten => 20,1,Goto(vm1,1)
exten => vm1,1,Answer()
exten => vm1,n,VoiceMailMain(500,s)               ; sオプションは、再生時パスワード要求なし           
exten => vm1,n,Hangup()                           ; 500番(共通ボックス) のボイスメール再生
;                                                 
;
;#*#*# 内線 99 呼出しは、30秒間全員 (2010 と 2020) を呼び出し
;
exten => 99,1,Dial(SIP/1234abcd-2010&SIP/1234abcd-2020,30)
exten => 99,n,Hangup()
;
;
;#*#*# 音声再生テスト : コールすると話した内容が、追っかけ再生される
;
exten => 100,1,Answer()
exten => 100,n,Wait(1)
exten => 100,n,Playback(demo-echotest) ; "demo-echotest" は Asterisk標準装備の音声ファイル
;「エコーテストモードを開始しました。このモードでは喋った内容がそのままオウム返しされますので実際の
;  音声品質と遅延を耳で確認することができます。受話器を置くかシャープで終了します」
exten => 100,n,Playback(beep)          ; ビープ音
exten => 100,n,Echo                    ; 喋った内容をエコーバック
exten => 100,n,Playback(hello-world)   ;「ありがとうございます」
exten => 100,n,Hangup()
;
;
;#*#*# ひかり電話への着信
;
;   Asteriskプロセスの環境変数 ENV(TRSW)に設定されている内容によって着信時の扱いが決まる。
;   "TRSW" は任意の環境変数名
;
;   転送モード ("1") または、留守録モード ("7") を、環境変数を外部変数扱いして設定
;   Asteriskは、呼を処理するたびに grobal変数は初期設定値に戻るため、
;   呼と呼の間で有効な外部変数扱いとして使用
;
exten => 200,1,NoOp(${ENV(TRSW)})       ; 現在の環境変数の値をCLIに表示 (デバッグのため)
exten => 200,n,GotoIf($[ENV(TRSW) =1]?300,1)   ; ブラステル1 への転送か -> 300
;
;**** 留守録モードのとき
exten => 200,n,Ringing()                ; 留守録時に呼出し音を4秒間鳴らしてから録音に移る
exten => 200,n,Wait(4)
;
exten => 200,n(rec-voice),Answer()      ; 着信に応答 (rec-voice ラベルはどこかから飛んでくるときのラベル)
;                                       ; "exten => 1234,n,Goto(200,rec-voice)" のように使われる 
exten => 200,n,Wait(1)                  ; 無音1秒でコーデック安定を待つ
exten => 200,n,Playback(vm-nobodyavail) ;  「ただいま電話にでることができません」
exten => 200,n,Wait(1)                  ; 1秒待つ
exten => 200,n,Voicemail(500)           ; Voicemailには"vm-intro&beep"が含まれている
exten => 200,n,Hangup()                 ;  「発信音の後にメッセージをお話しください。
;                                       ;    終わりましたら電話を切るかシャープを押してください。ピーッ!」
;**** 転送モードのとき
; ブラステル2 (GW) 経由でブラステル1 に転送
;
exten => 300,1,NoOp(${CALLERID(num)})   ; デバッグ用に呼び出し元番号をCLIに表示
exten => 300,n,NoOp(${CALLERID(name)})  ; デバッグ用に呼び出し元名前をCLIに表示
exten => 300,n,Dial(SIP/${BRASTELNUMBER1}@abcdefgh-brastel2,60,tT)
exten => 300,n,Goto(200,rec-voice)      ; 呼び出し無応答は留守録に移る
;
; tT オプションは rtp (音声ストリーム) をサーバー経由とする設定
; rtp.conf の [general] の中の rtpstart=10000 | rtpend=10009 と設定済み
;
;
;**** ひかり電話着信時の振る舞い設定 (内線で 400 を呼出して設定する)
;
exten => 400,1,Playback(silence/1)                     ; 無音1秒でコーデック安定を待つ
exten => 400,n,Set(TIMEOUT(digit)=5)
exten => 400,n,Set(TIMEOUT(response)=10)
exten => 400,n(retry-exten),Playback(tennsou-rusuden-no-settei) ;「転送は1を、留守電は7を押してください」
;                                                      ; この音声ファイルは作成したもの
exten => 400,n,Playback(beep)                          ; ビープ音「ピーッ!」
exten => 400,n,Set(TRSWVAR="")                         ; TRSWVARは ローカル変数
exten => 400,n,Read(TRSWVAR,,1)                        ; 1桁の番号が入力されたら受け取る
exten => 400,n,GotoIf($[${TRSWVAR}=7]?${EXTEN},reset-exten) ; "7" -> reset-exten
exten => 400,n,GotoIf($[${TRSWVAR}=1]?${EXTEN},set-exten)   ; "1" -> set-exten
exten => 400,n,Playback(bangou-mukou)                  ;「番号が無効です」この音声ファイルは作成したもの
exten => 400,n,Goto(retry-exten)
;
exten => 400,n(reset-exten),NoOp(${TRSWVAR})
exten => 400,n,Set(ENV(TRSW)=7)
exten => 400,n,Playback(rusuden-ni-settei)             ;「留守番電話の録音に設定しました」この音声ファイルは作成したもの
exten => 400,n,Goto(exit-exten)
;
exten => 400,n(set-exten),NoOp(${TRSWVAR})
exten => 400,n,Set(ENV(TRSW)=1)
exten => 400,n,Playback(tennsou-ni-settei)             ;「転送に設定しました」この音声ファイルは作成したもの
;
exten => 400,n(exit-exten),Wait(1)
exten => 400,n,Playback(arigatou)                      ;「ご利用ありがとうございました」この音声ファイルは作成したもの
exten => 400,n,NoOp(${ENV(TRSW)})                      ; デバッグ用に環境変数(TRSW)の結果内容をCLIに表示
exten => 400,n,Hangup()
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;**** FAX受信 : Fusion
;[fax-in]
;
exten => D1234567,1,Ringing() ; "D1234567" はFusion番号の 050D1234567 の 050 を除いた番号
exten => D1234567,n,Answer()
exten => D1234567,n,Wait(5)
exten => D1234567,n,Dial(IAX2/iaxmodem)
;
; "exten => D1234567,n,Hangup()" は、受信完了時に自動的に切れるので不要

;
;**** FAX発信 : Fusion
[fax-out] ; iax.conf で定義したFAXモデムのコンテキスト名
;
; 発信先は、0で始まり、2桁目と3桁目は 1〜9、以降の数字は 0〜9 の任意桁の数字に一致したものが有効
; 00発信や010発信はできない(国際FAXなど)
; 011000000... 〜 099999999... が発信先として有効
;
exten => _0ZZX.,1,Set(CALLERID(num)=${FUSIONNUMBER})
exten => _0ZZX.,n,Set(CALLERID(name)=${FUSIONNUMBER})
exten => _0ZZX.,n,Dial(SIP/${EXTEN}@qrstuvwx-fusion)
; "exten => _0ZZX.,n,Hangup()" は送信終了時に自動的に切れるので不要
;
;
[default] ; デフォルトのコンテキストは中身を空行にしておく (何も定義しない)
;
;::: end of extensions ::::


以前に掲載したものとは少し変更されています。

現時点で、ワタシが実際に使っている形に近いものになっています。

気がついたり、不具合だったり、より便利になるためだったりの理由で適宜修正したりしていますので、必ずしもこの状態をずーっと維持しているわけではありません。



以前のものは、着信を受けるソフトフォンがすべてデ・アクティベート状態だった際に、「おかけになった番号は使われていません」とメッセージされているのを回避するような設定をしていました。

今回、もっと単純に、Asterisk に着信できるはずですから、一定時間リングバックして、その後に留守録するようにしました。

こうすれば、すべてのソフトフォンがデ・アクティベート状態でもヘンなメッセージも流れたりしません。

また、こちらが電話をとるか、留守録に入らない限り、発信側には通話料金は発生しません(発信側がリングバックの途中で切断時など)。

停電か、ネット切断状態、ルーター/サーバー異常以外は大丈夫ですから、こういう設定に変えました。



ところで、sms ですが、米国では普通の固定電話番号でも sms できます。

LINE や Dropbox 二段階認証は sms 認証のために米国の電番で使えていましたが、いまは使えなくなっています。

日本では、固定電話番号では一部の限られた範囲のサービスでしか使えません。

IP 電話からも sms はできる仕様が定められていて、Asterisk にも SMS アプリケーションが用意されています。

こういうところは、NTTやキャリアはもっと柔軟に対応して欲しいものです。




0 件のコメント: