FreePBX15を用いたひかり電話の利用

FreePBX15を用いたひかり電話の利用

昨今では必要性が薄れてきている固定電話ですが、自宅のひかり電話をIP-PBXと連携させることで 外出先でもスマホから固定電話に来た着信を受けたり、固定電話経由から発信することが可能となります。 このような環境を実現するため、今回は自宅サーバにFreePBXを導入しましたので設定手順についてご紹介します。

導入環境について

まずはじめに、筆者がFreePBXを導入した環境について説明をしておきたいと思います。 自宅LAN内にIP-PBXサーバを設置・運用する際には、いわゆるNAT越え問題が発生します。 インターネット上の記事を参考にして構築したはずが思うように電話が利用できないという事がありますが、 この多くはNAT越えに起因したトラブルであり、自分と他の方の導入環境の違い(ネットワーク構成・利用ルータの仕様)により生じます。よって、本項記載の筆者環境と自分の環境を見比べながら適宜読み替えていただければと思います。

FreePBXを導入した環境は下図の通りです。

筆者導入環境でポイントとなる部分は下記になります。

  • ひかり電話用のHGWのLAN側IPはFreePBXの設置ネットワークとは異なるセグメントのIPを利用。全体で2つのLAN※を利用。
  • ひかり電話用HGWからはPPPoE接続をさせずに配下のYAMAHA RTXルータからPPPoE接続させている(HGWはPPPoEブリッジ)
  • WAN側IPはISPから貰えるグローバルIPv4アドレス1つで動的IP
  • LAN(192.168.10.0/24)<=> WANのNAPT変換はRTXで実施
    ※なぜ2つのLANセグメントを設けることになったかというと、自宅の物理的な制約により配線が厳しかったからです。ゆえに筆者環境ではPPPoE接続に用いる回線とRTX<=>HGW間のLANネットワークを1本の物理回線に共有させて、2つのLAN構成でいくことにしました。1つのLAN構成でいく場合は、HGWのLANポートに別ケーブルを用意してRTX配下の192.168.10.0/24のLAN側へ接続することになるでしょう。

FreePBXを導入して実現したいこと

下記を目的としてFreePBXの設定構築を進めました。

  • 固定電話に着信した電話を自宅LAN内のスマホでも受けたい
  • 固定電話に着信した電話を外出先のスマホでも受けたい
  • 固定電話経由の発信を、自宅LAN内のスマホからもしたい
  • 固定電話経由の発信を、外出先のスマホからもしたい
  • アナログ電話機は従来どおり使い続けたい

後述の設定ですべて問題無く動作する環境を作ることができました。

FreePBX15のインストール

インストールイメージ

公式サイトから最新のISOファイル(SNG7-PBX-64bit-2104-1.iso)をダウンロードし、自宅のESXiサーバにインストールしました。 リリースノートによると、

Release Date: 2021-04-30
FreePBX Version 15.0.17.34
OS Version: 12.7.8-2104-1.sng7
CentOS Base: 7.8.2003
Asterisk Versions
13.38.2 (Includes Opus, Silk, and G729)
16.17.0 (Includes Opus, Silk, and G729)
17.9.3 (Includes Opus, Silk, and G729)
18.0.3 (Includes Opus, Silk, and G729)

でFreePBX15、CentOS7.8ベースのイメージのようです。

インストール手順

1. SNG7-PBX-64bit-2104-1.isoからVM起動


Asteriskのバージョンがいくつかの種類から選択できるようですが、推奨の16を選択。

2. インストール時の画面表示の選択


Graphical Installation - Output to VGAで良いでしょう。

3. rootパスワード設定


このタイミングで設定しておきます。

4. イントール完了・再起動後


インストールが完了すると再起動が求められるため、再起動を実施します。再起動後は上記画面となり、自身のIPアドレス等がログイン前のバナー表示で簡単に確認できるようになっています。

FreePBX初期設定

ここからは、Web管理画面からとSSH経由でのCLIによる設定をすすめていきます。

1. 一般初期設定ウィザード

adminユーザの作成を求められるので設定します。 設定が完了すると、"FreePBX Administration"のボタンを選択します。 初回はFreePBXをActivationするか尋ねられます。Activation=すなわち課金というわけではないようですが筆者はSkipにしておきました。 ロケールの設定です。日本に変更しました。

2. Firewall設定

Continueで設定を進めていきます。後続の設定は筆者環境ではすべてYESとしました。

Firewallの設定が完了すると、ダッシュボードの画面に戻ってきます。 右上のApply Configのボタンを押下して設定を反映させます。

