Asterisk+NVR500
AsteriskとNVR500を組み合わせて、ひかり電話で使おうという計画。
目次
大前提の注意!
・このページではAsterisk、ヤマハ NVR500、ひかり電話を組み合わせます
・いずれもメーカー/ベンダー/キャリアに問い合わせてはいけません
・接続する技術的な観点のみで書いています
・契約上の問題、接続承認等は各自で行ってください
・何を言ってるのかわからない人はやってはいけません
条件
Asterisk 20.x.x、libunbound付でコンパイル。ベースはDebian。
Asteriskの設定ファイルのベースは Asterisk_20_サンプル設定ファイル
NVR500 Rev.11.00.43
目論見
そもそもNVR500は、ひかり電話に対応しているので挿すだけで(いやまあ設定は要るけど)、別途VoIPアダプタを使わなくてもアナログ電話が使えますし何ならISDN(サ終だけど)もつながるので家庭やスモールビジネスならそのままで十分なんであえて変な使い方をしないでしょうよという長ったらしい説明はあるのですが、Asteriskユーザとしては面白くないです。
そこで以下のような目論見で接続します。
===光回線===[ONU]---[NVR500]---LAN---[Asterisk] | | | +----[IP Phone] | +--analog---[phone/fax]
そんなんで出来るやろ!と思われるかもしれませんが、実は普通にはできません。
・そもそもAsteriskはNVR500の内線にはなれません
・NVR500の内線としてIP電話機を接続できません
・NVR500のアナログポートはAsteriskの内線(SIPエンドポイント)になれます
いったいどういうことかというと、NVR500は外部のSIPサーバに対してREGISTERする能力はありますが、自身がSIPサーバのように内線をIPで収容するふるまいは持っていないということです。ただヤマハのIP内線機能があるのですが、これはSIPではありません。以前調べた範囲ではMGCPを使ってたと判断できたのですが、今はどうなっているかわかりません。
そこで今回の目論見では呼制御はAsteriskに全て任せます。その上でNVR500のアナログポートをAsteriskの内線として収容します。要するにATAとして使おうという話です。こうすれば物理FAXをAsteriskに収容することもできますし、黒電話機をAsteriskで使うこともできます。
<<******************|NAT|*********ひかり電話 ===光回線===[ONU]---[NVR500]---LAN---[Asterisk] | | | | 内線****>> | +----[IP Phone]内線 | +--analog---[phone/fax]
NVR500はいい加減古いのですが、この使い方ならAsteriskを活用できそうですし、市場では中古で安いのが出回っているのでAsteriskで遊びたい向きには最適です。この先、アナログ搭載の新製品は出なさそうな気もしますし。おそらくですがNVR510も同じ方法で使えると思います。
余談ですが中古でNVR500買った方が新品のATA買うより安いし、DP対応してるしでATA買うよりこっちの方がいいんじゃ?
※もしかしてNVR500をB2BUAみたいに使う手段ってあります?知ってる人がいたら教えてください。
最終的にこういう接続になります。
===光回線===[ONU]---[NVR500]-----[Asterisk Server] LAN2 <**PPPoE**>NAT(masquarade) Internet <**DHCP**>NAT/SIP-NAT ひかり電話
Asteriskが入っているサーバはインターネット接続も、ひかり電話接続もNVR500に対して投げる/受けるかたちとなります。
ひかり電話情報の取得
あらかじめ注意しておきますが、NVR500の設定類はコマンドで行っています。GUIからもできるかもしれませんがGUIの解説はしません。
ISP接続の部分は、この説明では気にしていません。通常はPPPoE(とIPoE)で繋がっているはずなので、WAN(LAN2)インタフェースで以下に示すような設定を行っても影響は与えないはずです。
まずNGNオン、LAN2をDHCPでIPアドレス取得にします。この状態でアナログポートは、ひかり電話の電話機として動くはずです。ようするにひかり電話契約アリの設定と同じはずです。
# ngn type lan2 ntt # ip lan2 address dhcp
一旦、NVR500を再起動してからDHCPの状態を確認します。
# show status dhcpc
以下のような情報が表示されるはずです。
Interface: LAN2 primary IP address: 自分のIPアドレス/30(おそらく通常は/30マスク) DHCP server: DHCPサーバのIPアドレス Remaining lease: 3hours 59min. 56secs. (type) Client ID: (01) クライアントID SIP Server[1]: SIPサーバのIPアドレス Vender Specific: 210 MAC address: MACアドレス Tel number: 03xxxxxxxx(自分の電話番号) SIP domain: SIPドメイン HGW server: [ここは気にする必要なし] Static Route[1]: ネットワークとサブネットマスク gateway ゲートウェイ Common information Default gateway: デフォルトゲートウェイ
これをメモかキャプチャして保存しておいてください。Asteriskの設定で必要になります。
この情報、要するにひかり電話端末に対するプロビジョン情報で機器類(まあAsteriskとか)の再起動毎に取得が必要なのかと思ってましたが、そんなことはなく基本的に変わらないようなので自動化しない方針にします。なのでもし発着信ができないような状態になった場合には再度この手順を行って設定情報を確認してください。
情報が取得できたらNGNを使わないに設定してNVRを再起動します。
# ngn type lan2 off
NVR500の設定
以下の前提でNVR500を設定します。
・NGN機能は使わない
・ヤマハのSIP-NATを使う
・AsteriskサーバのIPアドレスは固定(例示では192.168.200.250とします)
・NVR500はSIP-NATルータとしてだけふるまい呼制御には関わらない(はず)
LAN2(WAN)の設定
# ip lan2 address dhcp # ip lan2 rip send off # ip lan2 rip receive off # ip lan2 nat descriptor 2000 # ngn type lan2 off
LAN2のアドレスはDHCPで取得し、RIPは送受信とも禁止。LAN2はNATを使用し、その番号は2000。LAN2でNGN機能は使用しない。
経路情報の設定
ひかり電話への経路情報を設定します。先ほどメモした情報を元に以下のように設定します。
# ip route ネットワークとサブネットマスク gateway ゲートウェイ
ISP接続がある場合、そちらがデフォルトルートとして使用されるので、ひかり電話のネットワークへの経路を明示(静的)指定する必要があります。
AsteriskはNVR500をデフォルトルート(インターネット接続等にも)として使用しているのならば、電話のトラフィックもNVR500に投げるので、NVR500内部で経路が振り分けられるため、Asteriskサーバ側で経路を意識する必要がなくなります。
NAT(マスカレード設定)
# nat descriptor type 2000 masquerade # nat descriptor address outer 2000 primary # nat descriptor sip 2000 on # nat descriptor masquerade static 2000 1 192.168.200.250 udp 5060 # nat descriptor masquerade static 2000 2 192.168.200.250 udp 10000-11000
ちょっと注意が必要な点として、ヤマハのSIP-NATはポート5060にしか効かない点です(Asteriskで5060のトランスポートを用意する必要がある)。このNATデスクリプタではSIP-NATを使用し、静的NATでSIP(5060)とRTP(UDP10000-11000)はLAN側のAsterisk(192.168.200.250)へ飛ばすようにしています。RTPはAsteriskのrtp.confで指定した範囲を設定します。
SIP設定
SIPは使うに設定します。アナログポート関連の設定は後で。
# sip use on
Asterisk(PJSIP)の設定
トランクの設定ファイルは1ファイルとし、pjsip_trunk_hikari-nvr.confとしています。各セクションは以下のように書きます。
注意点としてAsteriskはlibunbound付でコンパイルするか、ローカルDNSの解決能力を持たせてください。いわゆるntt-ほげドメインの解決が必要になります。ここではlibunbound付として設定しています。
トランスポート
5060用のトランスポートを書きますが他に5060のトランスポートがある場合にはそれを利用してもかまいません。
[hikari-tp] type = transport protocol = udp bind = 0.0.0.0:5060 local_net = 192.168.0.0/16
AOR
AORの指定で、Qualifyはしてはいけません
[hikari-nvr] type = aor contact = sip:取得したSIPサーバのアドレス
IDENTIFY
identifyはIPアドレスだけなのでシンプルです。
[hikari-nvr] type = identify endpoint = hikari-nvr match = 取得したSIPサーバのアドレス
REGISTER
認証情報は不要なので単にREGISTERするだけです。
[hikari-nvr] type = registration contact_user = 自分の電話番号 transport = hikari-tp expiration = 3600 fatal_retry_interval = 60 forbidden_retry_interval = 60 server_uri = sip:取得したSIPドメイン client_uri = sip:自分の電話番号@取得したSIPドメイン
ENDPOINT
endpointではSIP 5060のトランスポートを明示指定します。contextは着信用(incoming)にしてあります。DTMFモードはinbandです。認証情報が無いのでこちらもシンプルです。
[hikari-nvr] type = endpoint transport = hikari-tp context = incoming dtmf_mode = inband language = ja disallow = all allow = ulaw rtp_symmetric = no force_rport = no rewrite_contact = no direct_media = no send_pai = yes tos_audio = 0xb8 from_user = 自分の電話番号 from_domain = 取得したSIPドメイン aors = hikari-nvr
/etc/hosts
Asteriskの設定ファイルではありませんが、名前解決に使用します。libunbound付の場合には/etc/hostsに以下のようなエントリを書きます。
取得したSIPサーバのIPアドレス 取得したSIPドメイン
インターネット接続にNVR500を使用し、NVR500をDNSサーバとして使っている場合(まあこの場合が多いのでしょうが)にはNVR500にDNSエントリとして登録すればlinunboundなしでも使えると思います。
pjsip.conf
まずrportの設定を確認してください。
[system] type = system disable_rport = yes
disable_rport = yes が必要です。
次にACLを設定します。
[acl] type=acl deny=0.0.0.0/0.0.0.0 permit=192.168.0.0/16 permit=取得したネットワークアドレス/取得したサブネットマスク
トランク設定ファイル(ここではpjsip_trunk_hikari-nvr.conf)を別ファイルにした場合には以下のようにincludeします。
#include "pjsip_trunk_hikari-nvr.conf"
気付いている人もいるかもしれませんが、NVR500用の設定はサンプル設定ファイルにこっそり混ぜてあるRTX用のテンプレートと同じものです。そもそもやり方はRTXと同じです。
Asterisk再起動と確認
NVR500とAsteriskを設定したら再起動すればたぶん大丈夫なはずです。以下のようにREGISTERを確認します。
*CLI> pjsip show registrations <Registration/ServerURI..............................> <Auth....................> <Status.......> ========================================================================================== hikari-nvr/sip:ntt-east.ne.jp n/a Registered (exp. 2594s) Objects found: 1
こんな感じでRegisterdになっていればOKです。
何をやったかというと、こういうことで
ひかり電話 =====[ONU]-----[NVR500]-----[Asterisk] NAT/SIP-NAT <--------------------
NVR500のひかり電話機能を使わず、NATとSIP-NATを使ってLAN内のAsteriskをひかり電話のネットワークへ出した(IPv4)わけです。
発着信
サンプル設定ファイル を使用している場合にはグローバル設定を変更するだけで発着信できると思います。
; ; グローバル設定(変数類) ; [globals] ;外線発信時の自局番号 MYNUMBER=自分の電話番号 ;外線発信時のトランク名 MYTRUNK=hikari-nvr ;PPIセット時のドメイン PPIDOMAIN=取得したSIPドメイン ;外線着信させる内線番号(カンマ区切り) RINGPHONES=201,202
CIDとか落ち番がおかしい場合は連絡ください。考えますので。
サンプル設定ファイルを使用していない場合には、サンプル設定ファイルを参考にしてください。着信は自局番号に対する番号で落ちてきます。発信時は自局番号をPPIに設定する必要があります。
謎&お悩み
ちょっと懸念していることがあります。それはヤマハのSIP-UAが「どこ」に居るのかです。
NGNを使うに設定していると、NVR500内のSIP-UA、ボイスのUAが応答するのでアナログポートの電話が鳴ります。要はNGNオンの状態だとNVR500が網に対してREGISTERしています。
ところがNGNをオフに設定、NVR500を再起動した場合に、過去、網に対して行ったREGISTERが生きているようで(網が覚えている)、NGNオフであっても着信でき、電話が鳴るという現象が観測されました。たぶんこういうことです。
[N V R 5 0 0 ] 網 ========[ Router ] INVITE->[SIP-UA(音声)]
NGNをオフに設定しているとREGISTERは投げないものの、依然、SIPのUA(ボイス)はルータ内部に存在しているので、外からINVITEされると応答するということではないかと推察されます。ここでちょっと心配なのが次の状態
[N V R 5 0 0 ] 5060 網 ========[ Router +-->]------>Asterisk INVITE->[A NAT --+ ] [| } [+ SIP-UA(音声)]
今回の設定ではSIP-NATを使って外からの呼制御(5060)は内側のAsteriskに飛ばしています。ではその時、SIP-UAはどこに居るのか?です。NATデスクリプタの後ろに居て、明示的に設定されたデスクリプタ外で存在しているのならば問題はありません。今のところこの動作はうまくいっているようなので(Asteriskに飛ぶ)、目論見通りSIP-NATでAsteriskが使えていますが、SIP-UAは'A'の位置で制御をガメることはないのかが気になっています。時間経過で様子見していますが、今のところは大丈夫そうなのですが、SIPを使いつつ、ひかり電話の機能だけオフにするという設定がない(NGNオフだけども)のでちょっと気になっています。おかしな挙動を発見した場合には教えてください。
おそらくsip use offにすれば完全にオフになるのですが、今回はアナログポートをATA代わりに使いたいのでオフにできないのです。アナログポートを持たないRTX等であればそれでもかまわないのですが、NVR500にはアナログ付いてますから単にルータとして使うのはもったいないじゃないですか。
アナログポートを使う
触ったのが久々すぎて設定がさっぱりわかりません。設定例がありました!YAMAHA RT57i いや~助かります。誰だよこれ書いてくれたの。
さて、そのページで追記してくださった方が書いているように、ヤマハのSIPはOPTIONSに応答しないので、そのまま収容しようとするとPJSIPのQualifyに引っ掛かって着信できなくなります。pjsip_wizardを使用している場合には以下の例のように、NVR500のアナログポートをREGISTERさせるエントリに対してはQualifyさせないようにします。
[phone4](phone-defaults) inbound_auth/username = phone4 inbound_auth/password = c1a0e843d15fb8c9c6067fc099a302d5 aor/qualify_frequency = 0
NVR500の各FXSポート毎に1エンドポイントになるので、それぞれ設定してください。
細かいところはまだ設定を十分にみていませんが、以下のような設定でAsteriskの内線としてアナログでの発着信ができます。なお、サンプル設定ファイルを使っている場合には内線番号はAsterisk側で設定することをお忘れなく。
analog supplementary-service pseudo call-waiting analog extension dial prefix port=1 sip server=20001 sip use on sip server 20001 192.168.200.250:5070 register udp sip:phone4@192.168.200.250 phone4 c1a0e843d15fb8c9c6067fc099a302d5
あたりまえですがユーザ名(エンドポイント名)やパスワード、IPアドレスは自分の環境にあわせて書いてください。
※これだけだと、たぶんナンバーディスプレイとかでトラブるかも。うちにナンバーディスプレイ付のデバッグ用電話機がないもんで・・・
※RT57iと同様にFXOポートはAsteriskから使えないと思います
設定が完了している状態では
*CLI> pjsip show contacts Contact: <Aor/ContactUri..............................> <Hash....> <Status> <RTT(ms)..> ========================================================================================== Contact: hikari-nvr/sip:118.xxx.xxx.xxx 327f198732 NonQual nan Contact: phone1/sip:phone1@192.168.200.240:50803;rinsta 8be6a609b0 Avail 11.260 Contact: phone4/sip:phone4@192.168.200.1:5060 e8f6c69c7f NonQual nan
こんな感じでPJSIPのcontactsに各エンドポイントが表示されるはずです。hikari-nvrがトランク、phone1は普通の電話機(ソフトフォン)、phone4がNVR500のアナログポート1です。
そんなこんなで
この接続方法には前日談があります。たかはしのnote に書いてありますので詳しい話はそちらで。
もともとRTX+Asteriskでやってたのですが、NVR500を使っている人も少なくないのでは?というのとNVR500のアナログ(FXS)ポートが活用できるはずということで試してみたわけです。