Asterisk FUSION GW

2021年10月28日 (木) 17:18時点におけるMakoto3 (トーク | 投稿記録)による版

Asteriskでフュージョンを利用するためには、現在3種類のゲートウェイを使う方法がある。
https://comm.rakuten.co.jp/houjin/asterisk_ip/
FusionがAsterisk用に用意をしたGW
・IP電話 B2BUA(ISPは楽天系を使用)
・IP電話 B2BUA OpenGate(ISPは問わず)
契約者が用意をするGW
・Asteriskの所定のバージョンにパッチを当てる(本記事)

フュージョンで提供しているパッチは、
13.16.0
11.14.0
1.8.9.0
1.4.26.3
のバージョンのパッチを提供しています。13系が2021-10-24でEOLが切れているので、今後が楽天からの提供が期待できないかもしれません。新しいAsteriskとフュージョンと接続する場合には直接接続ができません。またパッチが適用できないアプライアンスや、その他のSIPサーバ類を使う場合にも同じことが言えます。
そこで、パッチの提供されているAsteriskをゲートウェイ(B2BUA)として使うことで、対フュージョンとの接続の仲介をさせてしまいます。この場合、ゲートウェイとなるAsteriskには特に機能は必要ないので不要なモジュール類は落としてしまい、最低限のAsteriskで動作させます。

目次

概略

---[Asterisk 1.8など]--Register-->[Asterisk(FUSION)]---GOL(PPPoE)--->FUSION

図のような形で接続します。Asterisk(FUSION)がパッチを適用したフュージョン対応のAsteriskです。このマシンからPPPoEによってGOLと接続し、フュージョンにREGISTERします。つまりこのマシンはPPPoEとミニマムなAsteriskが動作する程度のマシンでよく、小型アプライアンスなどでもかまいません。
このフュージョン対応のAsteriskに対して他のAsterisk等をSIPでREGISTERして使用します。

GOLとの接続

FUSIONの場合、通話品質の確保のためISPとしてGOLとの接続が必要となります(アクセスラインはNTT東西のフレッツADSLもしくはBフレッツに限定されます)。このため、既存のISP接続がすでにある場合には、ちょっと面倒になりますが既存接続を維持したままGOLを使う場合には、Linuxサーバから直接PPPoEを喋らせてしまうのがNAT抜けの点でも簡単だと思われますので、ここではPPPoEでGOLと接続する方法を解説してみます。

CTUの設定(NTT西日本利用のひかりプレミアム接続の場合)

CTUにマルチでPPPoEセッションを張る設定を行わないといけません。(通常はオフになっています)
「フレッツ接続ツール」を使って「複数のPPPoEセッションを張る」設定を有効にしておかないといけません。
また、PPPoEのMTU設定は通常と異なり1438バイトに設定する必要がある。

図は後で描く

ルータの設定

ルータでは既存のISP接続はそのままにしておき、"PPPoEブリッジ機能"を有効にしておきます。多くのルータでは、おそらくこの機能は有効になっているでしょう。この場合の接続は以下のようになります。

図は後で描く

PPPoEの設定

Linuxマシン上でPPPoEの設定を行います。ここではCentOS上でrp-pppoeを使う例を示します。rp-pppoeでは設定に各種スクリプトが付属してくるので便利です。
まずadsl-setupを実行します。

Welcome to the ADSL client setup.  First, I will run some checks on
your system to make sure the PPPoE client is installed properly...

LOGIN NAME

Enter your Login Name (default root): GOLのアカウント(ユーザ名。@以降も必要)

INTERFACE

Enter the Ethernet interface connected to the ADSL modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethX, where 'X' is a number.
(default eth0): PPPoEを使うEthernetインタフェース

Do you want the link to come up on demand, or stay up continuously?
If you want it to come up on demand, enter the idle time in seconds
after which the link should be dropped.  If you want the link to
stay up permanently, enter 'no' (two letters, lower-case.)
NOTE: Demand-activated links do not interact well with dynamic IP
addresses.  You may have some problems with demand-activated links.
Enter the demand value (default no): 常時接続の場合は'no'

DNS

Please enter the IP address of your ISP's primary DNS server.
If your ISP claims that 'the server will provide dynamic DNS addresses',
enter 'server' (all lower-case) here.
If you just press enter, I will assume you know what you are
doing and not modify your DNS setup.
Enter the DNS information here: プライマリDNSのアドレス
Please enter the IP address of your ISP's secondary DNS server.
If you just press enter, I will assume there is only one DNS server.
Enter the secondary DNS server address here: セカンダリDNSのアドレス

PASSWORD

Please enter your Password: GOLのアカウントのパスワード
Please re-enter your Password: パスワードをもう一度

USERCTRL

Please enter 'yes' (three letters, lower-case.) if you want to allow
normal user to start or stop DSL connection (default yes): ユーザがセッションを開始できるかどうか

FIREWALLING