3. タイムゾーン設定(CLI)

syslog等の時間がUTCとなっており、確認しにくいためタイムゾーンの設定を変更します。

1timedatectl status
2timedatectl set-timezone Asia/Tokyo
3date

4. IP固定&IPv6無効化(CLI)

インストール後はDHCPによるIPアドレスが設定されているため、固定設定に変更。
/etc/sysconfig/network-scripts/ifcfg-eth0を編集

 1BOOTPROTO="static"          //dhcp=>staticに変更
 2IPV6INIT="no"               //yes=>noに変更
 3IPV6_AUTOCONF="no"          //yes=>noに変更
 4IPV6_DEFROUTE="no"          //yes=>noに変更
 5BROADCAST=192.168.0.255     //追加
 6IPADDR=192.168.10.28        //追加
 7NETMASK=255.255.255.0       //追加
 8NETWORK=192.168.10.0        //追加
 9GATEWAY=192.168.10.1        //追加
10DNS1=192.168.10.1           //追加
1# echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.d/disable_ipv6.conf
2# echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.d/disable_ipv6.conf

さらに、/etc/hostsの::1の部分コメントアウト
いったんここで再起動して反映。

5. 不要モジュール削除

デフォルトでさまざまなCommercialライセンスのモジュールがプリインストールされていますが、

  • モジュールアップデートのする際、アップデートエラーになることが多い
  • 管理者用の設定画面にはライセンス購入しないと使えない商用モジュールに関するメニューも出てくる
  • 筆者環境では商用モジュールの機能で必要なものがない(と思った)
    そのため、下記の通りアンインストールを実施しました。(Web画面の「アドミン=>Updates」からもできます)
 1# fwconsole ma listonline | grep Commercial
 2| adv_recovery         | 15.0.21    | Enabled and up to date                | Commercial  |
 3| areminder            | 15.0.14.24 | Enabled and up to date                | Commercial  |
 4| broadcast            | 15.0.13    | Enabled and up to date                | Commercial  |
 5| callaccounting       | 15.0.24    | Enabled and up to date                | Commercial+ |
 6| callerid             | 15.0.16    | Enabled and up to date                | Commercial  |
 7| calllimit            | 15.0.5.6   | Enabled and up to date                | Commercial  |
 8| conferencespro       | 15.0.3.16  | Enabled and up to date                | Commercial  |
 9| cos                  | 15.0.14    | Enabled and up to date                | Commercial  |
10| endpoint             | 15.0.39.57 | Online upgrade available (15.0.39.73) | Commercial  |
11| extensionroutes      | 15.0.8     | Enabled and up to date                | Commercial  |
12| faxpro               | 15.0.8.12  | Enabled and up to date                | Commercial  |
13| iotserver            | 15.0.2.8   | Online upgrade available (15.0.3.0)   | Commercial  |
14| oracle_connector     | 15.0.7     | Enabled and up to date                | Commercial  |
15| pagingpro            | 15.0.1.21  | Enabled and up to date                | Commercial  |
16| parkpro              | 15.0.13    | Enabled and up to date                | Commercial  |
17| pinsetspro           | 15.0.4     | Enabled and up to date                | Commercial  |
18| pms                  | 15.0.2.52  | Enabled and up to date                | Commercial  |
19| queuestats           | 15.0.3.31  | Online upgrade available (15.0.3.32)  | Commercial  |
20| qxact_reports        | 15.0.3.33  | Enabled and up to date                | Commercial  |
21| recording_report     | 15.0.4.33  | Enabled and up to date                | Commercial  |
22| restapps             | 15.0.19.36 | Online upgrade available (15.0.19.39) | Commercial  |
23| sangomaconnect       | 15.0.18    | Online upgrade available (15.0.21)    | Commercial  |
24| sangomacrm           | 15.0.22    | Enabled and up to date                | Commercial  |
25| sipstation           | 15.0.5.18  | Online upgrade available (15.0.5.20)  | Commercial  |
26| sms                  | 15.0.18    | Enabled and up to date                | Commercial  |
27| sysadmin             | 15.0.21.46 | Online upgrade available (15.0.21.55) | Commercial  |
28| vega                 | 15.0.10    | Enabled and up to date                | Commercial+ |
29| vmnotify             | 15.0.12    | Enabled and up to date                | Commercial  |
30| voicemail_report     | 15.0.6     | Enabled and up to date                | Commercial  |
31| vqplus               | 15.0.7.21  | Enabled and up to date                | Commercial  |
32| webcallback          | 15.0.6.3   | Enabled and up to date                | Commercial  |
33| zulu                 | 15.0.58.9  | Enabled and up to date                | Commercial  |

