NTT西日本のひかり電話を FreePBX に直収する

NTT 西日本でひかり電話の直収をいろいろ試してはいたのですが、なかなかうまくいかず。
今回手法をまとめて記載されてあるサイトをみつけ、それをもとに、FreePBX での直収に成功しましたので、忘備録の目的も含めここに記載しておきます。

参考にさせていただいたサイト
(ありがとうございます。ソース等、引用させていただきました。)

前提

Intel CPU のPC にインストールしました。
OS は、CentOS 7 です。FreePBX の公式 ISO は SangomaOS で、CentOSの派生のものですが、使い勝手を考え、CentOS 自体に後付けで FreePBX 15 を入れることにしました。
おそらく同様の手法で FreePBX の iso インストールでも可能かと思われますし、Ubuntu で作ってもいいかもしれません。

Asterisk 18 導入

SELinux を警告モードに
( vim /etc/selinux/config で切ってしまってもいいかもしれませんが)

sudo yum -y update
sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

前提 Package 導入
(一部 Package がないとエラーが出るかもしれませんが、チェックしないでぶち込んだので悪しからず)

yum update
yum groupinstall -y "Development Tools"
yum install -y epel-release
yum install -y mariadb-server mariadb-client httpd
yum install -y git curl wget libnewt-dev libssl-dev libncurses5-dev subversion  libsqlite3-dev build-essential libjansson-dev libxml2-dev  uuid-dev vim
yum update
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum update
yum repolist
yum install -y --enablerepo=epel,remi,remi-php73 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt
yum install -y --enablerepo=epel,remi,remi-php73 php7.3 php7.3-common php7.3-mysql php7.3-cgi php7.3-curl php7.3-gd php7.3-zip php7.3-imap php7.3-json php7.3-snmp php7.3-fpm php7.3-bcmath php7.3-mbstring php7.3-xml php7.3-intl libapache2-mod-php7.3 php-pear
yum install -y --enablerepo=epel,remi,remi-php73 php-mysql php-cgi php-curl php-gd php-zip php-imap php-json php-snmp php-fpm php-bcmath php-mbstring php-xml php-intl libapache-mod-php php-pear
yum install -y openjdk-11-jdk-headless
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf_orig
sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/httpd/conf/httpd.conf
sed -i 's/AllowOverride None/AllowOverride All/' /etc/httpd/conf/httpd.conf
rm -f /var/www/html/index.html
yum -y install epel-release
yum -y install wget php php-pear php-cgi php-common php-curl php-mbstring php-gd php-mysql php-gettext php-bcmath php-zip php-xml php-imap php-json php-process php-snmp
sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php.ini
update-alternatives --config php
yum install java-1.8.0-openjdk

Asterisk 18 インストール

cd /usr/local/src
curl -O http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz
tar xzvf asterisk-18-current.tar.gz
cd asterisk-18.*/
contrib/scripts/get_mp3_source.sh
contrib/scripts/install_prereq install
./configure --libdir=/usr/lib64 --with-jansson-bundled
make menuselect

ここで、矢印キーとエンターキーで、以下を選んでいく。 Add-ons では、chan_ooh323 format_mp3 res_config_mysql を選択 Core Sound Packages では、CORE-SOUNDS-EN-WAV から CORE-SOUNDS-EN-SIREN14 まで CORE-SOUNDS-JA-WAV から CORE-SOUNDS-JA-SIREN14 までを選択 Music On Hold では、MOH-OPSOUND-WAV からMOH-OPSOUND-GSM までを選択 Extra Sound packages では、EXTRA-SOUNDS-EN-WAV から EXTRA-SOUNDS-EN-GSM までを選択 Applications では、app-macro を選択(下から3番目) 選択がすんだら、Save & Exit を選んでエンター

make
make install
 make progdocs
make samples
make config
ldconfig
groupadd asterisk
useradd -r -d /var/lib/asterisk -g asterisk asterisk
usermod -aG audio,dialout asterisk
chown -R asterisk.asterisk /etc/asterisk
chown -R asterisk.asterisk /var/{lib,log,spool}/asterisk
chown -R asterisk.asterisk /usr/lib64/asterisk
chown -R asterisk.asterisk /usr/lib/asterisk
sed -i 's/#AST_USER=/AST_USER=/' /etc/default/asterisk
sed -i 's/;runuser/runuser/' /etc/asterisk/asterisk.conf
sed -i 's/;rungroup/rungroup/' /etc/asterisk/asterisk.conf
ldconfig
sed -i 's";\[radius\]"\[radius\]"g' /etc/asterisk/cdr.conf
sed -i 's";radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf"radiuscfg => /etc/radcli/radiusclient.conf"g' /etc/asterisk/cdr.conf
sed -i 's";radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf"radiuscfg => /etc/radcli/radiusclient.conf"g' /etc/asterisk/cel.conf