Please choose the firewall rules to use.  Note that these rules are
very basic.  You are strongly encouraged to use a more sophisticated
firewall setup; however, these will provide basic security.  If you
are running any servers on your machine, you must choose 'NONE' and
set up firewalling yourself.  Otherwise, the firewall rules will deny
access to all standard servers like Web, e-mail, ftp, etc.  If you
are using SSH, the rules will block outgoing SSH connections which
allocate a privileged source port.

The firewall choices are:
0 - NONE: This script will not set any firewall rules.  You are responsible
          for ensuring the security of your machine.  You are STRONGLY
          recommended to use some kind of firewall rules.
1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
                for a LAN
Choose a type of firewall (0-2): 0 ファイアウォール設定。ここでは指定しない。あとで書く。

Start this connection at boot time

Do you want to start this connection at boot time?
Please enter no or yes (default no): yes ブート時にセッションを自動的に張るかどうか(ここはyesにしておいた方が良いと思います)
Start this connection at boot time

** Summary of what you entered **

Ethernet Interface: 設定したインタフェース
User name:          設定したアカウント(ユーザ名)
Activate-on-demand: No
Primary DNS:        プライマリDNSのアドレス
Secondary DNS:      セカンダリDNSのアドレス
Firewalling:        NONE
User Control:       yes
Accept these settings and adjust configuration files (y/n)?  確認してOKならy

これで、インタフェースppp0が作成され、使用できるようになります。試しに接続してみて以下のようにIPアドレスが割り当てられれば接続は完了です。

# adsl-start
# ifconfig ppp0
ppp0      Link encap:Point-to-Point Protocol
          inet addr:IPアドレス  P-t-P:接続先のIPアドレス  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1454  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:30 (30.0 b)  TX bytes:30 (30.0 b)

この時点ではファイアウォールを設定していないため、このまま接続しておくと危ないので接続確認ができたなら、一旦、インタフェースを落としておきます。
なおスクリプトが/etc/resolv.confを書き換えてしまいますので、不都合がある場合には修正しておいてください。adsl-setupを実行すると指定したDNSサーバが/etc/resolv.confに設定されます。

# adsl-stop

ファイアウォールの設定

この方法ではLinuxマシンにグローバルIPが当たるため、そのままではマシンが公開されているのと同じことになってしまいます。このため、外部からの攻撃にさらされるのでiptablesによってフィルタリングすることによって不要なトラフィックを遮断する方法で防御します。
iptablesのエントリはCentOSのデフォルトのものに追加する形で追記します。ファイルは/etc/sysconfig/iptablesを修正して行います。設定に必要な情報は以下の通りとします。

インタフェース ppp0
開くポート
SIPシグナリング UDP 5060
メディア(RTP) UDP 10000~20000 (rtp.confで調整できる)
セッションの戻りパスの許可

これら以外は遮断します。というのはGOLはFUSIONとのVoIP接続にしか使用しないためです。また、SIPおよびUDPのポートはフュージョンのIPレンジにのみ許可します。
/etc/sysconfig/iptablesの内容は以下のようになります。

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i ppp0 -s 61.114.160.0/20 -p udp -m udp --dport 5060 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 61.114.160.0/20 -p udp -m udp --dport 10000:20000 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 61.117.213.0/24 -p udp -m udp --dport 5060 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 61.117.213.0/24 -p udp -m udp --dport 10000:20000 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 61.203.144.0/20 -p udp -m udp --dport 5060 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 61.203.144.0/20 -p udp -m udp --dport 10000:20000 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 61.213.224.0/20 -p udp -m udp --dport 5060 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 61.213.224.0/20 -p udp -m udp --dport 10000:20000 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 202.176.16.0/20 -p udp -m udp --dport 5060 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 202.176.16.0/20 -p udp -m udp --dport 10000:20000 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 202.176.32.0/19 -p udp -m udp --dport 5060 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 202.176.32.0/19 -p udp -m udp --dport 10000:20000 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 210.253.135.0/24 -p udp -m udp --dport 5060 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 210.253.135.0/24 -p udp -m udp --dport 10000:20000 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 219.105.160.0/20 -p udp -m udp --dport 5060 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -s 219.105.160.0/20 -p udp -m udp --dport 10000:20000 -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -i ppp0 -j REJECT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 5060 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

フュージョンのIPレンジは変更される可能性があるので注意してください。

Asteriskの設定

あたりまえのことですが、ここで言うAsteriskはフュージョン・パッチを適用したAsteriskです。
Asteriskの設定はそれほど難しくありませんが、FUSIONの特性のため留意しなくてはならないことがあります。以下の説明を十分に理解して設定を行って下さい。

  • allowguestの扱い
FUSIONではallowguest=yesにしなくてはなりません。
これはFUSION側からの着信の際にFUSION側のIPアドレスが決まっていないためです。
このためallowguest=yesを有効にしていないと着信することができません。
もし、発信にしか使わないのであればallowguest=noでも構いません。