削除するCommercialパッケージを確認し、下記コマンドで一括削除。

1# fwconsole ma listonline | grep Commercial | awk '{print $2}' | xargs fwconsole ma uninstall

依存関係でcos、endpoint、sms、sysadminのパッケージが残るので、再度上記コマンドを実行。 最終的にsysadminだけ残りました。依存しているSystem Firewallモジュールを削除すれば、sysadminも削除できました。しかしながらFirewall機能は使いたいためsysadminモジュールについてはそのまま残すことにしました。

6. モジュールの最新化

モジュールを最新にアップデートしておきます。まずは下記コマンドでアップデートができるモジュールを確認。

 1# fwconsole ma showupgrades
 2No repos specified, using: [standard] from last GUI settings
 3
 4Upgradable:
 5+----------------+---------------+----------------+
 6| モジュール     | Local Version | Online Version |
 7+----------------+---------------+----------------+
 8| asterisk-cli   | 14.0.3        | 14.0.4         |
 9| blacklist      | 15.0.2.12     | 15.0.2.14      |
10| callforward    | 15.0.13       | 15.0.14        |
11| contactmanager | 15.0.8.32     | 15.0.8.33      |
12| core           | 15.0.12.61    | 15.0.12.66     |
13| filestore      | 15.0.3.13     | 15.0.3.14      |
14| findmefollow   | 15.0.25       | 15.0.26        |
15| paging         | 15.0.4.30     | 15.0.4.32      |
16| pm2            | 15.0.4        | 15.0.6         |
17| ringgroups     | 15.0.11.13    | 15.0.11.14     |
18| sipsettings    | 15.0.6.36     | 15.0.6.39      |
19| sysadmin       | 15.0.21.46    | 15.0.21.55     |
20| voicemail      | 15.0.18.31    | 15.0.18.34     |
21+----------------+---------------+----------------+

問題なければ下記コマンドでアップデート。

1# fwconsole ma upgradeall

ひかり電話との連携設定

SIP設定

設定=>高度な設定

  • SIP Channel Driverをbothからchan_pjsipに変更
  • PHP TimezoneをUTCからAsia/Tokyoに変更

設定=>Asterisk SIP設定

▼「General SIP Settings」

  • SIPゲストを許可「はい」から「いいえ」に変更
  • 外部IPアドレス:DDNSで取得したFQDNに変更※
    ※設定変更前から正しいWAN-IPが設定されていたので、IPが変わっても自動的に更新する仕組みがあると考えていたが異なる?ようです。筆者環境では、WAN-IPが変化してから6時間以上経過しても自動更新されることはなく、さらにFreePBXサーバごとを再起動してもこの設定が自動的に更新されることはありませんでした。「Detect Network Settings」のボタンを押せば最新のWAN-IPに更新されるのですが、IP変わるたびに手動でこの設定更新をしないといけないのは非常に辛いです。色々試してみた結果、結論としては「外部IPアドレス」の項目にDDNSのFQDNを設定するだけでうまく動きました。この項目の設定は具体的には下記3箇所と対応しているようで、Asteriskのブログ記事でもDDNSのホスト名をサポートする旨の記事が見つかりました。
    1/etc/asterisk/pjsip.transports.conf
    2external_media_address=XXXXXXXXXXXX
    3external_signaling_address=XXXXXXXXXXXX
    4
    5/etc/asterisk/sip_general_additional.conf
    6externip=XXXXXXXXXXXX
    
  • NAT設定 - ローカルネットワーク:「192.168.1.0/30」を追加
    NATローカルネットワークの設定はFreePBXに設定されているIPを考慮して"192.168.10.0/24"が自動的にされていましたが、このままだと筆者環境では通話不具合が発生しました。切り分けした結果、こちらにはひかり電話ルータのIPを含むネットワークの設定も必要なようで筆者環境では192.168.1.0/30を追加しています。
  • 音声コーデック:ulaw, alaw以外のチェックを解除

トランク設定

接続=>トランク=>「+トランクを追加」=>「+SIP(chan_pjsip)トランクを追加」

Generalタブ

  • 「トランク名」:freebpx等、任意の名前を設定
  • 「アウトバウンドCID」:<03XXXXXXXX> ※自身が契約するひかり電話の電話番号
  • 最大チャンネル数:1回線のみなので1。空欄でも良いかと思われます。