Asterisk の起動の確認

systemctl restart asterisk
systemctl status asterisk
asterisk -vvvvr
exit
systemctl enable asterisk

FreePBX の前提の Package 導入

 

cd /usr/local/src/
wget https://github.com/pjsip/pjproject/archive/2.10.tar.gz
tar zxvf 2.10.tar.gz
cd pjproject-2.10
./configure CFLAGS="-DNDEBUG -DPJ_HAS_IPV6=1" --prefix=/usr --libdir=/usr/lib64 --enable-shared --disable-video --disable-sound --disable-opencore-amr
make dep
make
make install
ldconfig
yum install -y nodejs npm
npm install -g n
n stable
yum -y install httpd
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf_orig
sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/httpd/conf/httpd.conf
sed -i 's/AllowOverride None/AllowOverride All/' /etc/httpd/conf/httpd.conf
rm -f /var/www/html/index.html
yum -y install epel-release
yum -y install wget php php-pear php-cgi php-common php-curl php-mbstring php-gd php-mysql php-gettext php-bcmath php-zip php-xml php-imap php-json php-process php-snmp
sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php.ini

FreePBX インストール

systemctl restart mariadb
systemctl enable mariadb
cd /usr/local/src
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-15.0-latest.tgz
tar xfz freepbx-15.0-latest.tgz
cd freepbx
./start_asterisk start
./install -n

http://PCのアドレス/
に、アクセスして、各種設定を行います。

NTT 西日本との通信

ip addr

にて、現在の Network カードの一覧を取得します。
eno0 やら eno1 やら enp0xxxx やら wlpxxxx やら出てきますので、ここでは、USB-LAN の enp0xxxx を NTT との通信に使うものとします。

cat <<'EOF' >> /etc/dhcp/dhclient.conf

option ip-sip-servers code 120 = { boolean, array of ip-address };
option vendor-class.ntt code 210 = string;
option space ntt code width 1 length width 1 hash size 7;
option ntt.mac code 201 = string;
option ntt.number code 202 = text;
option ntt.domain code 204 = domain-list;
option ntt.firmware code 210 = domain-list;
option vendor.ntt code 210 = encapsulate ntt;

interface "enp0xxxx" {
  send dhcp-client-identifier = hardware;
  request subnet-mask, routers, ip-sip-servers, rfc3442-classless-static-routes, vivso;
  send vendor-class.ntt = concat(06, suffix(hardware, 6));
}
EOF

ソースの enp0xxxx の部分は、適時変更してください。
で、該当する LAN ポートに、ONU から分ける HUB から出た LAN ケーブルをつなぎます。

nmtui

「接続をアクティベートする」を選んで、一度該当ポートを解除して再接続します。

ls -l /var/lib/NetworkManager/

にて、新しくできた、dhclient-xxxxxxx.lease ファイルを見つけ、(xxxxxx部分は環境により異なる)

cat /var/lib/NetworkManager/dhclient-xxxxxxx.lease

で、接続環境を調べます。
ip-sip-servers の項目がない場合は、

vi /var/lib/NetworkManager/dhclient-enp0xxxx.lease

で、編集し、

# NetworkManager で作成されています
# /etc/dhcp/dhclient.conf からマージされています

option ip-sip-servers code 120 = { boolean, array of ip-address };
option vendor-class.ntt code 210 = string;
option space ntt code width 1 length width 1 hash size 7;
option ntt.mac code 201 = string;
option ntt.number code 202 = text;
option ntt.domain code 204 = domain-list;
option ntt.firmware code 210 = domain-list;
option vendor.ntt code 210 = encapsulate ntt;
send dhcp-client-identifier = hardware;
send vendor-class.ntt = concat(06, suffix(hardware, 6));
send host-name "gw"; # added by NetworkManager

option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;
option ms-classless-static-routes code 249 = array of unsigned integer 8;
option wpad code 252 = string;

request; # override dhclient defaults
also request subnet-mask;
also request routers;
also request ip-sip-servers;
also request rfc3442-classless-static-routes;
also request vivso;
also request ms-classless-static-routes;
also request static-routes;
also request wpad;
also request ntp-servers;
also request root-path;

