NTT 西日本でひかり電話の直収をいろいろ試してはいたのですが、なかなかうまくいかず。
今回手法をまとめて記載されてあるサイトをみつけ、それをもとに、FreePBX での直収に成功しましたので、忘備録の目的も含めここに記載しておきます。
参考にさせていただいたサイト
(ありがとうございます。ソース等、引用させていただきました。)
- ひかり電話 OG配下でAsteriskからRegistする(https://qiita.com/tatsuya_info/items/b4482c28eb401474dc07)
- NTT光ネクストのひかり電話へAsteriskを直接接続する(https://qiita.com/kmorimoto/items/d99cd9edcf7436eea7cc)
前提
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」で、正常動作しました。
課題
発信時に使用する電話番号については、まだ詰めてません。おそらくすべて代表番号になるかと思います。
今後詰めていこうと思います。