pjsip設定タブ=>General

  • ユーザ名:0007 //HGWの内線番号
  • Secret : xxxxxx          //HGWで設定したパスワード
  • SIP Server : 192.168.1.1 //HGWのIPアドレス
  • SIP Server Port : 5060
    この設定のユーザ名、Secret、SIP Serverはひかり電話の設定に合わせて実施します。

※参考情報:HGWのひかり電話設定画面(RT-500KIの場合)

pjsip設定タブ=>高度な設定

  • From Domain:192.168.1.1 //HGWのIPアドレス
  • From User:7 //HGWの内線番号
  • クライアントURI :sip:[email protected]:5060 //<HGWの内線番号>@<HGWのIPアドレス>:5060
  • Server URI:sip:192.168.1.1 //sip:<HGWのIPアドレス>
  • AORコンタクト:sip:[email protected]:5060 //sip:<HGWの内線番号>@<HGWのIPアドレス>:5060

前項と同じくこちらもひかり電話の設定に合うように設定が必要となります。

アウトバウンド設定

接続=>アウトバウンドルート=>「+アウトバウンドルートを追加」

経路設定タブ

  • 経路名:outbound routes  等任意の名前
  • ルートCID:<03XXXXXXXX> ※自身が契約するひかり電話の電話番号 一致したルートのトランクシーケンス:前項で作成したトランク(筆者環境ではfreebpx)を指定

Dial Patternタブ

  • 一致パターン: とりあえず簡易的に、「1XX」, 「XXXXXXXXXXX」を設定。 この設定に一致する番号パターンのみひかり電話経由で外線発信を許可することになります。 フリーダイヤル等の10桁の電話番号にはこの設定のままだと発信できませんので必要に応じて追加してください。また、外部からの攻撃を受けて国際電話の不正利用をされてしまうことがあります。この対策として、Dial Patternの設定「0XXXXXXXXXX」をすると多少良いと思います。

内線設定

アプリケーション=>内線=>「+内線追加」=>「+新しいSIP[chan_pjsip]内線を追加」

  • ユーザー内線:内線番号
  • ディスプレイ名:わかりやすい任意の端末名を設定
  • Secret:パスワードを設定 のみ入力

着信グループ設定

アプリケーション=>着信グループ=>「+着信グループを追加」

固定電話への外線着信を複数のSIP端末で受けたかったため、着信グループの設定をしました。

  • 着信グループ番号:999 //任意の番号
  • グループの説明:子機全部
  • 内線リスト:外線着信したい内線すべてを入れる
  • 応答がない場合の転送先:Terminate Call 、Hangupを指定

インバウンドルート設定

接続=>インバウンドルート=>「+インバウンドルートを追加」

ここで固定電話に外線が着信した際に接続したい内線を紐付けます。

  • 説明:任意
  • 宛先をセット:着信グループ、999 子機全部を指定

RTX設定

RTX側にもいくつか設定しました。参考までにこちらも記載しておきます。

NATポート転送設定

1nat descriptor masquerade static 1 11 192.168.10.28 udp 5060
2nat descriptor masquerade static 1 14 192.168.10.28 udp 10000-20000

SIP-NAT設定

1nat descriptor sip 1 on

hostnameの設定

hostnameの設定するに至った背景

SIP PhoneではSIPサーバの設定としてRTXのWAN-IPのFQDN(インターネット側から見たSIPサーバのアドレス)を設定していましたが、自宅Wi-Fiに接続している時のみスマホのSIP Phoneで通話できない不具合が発生しました。SIPメッセージのやり取りはOKでしたが、RTPの相互到達性に難があるようです。自宅LAN内の端末からFQDNを宛先としたSIPサーバに登録しますので、SIPサーバから見てもSIP PhoneがRTXのWAN-IPと見えるようです。SIPもRTPもRTXのヘアピンNATで配下の2端末間で互いに通信できればうまくいきそうな気がしますが、調査が難航し解決できませんでした。(なお、RTXで単純なヘアピンNAT動作自体はOK)

解決策

LAN内にいるSIP PhoneのSIPサーバ設定をFQDNではなくFreePBXのLAN-IP(192.168.10.28)とすれば、問題は発生しません。しかしながら、屋内・屋外でSIP Phoneの設定を使い分けるのは非常に面倒です。考えた結果、RTXに下記hostnameの設定することにしました。

1ip host <DDNSで登録したFQDN> 192.168.10.28

この設定によりSIP PhoneではFQDNのSIPサーバ設定をしておくだけでよく、LANにいる時のみLANのSIPサーバのIPで接続ができます。 もちろん、この手法をうまく動作させるためには、家にいる時はこのRTXをDNSサーバとして利用する必要があります。