のように、also request ip-sip-servers; の行があるか調べて、なければ追加して再度 nmtui を実行して LAN ポートの解除とアクティベートを行ってから cat /var/lib/NetworkManager/dhclient-xxxxxxx.lease を実行してください。

正しく実行されると、

lease {
  interface "enp0xxxx";
  fixed-address 割り当てられたアドレス;
  option subnet-mask 割り当てられたサブネットマスク;
  option dhcp-lease-time 14400;
  option routers NTT側のルーターアドレス;
  option dhcp-message-type 5;
  option dhcp-server-identifier NTTのDHCPサーバー;
  option dhcp-renewal-time 7200;
  option ip-sip-servers true NTTのSIPサーバーアドレス;
  option dhcp-rebinding-time 10800;
  option rfc3442-classless-static-routes なんちゃらかんちゃら;
  option ntt.unknown-203 "電話番号";
  option ntt.domain "ntt-west.ne.jp.";
  option ntt.firmware "フレッツのドメイン";
  option ntt.mac MACアドレス;
  option ntt.number "電話番号";
  renew 5 日時;
  rebind 5 日時;
  expire 5 日時;
}

取得された情報が表示されます(太字は環境による)

cat <<'EOF' >> /etc/hosts
NTTのSIPサーバーアドレス ntt-west.ne.jp
EOF

で、ntt-west.ne.jp を引けるようにしておきます。

FreePBX 収容

vi /etc/asterisk/pjsip.registration_custom.conf

適当な行(末尾にでも)に、以下を追加します。

[reg_HIKARI-DENWA]
type = registration
contact_user = 電話番号 ;電話番号(=DHCPで取得したntt.number)
client_uri = sip:電話番号@ntt-west.ne.jp ;"電話番号@DHCPで取得したntt.domain"である必要がある
server_uri = sip:ntt-west.ne.jp ;DHCPで取得したntt.domain"である必要がある

[HIKARI-DENWA]
type = aor
contact = sip:NTTのSIPサーバーアドレス ;DHCPで取得したip-sip-servers

[HIKARI-DENWA]
type = identify
endpoint = HIKARI-DENWA
match = NTTのSIPサーバーアドレス ;DHCPで取得したip-sip-servers

[HIKARI-DENWA]
type = endpoint
context = incomming ;extension.conf
disallow = all
allow = ulaw
rtp_symmetric = no ;via headerにrportが入らないよう必須
force_rport = no ;via headerにrportが入らないよう必須
rewrite_contact = no ;via headerにrportが入らないよう必須
direct_media = no ;RTPをAsteriskで中継するため必要
from_domain = ntt-west.ne.jp ;DHCPで取得したntt.domain"である必要がある
aors = HIKARI-DENWA

次に、pjsip の基本設定ファイルを編集します。

vi /etc/asterisk/pjsip_custom.conf

以下を適当なところに追加します。

[system]
type = system
disable_rport = yes

次に、extension ファイルを編集します。

vi /etc/asterisk/extensions_custom.conf

内容は以下の通りです。

[incomming]
exten => _X.,1,Set(TO_DIAL=${PJSIP_HEADER(read,To):5})
exten => _X.,2,Set(TO_DIAL=${CUT(TO_DIAL,@,1)})
;exten => _X.,3,Goto(fromHikari,${TO_DIAL},1)
exten => _X.,3,Goto(from-pstn,${TO_DIAL},1)

[hikari]
exten => _X.,1,Dial(PJSIP/${EXTEN}@HIKARI-DENWA)

設定を読み込ませます。

fwconsole reload

FreePBX の設定

「接続」->「トランク」の「トランクを追加」で、「Customトランクを追加」をえらんで、トランクを追加します。
トランク名はわかりやすいものにして、「custom 設定」の「カスタムダイヤル文字列」を

PJSIP/$OUTNUM$@HIKARI-DENWA

にします。

あとは、「接続」->「インバウンドルール」にて契約している番号ごとに振り分けを行ってください。
別サーバーからの発信をうけるときは、接続するトランクの context を from-internal に指定しておけばよいです。

音が聞こえないとき

一度、Firewalld を切って、確認してください。
SIP 設定は、外部アドレスを 割り当てられたアドレス にして、ローカルネットワークを自施設で使用しているローカルネットワークの設定に合わせ、chan_sip のNAT は「いいえ」で IP設定は「静的IP」で、chan_pjsip の udp は、「udp-0.0.0.0-All」で、正常動作しました。

課題

発信時に使用する電話番号については、まだ詰めてません。おそらくすべて代表番号になるかと思います。
今後詰めていこうと思います。

コメントを残す

メールアドレスが公開されることはありません。