このことを十分に留意してsip.confとextensions.confを記述します。これは以下の方針で行います。

  • sip.confの設定
allowguest=yesを指定します
デフォルトのコンテキストをincomingにします
内線を接続するコンテキストをdefaultにします

この方針に十分、注意してください。FUSION側あるいはインターネット上からの接続要求は全てコンテキストincoming内で処理することにします。このコンテキスト内にはextensions.confで外線発信の記述は入れません

設定ファイル

Asteriskを最低限で立ち上げるので、必要なファイルは以下のみです。

asterisk.conf
extensions.conf
features.conf
modules.conf
rtp.conf
sip.conf

asterisk.conf

[directories]
astetcdir => /etc/asterisk
astmoddir => /usr/lib/asterisk/modules
astvarlibdir => /var/lib/asterisk
astagidir => /var/lib/asterisk/agi-bin
astspooldir => /var/spool/asterisk
astrundir => /var/run
astlogdir => /var/log/asterisk
[options]
languageprefix=yes

features.conf

[general]

rtp.conf

[general]
rtpstart=10000
rtpend=20000

modules.conf

なにもしなくていいのなら

[modules]
autoload=no
load=res_agi.so
load=res_features.so
load=pbx_config.so
load=chan_sip.so
load=app_dial.so

エンドノードとして動きたいのなら、この程度をロード

[modules]
autoload=no
load=res_agi.so
load=res_features.so
load=pbx_config.so
load=chan_sip.so
load=chan_local.so
load=app_dial.so
load=codec_ulaw
load=pbx_spool.so
load=app_playback.so

sip.conf

フュージョン2回線、内線(後ろのAsteriskと繋ぐチャネル)2回線の例を示します。

[general]
maxexpirey=3600
defaultexpirey=3600
registertimeout=300
context=incoming
port=5060
bindaddr=0.0.0.0
disallow=all
allow=ulaw
allow=alaw
allow=gsm
dtmfmode=auto

; [fusion1]
register => 815012345678:password1@fusion1/815012345678
; [fusion2]
register => 815012345679:password2@fusion2/815012345679

[fusion1]
type=friend
username=815012345678
fromuser=815012345678
secret=password1
canreinvite=no
context=incoming
insecure=port,invite
fromdomain=f02.sip.0038.net
host=f02.sip.0038.net
dtmfmode=inband
allowsubscribe=no
nat=never

[fusion2]
type=friend
username=815012345679
fromuser=815012345679
secret=password2
canreinvite=no
context=incoming
insecure=port,invite
fromdomain=f02.sip.0038.net
host=f02.sip.0038.net
dtmfmode=inband
allowsubscribe=no
nat=never

[1001]
type=friend
username=1001
secret=pass1234
canreinvite=no
host=dynamic
context=default
dtmfmode=auto
fusioncom=no

[1002]
type=friend
username=1002
secret=pass1234
canreinvite=no
host=dynamic
context=default
dtmfmode=auto
fusioncom=no

extensions.conf

[general]
writeprotect=no
priorityjumping=no

[globals]
INTERNAL1=1001
INTERNAL2=1002
SIPACCOUNT1=815012345678
SIPACCOUNT2=815012345679

[incoming]
exten => ${SIPACCOUNT1},1,AGI(incoming.agi)
exten => ${SIPACCOUNT1},n,Dial(SIP/${INTERNAL1})
exten => ${SIPACCOUNT1},n,Hangup

exten => ${SIPACCOUNT2},1,AGI(incoming.agi)
exten => ${SIPACCOUNT2},n,Dial(SIP/${INTERNAL2})
exten => ${SIPACCOUNT2},n,Hangup

[default]
exten => _98.,1,SetCallerID(${SIPACCOUNT1})
exten => _98.,n,AGI(outgoing.agi)
exten => _98.,n,Dial(SIP/${EXTEN:2}@fusion1)
exten => _98.,n,Hangup

exten => _99.,1,SetCallerID(${SIPACCOUNT2})
exten => _99.,n,AGI(outgoing.agi)
exten => _99.,n,Dial(SIP/${EXTEN:2}@fusion2)
exten => _99.,n,Hangup

外線発信のプレフィックスは98と99にしてあります。

接続する側のAsteriskの設定

これでゲートウェイとして使用するAsteriskが用意できたので、これに別なAsteriskを接続することでフュージョンを使って通話することができます。

sip.conf

SIPはこんな感じでゲートウェイに対してREGISTERします。

;Fusion GW
register => 1001:pass1234@fusion-gw1/201

ピアの設定はこんな感じ

[fusion-gw1]
type=friend
username=1001
secret=pass1234
host=192.168.xxx.xxx
fromuser=1001
fromdomain=192.168.xxx.xxx
dtmfmode=auto
canreinvite=no
disallow=all
allow=ulaw
insecure=port,invite

ローカルネットワークなのでIPアドレスを直接指定しています。