「FreePBX:17:トランク:ひかり電話(オフィス)」の版間の差分
(→Trunk) |
(→DID制御) |
||
76行目: | 76行目: | ||
[[FreePBX:10:トランク:ひかり電話(ホーム):Chan PJSIP]ではextensions_custom.confに[from-pstn-custom]を記述する方法が記載されていますが、FreePBX17でこれを行うとfrom-pstnの無限ループに陥りプロセスを強制終了させなければならない事態となりました。<br> | [[FreePBX:10:トランク:ひかり電話(ホーム):Chan PJSIP]ではextensions_custom.confに[from-pstn-custom]を記述する方法が記載されていますが、FreePBX17でこれを行うとfrom-pstnの無限ループに陥りプロセスを強制終了させなければならない事態となりました。<br> | ||
FreePBX Community Forumsの情報から、pjsip設定のコンテキストを標準の「from-pstn」から「from-pstn-toheader」に変更したところ、SIPヘッダーから着信番号が自動的に取得されDID番号として処理されました。<br> | FreePBX Community Forumsの情報から、pjsip設定のコンテキストを標準の「from-pstn」から「from-pstn-toheader」に変更したところ、SIPヘッダーから着信番号が自動的に取得されDID番号として処理されました。<br> | ||
− | あとはインバウンドルートの設定でDIDごとに着信する内線を変えるなどの設定を行うだけです。 | + | あとはインバウンドルートの設定でDIDごとに着信する内線を変えるなどの設定を行うだけです。<br><br> |
+ | |||
+ | <追記><br> | ||
+ | 上記の設定で問題なさそうだったのですが、ある人から電話をかけても「おかけになった電話番号は~」の欠番トーキーが流れるとの指摘がありました。<br> | ||
+ | ログを確認するとDIDに見覚えのない番号である「0272038027」が設定されており、その着信番号でのインバウンドルートは用意していないために欠番トーキーが流れるというものでした。<br> | ||
+ | この見覚えのない番号をgoogle検索してみたところ、OCNモバイルやLINEモバイルなどの通話サービスで利用されている電話番号であることが分かりました。実際に現象が発生する際のSIPログを取ってみると、上記の「from-pstn-toheader」の処理で着信番号として使用されるToフィールドの値は0272038027になっており、本来の着信番号はP-Called-Party-IDフィールドに入っていました。推測ですが、OCNモバイル等からの発信は通話料の原価を下げるために、無条件に0272038027に転送されそこから本来の発信先がコールされる仕組みなのかもしれません。<br><br> | ||
+ | 続いてP-Called-Party-IDフィールドについて調べてみると、一般社団法人情報通信技術委員会の発行する仕様書に「着信の識別にはP-Called-Party-IDヘッダを用いる。P-Called-Party-IDが設定されていない場合は契約番号への着信と認識すべき」といった内容の記述がありました。<br> | ||
+ | また、PanasonicのKX-UTシリーズの説明書内にも着信先情報として P-Called-Party-IDヘッダ→Toヘッダの順でチェックするとの記述がありました<br><br> | ||
+ | |||
+ | 根拠が不十分だと思いますが、NTTのひかり電話を使用する上では「from-pstn-toheader」の処理だけでは不十分なのかもしれません。<br> | ||
+ | 試しに以下のようにextensions_custom.confに追記しコンテキストとして使用したところ、OCNモバイルからの着信を正しく処理することはできました。<br>(但し、こうした設定を記述するのは初めてですので、正しい書き方ではない可能性が十分にあります。ご使用の際は内容を吟味の上自己責任でお願いします。また、誤りを発見いただいた方は添削していただけると助かります) | ||
+ | |||
+ | [from-pstn-toheader-custom] | ||
+ | exten => _.,1,NoOp(Attempting to extract DID from SIP To header) | ||
+ | exten => _.,n,gotoif($["${CHANNEL(channeltype)}"="PJSIP"]?PJSIP) | ||
+ | exten => _.,n,NoOp(Unable to determine SIP channel type) | ||
+ | exten => _.,n,goto(from-pstn,${EXTEN},1)) | ||
+ | exten => _.,n(PJSIP),Set(DIDNO=${CUT(CUT(PJSIP_HEADER(read,P-Called-Party-ID),@,1),:,2)}) | ||
+ | exten => _.,n,gotoif($["${DIDNO}"!=""]?DIDOK) | ||
+ | exten => _.,n,NoOp(P-Called-Party-ID not found) | ||
+ | exten => _.,n,Set(DIDNO=${CUT(CUT(PJSIP_HEADER(read,To),@,1),:,2)}) | ||
+ | exten => _.,n(DIDOK),Goto(from-pstn,${DIDNO},1) | ||
===その他=== | ===その他=== |
2025年4月29日 (火) 19:19時点における最新版
前提
これまでOG810Xaのアナログポートを一般的なPBXに収容する形で使用していた環境で、OGのアナログポートも継続利用しながらFreePBXを活用する必要に迫られました。
ここに記載する内容は、その試行錯誤の結果であり忘備録も兼ねたものです。そのため、結果として動作はしているものの根拠が不明で正しい情報となっていない部分等も少なからず存在すると思います。
その点を考慮の上ご覧いただき、間違っている部分に関してはどんどん修正していただければと思います。
使用したFreePBXのバージョンは17.0.19.25、Asteriskのバージョンは22.2.0となります。
ひかり電話ルータ(OGW)の設定
FreePBX:10:トランク:ひかり電話(オフィス)では、ユーザーGW1をMACアドレス認証で登録する記述があります。
その例を元にいろいろ試してみましたが、当方の環境ではどうやってもレジストに失敗してしまいました。(OG810Xa ファームウェアバージョン2.32)
想像でしかありませんが、OGシリーズは「複数ゲートウェイ集約機能 本商品同士を接続することで、最大32チャネルまでのご利用が可能となります。」と謳っており、MACアドレス認証で登録するGW装置はこの機能で使用されるものなのかもしれません。
一方で、GW装置としてではなく内線IP端末として登録をするために「トップページ > 電話設定 > IP端末/GW収容設定」を確認すると、内線IP端末テーブルには内線番号や名称、発信者番号を登録する欄はあるものの、HGWのように認証用のアカウントやMACアドレスを登録するような欄がありません。
後述しますが、FreePBXからIP端末としてレジストするために必要な情報は内線番号だけであり、拘りがなければ特に設定を変更する必要はありません。
FreePBXの設定
Trunk
以下は、指定の設定値以外は、デフォルト値でかまいません。
FreePBXが動作する端末でのDNSサーバーがOGWとなっているのであれば、OGWはntt.setupのホスト名で参照可能です。
ホスト名で参照できない場合は、直接IPアドレスで指定してください。
- 認証について
少なくとも当方の環境では認証の設定は一切することなく内線IP端末としてレジストできています。セキュリティ的にこれでいいのか?との疑問は残りますが、pjsip設定でユーザー名などを設定せずにクライアントURIなどをきちんと設定すれば、OGWの「IP端末/GW収容設定」の画面の内線IP端末テーブルにFreePBX端末のIPアドレスが表示されます
- メニューバー -> 接続 -> トランク
+トランクを追加 -> +SIP(chan_pjsip)トランクを追加 で新しいトランクを設定します。
General タブ
- トランク名 : ご自身が判別しやすい名前を付けます
- アウトバウンドCID : OGWに設定されている契約番号を設定します
- 最大チャンネル数 : ひかり電話オフィスタイプで契約しているチャンネル数以下の値に設定します
- Asteriskトランクダイヤルオプション : 詳細は後述しますが発信番号制御のために、「オーバーライド」を選択し「TB(custom-sip-header^s^1)」と設定します
pjsip設定タブの中には3つのタブがあります。
- General タブ
- ユーザー名 : 空欄
- Secret : 空欄
- SIP Server : <OGWの端末名もしくはIPアドレス>
- コンテキスト : 後述しますがDID制御のために「from-pstn」を「from-pstn-toheader」に変更します
- 高度な設定 タブ
- DTMF Mode : バンド内
- From Domain : <OGWの端末名もしくはIPアドレス> (例) 192.168.0.1
- From User : <OGWで有効な内線IP端末の内線番号> (例) 10
- クライアントURI : sip:<OGWで有効な内線IP端末の内線番号>@<OGWの端末名もしくはIPアドレス> (例) sip:10@192.168.0.1
- サーバーURI : sip:<OGWの端末名もしくはIPアドレス> (例) sip:192.168.0.1
- AORコンタクト : sip:<OGWの端末名もしくはIPアドレス> (例) sip:192.168.0.1
- Match (Permit) : <OGWの端末名もしくはIPアドレス> (例) 192.168.0.1
- Support Path : OG420/820でレジストできない場合はこれを「はい」にすると解決するとの情報があります(日本Asteriskユーザ会)
- コーデック タブ
- ulaw : ここにだけチェックを入れる、他のコーデックのチェックは外す
発信番号制御
ひかり電話オフィスタイプですので、複数電話番号・複数チャンネルの契約となっている場合が多いと思います。なにも設定しない場合、OGWの内線IP端末テーブルで指定された発信者電話番号が使用されます。発信番号制御を行うには、アウトバウンドルートでルートCIDを設定し、その番号をダイヤル時にSIPカスタムヘッダーとしてOGWに送ることで実現できます。
Asteriskトランクダイヤルオプションで指定した「B(custom-sip-header^s^1)」の部分がその処理の呼び出し部分であり、その処理の内容はextensions_custom.confに記述します。
下の例はNTT西日本の場合です。NTT東日本の場合は「@ntt-west.ne.jp」の部分を「@ntt-east.ne.jp」に置き換えてください
- メニューバー -> アドミン -> Config Edit
Asterisk Custom Configuration Files -> extensions_custom.conf
[custom-sip-header] exten => s,1,Set(HASH(__SIPHEADERS,P-Preferred-Identity)=sip:${CALLERID(number)}@ntt-west.ne.jp) exten => s,n,Return
- メニューバー -> 接続 -> アウトバウンドルート
+アウトバウンドルートを追加
- 経路設定 タブ
- 経路名 : ご自身が判別しやすい名前を付けます
- ルートCID : 発信番号として使用したい電話番号を<#######>の形式で設定します。OGWで契約番号もしくは追加番号として認識されている番号である必要があります
- 一致したルートのトランクシーケンス : chan_pjsipで作成したトランク名を指定します
- Dial Patterns タブ
- 一致パターン : 0N0XXXXXXXX(携帯電話等)、0ZZXXXXXXX(市外通話1)、0ZZXXXXXXXX(市外通話2)、1XX(緊急電話等)、XXXXXXX(市内通話)など、必要に応じて登録します
- 発信者ID : 指定した電話番号で発信したい内線の番号を指定します。例えば「20X」と指定すると200~209の内線からの発信が対象となります。
これを電話番号の数だけ作成します。複数のアウトバウンドルートに条件が一致する場合は上にあるものが優先的に使用されますので必要に応じて並び替えます
DID制御
OGWから内線IP端末にはDID番号が渡されないため、SIPヘッダーのToフィールドから取得するという処理が必要になります
[[FreePBX:10:トランク:ひかり電話(ホーム):Chan PJSIP]ではextensions_custom.confに[from-pstn-custom]を記述する方法が記載されていますが、FreePBX17でこれを行うとfrom-pstnの無限ループに陥りプロセスを強制終了させなければならない事態となりました。
FreePBX Community Forumsの情報から、pjsip設定のコンテキストを標準の「from-pstn」から「from-pstn-toheader」に変更したところ、SIPヘッダーから着信番号が自動的に取得されDID番号として処理されました。
あとはインバウンドルートの設定でDIDごとに着信する内線を変えるなどの設定を行うだけです。
<追記>
上記の設定で問題なさそうだったのですが、ある人から電話をかけても「おかけになった電話番号は~」の欠番トーキーが流れるとの指摘がありました。
ログを確認するとDIDに見覚えのない番号である「0272038027」が設定されており、その着信番号でのインバウンドルートは用意していないために欠番トーキーが流れるというものでした。
この見覚えのない番号をgoogle検索してみたところ、OCNモバイルやLINEモバイルなどの通話サービスで利用されている電話番号であることが分かりました。実際に現象が発生する際のSIPログを取ってみると、上記の「from-pstn-toheader」の処理で着信番号として使用されるToフィールドの値は0272038027になっており、本来の着信番号はP-Called-Party-IDフィールドに入っていました。推測ですが、OCNモバイル等からの発信は通話料の原価を下げるために、無条件に0272038027に転送されそこから本来の発信先がコールされる仕組みなのかもしれません。
続いてP-Called-Party-IDフィールドについて調べてみると、一般社団法人情報通信技術委員会の発行する仕様書に「着信の識別にはP-Called-Party-IDヘッダを用いる。P-Called-Party-IDが設定されていない場合は契約番号への着信と認識すべき」といった内容の記述がありました。
また、PanasonicのKX-UTシリーズの説明書内にも着信先情報として P-Called-Party-IDヘッダ→Toヘッダの順でチェックするとの記述がありました
根拠が不十分だと思いますが、NTTのひかり電話を使用する上では「from-pstn-toheader」の処理だけでは不十分なのかもしれません。
試しに以下のようにextensions_custom.confに追記しコンテキストとして使用したところ、OCNモバイルからの着信を正しく処理することはできました。
(但し、こうした設定を記述するのは初めてですので、正しい書き方ではない可能性が十分にあります。ご使用の際は内容を吟味の上自己責任でお願いします。また、誤りを発見いただいた方は添削していただけると助かります)
[from-pstn-toheader-custom] exten => _.,1,NoOp(Attempting to extract DID from SIP To header) exten => _.,n,gotoif($["${CHANNEL(channeltype)}"="PJSIP"]?PJSIP) exten => _.,n,NoOp(Unable to determine SIP channel type) exten => _.,n,goto(from-pstn,${EXTEN},1)) exten => _.,n(PJSIP),Set(DIDNO=${CUT(CUT(PJSIP_HEADER(read,P-Called-Party-ID),@,1),:,2)}) exten => _.,n,gotoif($["${DIDNO}"!=""]?DIDOK) exten => _.,n,NoOp(P-Called-Party-ID not found) exten => _.,n,Set(DIDNO=${CUT(CUT(PJSIP_HEADER(read,To),@,1),:,2)}) exten => _.,n(DIDOK),Goto(from-pstn,${DIDNO},1)
その他
- メニューバー -> 設定 -> 高度な設定
- Launch local AGIs through FastAGI Server : FastAGIサーバーを動かしていない場合、これを「いいえ」にしないとインバウンドルートの宛先として着信グループを指定した場合にエラーが発生し、発信元に「回線が込み合っています」のアナウンスが返されてしまいます
- メニューバー -> 設定 -> Asterisk SIP 設定
- NAT設定
- ローカルネットワーク : OGWがFreePBX端末と別セグメントにある場合など、ローカルネットワーク欄にOGWのあるセグメントを登録しておかないと、FreePBXがOGWにレジストする際に外部IPアドレスを自分のアドレスとして通知するようです
- NAT設定