asterisk+NVR700W/NVR500(TELポート)+Zoiper+Browser-Phoneを導入して、内線通話までできるようにする。
前提条件
当サイトでの構築環境。
ネットワーク構成
実家および自宅ともにひかり電話契約あり。
(実家側)asterisk—NVR500—ひかり電話網—asterisk—NVR700W(自宅側)
ひかり電話網への接続は、
自宅では外部VLANをVMにアタッチして、Asterisk直結パターン
実家ではNVR500を通してSIP-NATでAsteriskを接続するパターン
とする。
インターネットへの接続は、それぞれ別経路で出ていく構成になっている。
ひかり電話情報は事前に取得しておく
ひかり電話網の情報は、NVR等の機器を接続してあらかじめ入手しているものとする。
ちなみに、NVRでは以下のような項目とその値が表示される。(値は全部削除している)
# show status dhcpc
Interface: LAN2 primary
IP address:
DHCP server:
Remaining lease:
(type) Client ID:
SIP Server[1]:
Vender Specific:
MAC address:
Tel number:
SIP domain:
HGW server:
Static Route[1]:
Static Route[2]:
Static Route[3]:
Common information
Default gateway:
Asteriskの構築
fedoraの設定
OSのインストール・設定・アップデート
自宅および実家のPVE環境にasterisk用のVMを作成しfedora 44をインストールした。fedoraになれていない人はubuntuなどのdebian系の方がいいのかもしれない。(FreePBX(asteriskが組み込まれている)はdebian系を推奨。なお、FreePBXも後ほど導入してみる)
fedoraのインストール後、アップデートおよび環境を自分の好みに整えておく。
SELinux
SELinuxはEnforcingのままとする。
いけるところまでやってみる。どうしてもだめな時だけdisabled。
fedoraのネットワークの設定
自宅側のasteriskサーバはネットワークインタフェースを二つ割り当てており一つは外部インタフェースに直接接続されている(※構成の概要はここに記載している)。
また、このインタフェースは自動構成しておりデフォルトルートが設定される。
が、このままでは都合が悪い(git cloneできないとか…)のでその他もろもろも含めて設定を行う。
# nmcli connection modify ens19 ipv4.ignore-auto-routes yes # DHCPでもらったデフォを無視
# nmcli connection modify ens19 ipv6.method disable # ipv6を利用しない
# nmcli connection modify ens19 +ipv4.routes "Static Route[1] Default gateway"
# nmcli connection modify ens19 +ipv4.routes "Static Route[2] Default gateway"
# nmcli connection modify ens19 +ipv4.routes "Static Route[3] Default gateway"
# nmcli connection up ens19
# nmcli connection modify ens18 ipv4.gateway "外部を知っている隣接ルータ"
# nmcli connection up ens18
“Static Route[1]”、”Static Route[2]”、”Static Route[3]”、”Default gateway”には前提条件のところで入手したひかり電話の情報を入れる。
実家側サーバは ひかり電話網アドレス(上記のStatic Route[1]~Static Route[3]に相当するアドレス)をNVR500へ、デフォルトを隣接ルータに向ける。
firewalldの設定
通信に必要なものだけ設定する。
asteriskのインストール
asteriskのダウンロード
fedora標準リポジトリのasteriskはversion 18でEOFを迎えているようなので、ソースからビルドする。
asteriskの最新LTSは以下のものであった。
22.x LTS 2024-10-16 2028-10-16 2029-10-16 Fully Supported
# mkdir -p ~/src
# cd ~/src
# wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22-current.tar.gz
必要なパッケージのインストール
# dnf -y install gcc g++
# dnf -y install libedit-devel sqlite-devel psmisc ncurses-devel sox newt-devel
# dnf -y install libxml2-devel libtiff-devel audiofile-devel uuid-devel libtool
# dnf -y install libuuid-devel subversion git wget jansson-devel jansson
# dnf -y install openssl-devel
# dnf -y install pjproject
# dnf -y install patch
# dnf -y install chkconfig
# dnf -y install spandsp-devel #FAX送受信に必要
# dnf -y install wget bzip2 tar sqlite-devel ncurses-devel systemd-devel #systemdに必要
# dnf -y install unbound-libs unbound-devel #名前解決でhostsを参照するために必要
# dnf -y install xmlstarlet
# dnf -y install libsrtp libsrtp-devel # WebRTC関連
ソースの展開およびconfigure
# cd ~/src
# gzip -dc asterisk-22-current.tar.gz | tar xvf -
# cd ~/src/asterisk-22.9.0
# ./configure
config.logの中に
/usr/bin/ld.bfd: cannot find -lunbound: No such…
…
fatal error: unbound.h: No such file or directory
…
上記のようなメッセージがでたら、unboud-develをインストールして再度configureを実行する。
# make menuconfig
上記のパッケージをあらかじめ入れておけば必要なものは自動選択されるようだ。
# make
# sudo make install
asteriskの設定
定義サンプルのダウンロードおよびインストール
このサイトからサンプルをダウンロードし、asterisk_20/* を/etc/asteriskへ配置する。
/etc/asterisk/{pjsip,extensions}.confその他の編集
ここを参考に定義ファイルを修正する。
内線番号は4桁、先頭2は実家、1は自宅となるように修正する。
ユーザ・グループの登録およびアクセス権の設定
ユーザ: asterisk、グループ: asteriskを作成。
さらに以下のコマンドを実行し、アクセス権を設定する。
# chown -R asterisk:asterisk /etc/asterisk/*
# chown asterisk:asterisk /etc/asterisk/.
# chown -R asterisk:asterisk /var/log/asterisk/*
# chown asterisk:asterisk /var/log/asterisk/.
# chown -R asterisk:asterisk /var/lib/asterisk/*
# chown asterisk:asterisk /var/lib/asterisk/.
# chown -R asterisk:asterisk /var/run/asterisk/*
# chown asterisk:asterisk /var/run/asterisk/.
# chown -R asterisk:asterisk /var/spool/asterisk/*
# chown asterisk:asterisk /var/spool/asterisk/.
systemdへの登録・起動
# cp contrib/systemd/asterisk.service /usr/lib/systemd/system
# systemctl daemon-reload
# systemctl enable asterisk
# systemctl start asterisk
たぶん、すんなりとは起動してくれない。
主にselinux関連のメッセージが出るので、ログをみて設定を行う。
地道にやっていけば、起動すると思う。
モジュールの確認
例えば、unbound関連モジュールの確認。
# asterisk -rx "module show like unbound"
以下はFAX関連モジュールの確認。
# asterisk -rx "module show like res_fax"
NVR設定
NVRのアナログポートの設定
後で(気が向いたら)定義をここに記入する
アナログポートの確認
show status sip server
asterisk/NVR設定状況確認
NVRのTELポートの状況確認を行う。なお、この時点では、まだ内線通話できない。
asterisk -rvvvでコンソールにログイン
レジストできているかの確認
*CLI> pjsip show registrations
もしくはコマンドで
# asterisk -rx "pjsip show registrations"
エンドポイントの状態確認
*CLI> pjsip show endpoints
NVR/TELポートでの動作確認
内線番号とendpointを結びつけることによって通話可能となる。
内線番号とエンドポイントの紐づけ
自宅側(4桁の内線番号先頭1)
*CLI> database put MYPBX/EXT 1201 phone1
Updated database successfully
*CLI> database put MYPBX/EXT 1202 phone2
Updated database successfully
実家側(4桁の内線番号先頭2)
*CLI> database put MYPBX/EXT 2201 phone1
Updated database successfully
*CLI> database put MYPBX/EXT 2202 phone2
Updated database successfully
ちなみに、紐づけ解除および現在の登録状況の確認はそれぞれ以下のコマンドを実施すればよい。
CLI*> database del MYPBX/EXT 1201
CLI*> database show MYPBX/EXT
発信・着信確認
この時点で、NVRに接続されている電話同士の発信・着信確認ができる。
コンソールを起動しておき動作確認する。
コンソールに何も表示されなかったりうまく着信しない場合は、firewalldやselinuxの設定、およびNVRの設定を見直してみる。
音声が聞こえるかどうかまで確認すること。
SIPクライアントの設定
SIPクライアントとしてZoiper5をWindowsおよびfedora workstationにインストールした。
設定は簡単なので省略。
特に問題なく、発信・着信できている。
Browser-Phoneの設定
Browser-Phoneの設定を行う。
証明書の準備
当サイトでは、let’s encryptの証明書を取得しているのでそれを利用する。
当初はletsのデフォルトのパスにしようかと思ったけれども、複数ファイルから/etc/asterisk/keys/*を参照しているようなので、そこに入れることにした。(シンボリックリンクでもいいのだろうか?)
そのうち、systemctl timerで自動更新を行う予定。切れても動くようならそのまま放置の可能性大。
# mkdir -p /etc/asterisk/keys
# cd /etc/asterisk/keys
# cp バックアップしてあるletsの証明書 /etc/asterisk/keys
# cp -p fullchain.pem asterisk.crt
# cp -p privkey.pem asterisk.key
# chown -R asterisk:asterisk /etc/asterisk/keys/*
# chown asterisk:asterisk /etc/asterisk/keys/.
ソースのダウンロード
githubからソースをダウンロードし、所定の場所へコピーしておく。最後にアクセス権の設定を行う。
# git clone https://github.com/InnovateAsterisk/Browser-Phone.git
# cd /var/lib
# tar cf static-http.tar static-http
# rm /var/lib/asterisk/static-http/*
# cp -r ~/src/Browser-Phone/Phone/* /var/lib/asterisk/static-http/
# chown -R asterisk:asterisk asterisk
http.conf作成
下記の修正を行い、asteriskの再起動を行う。
[general]
enabled=yes
;ブラウザフォンを使用する場合は以下のコメントを外すこと
;事前に証明書類の生成と配置をお忘れなく
bindaddr=0.0.0.0
bindport=5080
tlsenable=yes
tlsbindaddr=0.0.0.0:5443
tlscertfile=/etc/asterisk/keys/asterisk.crt
tlsprivatekey=/etc/asterisk/keys/asterisk.key
enablestatic=yes
sessionlimit=1000
redirect=/ /static/index.html
設定の確認
# asterisk -rx "http show status"
HTTP Server Status: の項目で「Server Enabled」になっていればOK。
pjsip.confの修正
pjsip.confに以下の行を追加する。
;ブラウザフォン用トランスポート(Websocket)
;使う場合にはコメントを外す
#include "pjsip_wsstransport.conf"
asteriskの再起動・動作確認
asteriskを再起動すればブラウザフォンが利用可能となる。
ちなみにbraveで発信および着信の確認はできた。
トラブルシュート
res_srtpが有効でなかった
以下のライブラリインストールコマンドを実行して再度configureからビルドする。
# dnf -y install libsrtp libsrtp-devel
ビルドが終わったら、インストールし再起動する。
内線番号とendpointの紐づけ
忘れがち。
ログローテート設定(/etc/logrotate.d/asterisk)
ローテート後のアクセス権がroot:rootになっていて、エラーになっていたので修正しておく。
アクセス権をasterisk:asteriskへ修正する。
/var/log/asterisk/*.log /var/log/asterisk/queue_log /var/log/asterisk/mmlog {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 640 asterisk asterisk
sharedscripts
postrotate
/usr/sbin/asterisk -rx 'logger reload' > /dev/null 2> /dev/null
endscript
}

コメント