目次

オープンソースの IP-PBX「Asterisk」は、自社で電話システムを組み立てたい企業や、コールセンター・CTI の基盤として広く使われています。この Asterisk に クラコールSIP trunk をつなぐと、クラコールの電話番号で外線の着信・発信ができるようになります。
このコラムでは、クラコールSIP trunkの2つの接続方式(登録方式と IP-to-IP)の違いと、接続のルールを説明したうえで、現在の標準の SIP チャネルドライバー「PJSIP」と、古いバージョンで使われている「chan_sip」のそれぞれについて、設定例を紹介します。
クラコールSIP trunkの2つの接続方式
クラコールSIP trunkは、SIP の REGISTER(登録)による接続と、IP アドレスどうしで直接つなぐ IP-to-IP の、どちらでも接続できます。違いは、認証のしかたと、着信の届き方です。
| 登録方式(REGISTER) | IP-to-IP | |
|---|---|---|
| 向いている環境 | 固定の IP アドレスがない環境、NAT(ルーター)の内側の Asterisk | 固定のグローバル IP アドレスがある環境 |
| 認証 | お知らせする認証 ID・パスワードで登録 | お客様の IP アドレス(事前に登録したお客様の IP アドレスからの通信を、そのお客様の通信として扱います。同じ IP アドレスを複数のお客様で共有することはできません) |
| 着信の Request-URI | Asterisk が登録した Contact のアドレス | 着信先の電話番号 |
| 着信先の番号(DID)の取り出し | To ヘッダーから取り出す | Request-URI(Asterisk の ${EXTEN})から取り出せる。To も同じ番号 |
登録方式の着信
登録方式では、クラコールは Asterisk が登録した Contact のアドレスへ着信を送ります。そのため、Request-URI には電話番号が入りません。どの番号への着信かは、To ヘッダーから取り出してください。
登録方式の着信 INVITE(例)
INVITE sip:[email protected]:5060 SIP/2.0
From: <sip:[email protected]>;tag=...
To: <sip:[email protected]>
この例では、Request-URI のユーザー部「clocall-in」は Asterisk が登録時に指定した名前、To の「0312345678」が着信先の番号、From の「09012345678」がかけてきた相手の番号です。
IP-to-IP の着信
IP-to-IP では、Request-URI と To ヘッダーに同じ着信先の番号が入ります。Asterisk では、ダイヤルプランの ${EXTEN} がそのまま着信先の番号になります。
IP-to-IP の着信 INVITE(例)
INVITE sip:[email protected]:5060 SIP/2.0
From: <sip:[email protected]>;tag=...
To: <sip:[email protected]>
接続のルール(共通)
どちらの接続方式でも、次のルールは同じです。Asterisk の設定は、このルールに合わせて行います。
| 番号の形式 | すべての番号は、国内形式(0 から始まる形。例:0312345678・09012345678)です。+81 から始まる E.164 形式ではありません。 |
|---|---|
| 着信時の発信者番号 | かけてきた相手の番号は From ヘッダーに入ります。P-Asserted-Identity(PAI)などほかのヘッダーは使わず、From だけをご利用ください。 |
| 発信時の発信者番号 | From ヘッダーのユーザー部に、クラコールがお客様に割り当てた番号を必ず入れてください。PAI・Remote-Party-ID には対応していません。 |
| 非通知の発信 | 相手の番号の前に 184 を付けて発信してください(例:1840312345678)。この場合も From には割り当て番号を入れます。 |
| コーデック | G.711 μ-law(PCMU)。Asterisk では ulaw です。 |
| DTMF | インバンド(音声の中でプッシュ音を送る方式)です。Asterisk では inband にしてください(インバンドは G.711 のような 64kbit/s のコーデックが前提です)。RFC 2833(RFC 4733)や SIP INFO では送らないでください。なお、AI・CPaaS BYOC の接続は RFC 2833 です。 |
| 転送(SIP REFER) | 対応していません。転送は Asterisk の中で行ってください。 |
発信者番号に使えるのは、クラコールが割り当てた番号だけです。他社で契約している番号や他人の番号は通知できません。理由は、コラム「発信者番号の「なりすまし」を防ぐルールとは?」で解説しています。
NAT(ルーター)の内側に Asterisk を置く場合
Asterisk がルーターの内側(192.168.x.x などのプライベート IP アドレス)にある場合は、次の設定が必要です。設定しないと、電話はつながるのに音声が聞こえないことがあります。実際に、公開 IP アドレスを設定していなかったために、音声が聞こえなくなった例がありました。
公開 IP アドレスを SIP と SDP で知らせる
Asterisk は、何も設定しないと、自分のプライベート IP アドレスを SIP の Contact や、音声の送り先を伝える SDP に書き込みます。クラコールは、SDP に書かれたアドレスへ音声を送ります。SDP にプライベート IP アドレスが書かれていると、音声が届きません。NAT の内側の Asterisk をクラコールSIP trunkにつなぐ場合、ルーターの公開 IP アドレス(グローバル IP アドレス)を知らせる次の設定は必須です。
| PJSIP | トランスポート(type=transport)に external_media_address(音声)・external_signaling_address(SIP)に公開 IP アドレス、local_net に社内のネットワーク |
|---|---|
| chan_sip | [general] に externaddr に公開 IP アドレス、localnet に社内のネットワーク |
RTP を途切れにくくする設定
ルーターは、内側からの通信がしばらく途切れると、外から届いた音声(RTP)を通さなくなることがあります。Asterisk から RTP ができるだけ途切れずに送られるように、次の設定をしてください。
- 音声を Asterisk 経由にする:PJSIP は
direct_media=no、chan_sip はdirectmedia=no。電話機とクラコールのあいだで音声を直接やり取りさせない - RTP の送信が止まったら、すぐに送る:PJSIP は
rtp_keepalive、chan_sip はrtpkeepaliveを1(最短の1秒)に。電話機が無音のあいだ音声を送ってこない場合など、Asterisk からの RTP 送信が1秒途切れたときに、コンフォートノイズ(CN)のパケットを送ります - 待ち状態でも無音を送る:
asterisk.confの[options]にtransmit_silence=yes。応答後に何も再生していない待ちのあいだなどに、無音の音声を送ります - ルーター・ファイアウォール:SIP(UDP 5060)と、RTP のポート(
rtp.confのrtpstart〜rtpend。設定サンプルでは 10000〜20000)を Asterisk へ通す
電話機が音声を送ってこないあいだも、Asterisk が 20 ミリ秒ごとに音声データを作って送り続ける、という設定はありません。RTP の送信を途切れさせない設定は、あくまで補助です。音声が届くかどうかを決めるのは、公開 IP アドレスを知らせる設定です。
/etc/asterisk/asterisk.conf
[options]
; 待ち状態などで無音の音声を送る
transmit_silence=yes
このあとの設定例には、公開 IP アドレスの設定と、RTP の途切れ対策の設定を入れています(公開 IP アドレスの行は ; でコメントにしているので、NAT の内側の場合は ; を外してください)。
IP-to-IP では SIP OPTIONS に必ず応答する
IP-to-IP で接続している場合、クラコールは、お客様の Asterisk が動いているかを確かめるために、SIP の OPTIONS を定期的に送ります。Asterisk が OPTIONS に応答しないと、クラコールはお客様の設備が停止していると判断し、着信をお届けできません。このとき、かけてきた相手には「この番号は現在使われておりません」という案内が流れることがあります。
Asterisk が、クラコールから届く OPTIONS に 200 OK で応答するように、次の点を確認してください。
- ファイアウォール:クラコールの接続先のすべての IP アドレスから届く SIP(UDP 5060)を通す。fail2ban などの自動遮断の対象からも外す
- PJSIP:
type=identifyのmatchに、クラコールの接続先のすべての IP アドレスを入れる。OPTIONS が endpoint に結びつかないと、200 OK を返しません。また、OPTIONS の宛先(Request-URI)に番号などのユーザー部がある場合は、その内線が endpoint の context にないと 404 を返します - chan_sip:OPTIONS の宛先の内線が、peer の context にないと 404 を返します。宛先にユーザー部がない場合は
sを探すので、着信用の context にexten => s,1,Hangup()を入れておく
応答しているかは、Asterisk の CLI で pjsip set logger on(chan_sip は sip set debug on)を実行し、クラコールからの OPTIONS に 200 OK を返しているかで確認できます。
PJSIP の設定例(Asterisk 13.18 以降)
PJSIP(chan_pjsip)は、Asterisk 12 で加わり、現在の標準になっている SIP チャネルドライバーです。新しく構築する場合は PJSIP をおすすめします。from_user は Asterisk 13.18(14 系は 14.7)で追加された設定です。そのため、設定例は 13.18 以降(14 系は 14.7 以降)を前提にしています。
設定例の値のうち、次のものはお客様の環境やお申し込み内容に置き換えてください。
sip.clocall.example・192.0.2.10・198.51.100.10:クラコールの接続先(お申し込み後にお知らせします)CLOCALL_USER・CLOCALL_PASSWORD:登録方式の認証 ID とパスワード(お申し込み後にお知らせします)0312345678・0312345679:お客様に割り当てた電話番号203.0.113.10:お客様の Asterisk のグローバル IP アドレス1001〜1003:お客様の内線
登録方式
/etc/asterisk/pjsip.conf
; ===== トランスポート(UDP 5060) =====
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
; NAT(ルーター)の内側に Asterisk を置く場合は、次の3行が必須
; (公開 IP アドレスを知らせないと、音声が聞こえなくなります)
;external_media_address=203.0.113.10
;external_signaling_address=203.0.113.10
;local_net=192.168.0.0/16
; ===== 認証情報(お申し込み後にお知らせする値) =====
[clocall-auth]
type=auth
auth_type=userpass
; ↑ 新しい Asterisk では digest と同じ扱い(userpass は非推奨の別名)
username=CLOCALL_USER
password=CLOCALL_PASSWORD
; ===== 登録(REGISTER) =====
[clocall-reg]
type=registration
transport=transport-udp
outbound_auth=clocall-auth
server_uri=sip:sip.clocall.example
client_uri=sip:[email protected]
; 着信の Request-URI のユーザー部になる(ダイヤルプランの着信用の名前)
contact_user=clocall-in
retry_interval=60
; ===== 接続先 =====
[clocall]
type=aor
contact=sip:sip.clocall.example
[clocall]
type=endpoint
transport=transport-udp
context=from-clocall
aors=clocall
outbound_auth=clocall-auth
disallow=all
allow=ulaw
dtmf_mode=inband
direct_media=no
rtp_symmetric=yes
; RTP の送信が1秒途切れたら、CN パケットを送る(最短の1秒)
rtp_keepalive=1
force_rport=yes
rewrite_contact=yes
; 発信者番号:From に割り当て番号(国内形式)を入れる
from_user=0312345678
from_domain=sip.clocall.example
; PAI・RPID は送らない/受け取っても使わない(From だけを使う)
send_pai=no
send_rpid=no
trust_id_inbound=no
trust_id_outbound=no
; ===== クラコールからの着信をこの endpoint に結びつける =====
[clocall]
type=identify
endpoint=clocall
match=sip.clocall.example
ポイントは次の3つです。
contact_user:登録する Contact のユーザー部です。クラコールからの着信は、この名前(例ではclocall-in)宛てに届きます。type=identify:クラコールから届いた着信を、この endpoint からの着信として扱うための設定です。設定しないと、着信を受け付けられません。from_user:発信の From に、割り当て番号を入れます。設定すると、内線の発信者番号にかかわらず、常にこの番号で発信します。
/etc/asterisk/extensions.conf
[from-clocall]
; 着信の Request-URI は「clocall-in」(contact_user の値)
; 着信先の番号(DID)は To ヘッダーから取り出す
exten => clocall-in,1,Set(DID=${CUT(CUT(PJSIP_HEADER(read,To),@,1),:,2)})
same => n,NoOp(DID=${DID} CALLER=${CALLERID(num)})
same => n,Goto(did-clocall,${DID},1)
[did-clocall]
; 番号ごとの着信先(例)
exten => 0312345678,1,Dial(PJSIP/1001,30)
same => n,Hangup()
exten => 0312345679,1,Dial(PJSIP/1002&PJSIP/1003,30)
same => n,Hangup()
[to-clocall]
; 発信:国内形式(0 から始まる番号)のまま送る
exten => _0X.,1,Dial(PJSIP/${EXTEN}@clocall,60)
same => n,Hangup()
; 非通知で発信:番号の前に 184 を付ける
exten => _1840X.,1,Dial(PJSIP/${EXTEN}@clocall,60)
same => n,Hangup()
[internal]
; 内線電話機の context に、発信用の context を取り込む
include => to-clocall
着信先の番号は、PJSIP_HEADER(read,To) で読んだ To ヘッダー(例:<sip:[email protected]>)から、「:」と「@」のあいだを取り出しています。
IP-to-IP
IP-to-IP では、登録(type=registration)と認証(type=auth)は使いません。お客様の IP アドレスで認証するので、Asterisk は、クラコールにお知らせいただいた固定のグローバル IP アドレスから発信してください。
/etc/asterisk/pjsip.conf
; ===== トランスポート(UDP 5060) =====
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
; NAT(ルーター)の内側に Asterisk を置く場合は、次の3行が必須
;external_media_address=203.0.113.10
;external_signaling_address=203.0.113.10
;local_net=192.168.0.0/16
; ===== 接続先(お申し込み後にお知らせする IP アドレス) =====
[clocall]
type=aor
contact=sip:192.0.2.10:5060
[clocall]
type=endpoint
transport=transport-udp
context=from-clocall
aors=clocall
disallow=all
allow=ulaw
dtmf_mode=inband
direct_media=no
rtp_symmetric=yes
; RTP の送信が1秒途切れたら、CN パケットを送る(最短の1秒)
rtp_keepalive=1
from_user=0312345678
send_pai=no
send_rpid=no
trust_id_inbound=no
trust_id_outbound=no
; ===== クラコールからの着信を受け付ける IP アドレス =====
; お知らせしたアドレスをすべてカンマ区切りで並べる
[clocall]
type=identify
endpoint=clocall
match=192.0.2.10,198.51.100.10
/etc/asterisk/extensions.conf
[from-clocall]
; IP-to-IP では Request-URI と To が同じ番号(国内形式)
exten => _0X.,1,NoOp(DID=${EXTEN} CALLER=${CALLERID(num)})
same => n,Goto(did-clocall,${EXTEN},1)
; [did-clocall]・[to-clocall] は登録方式と同じ
chan_sip の設定例(古いバージョンの Asterisk)
chan_sip は、古くから使われてきた SIP チャネルドライバーです。Asterisk 17 で非推奨になり、Asterisk 21 で削除されました。Asterisk 16 以前で chan_sip をお使いの場合は、次の設定例をご利用ください。これから構築する場合や、バージョンアップの予定がある場合は、PJSIP をおすすめします。
登録方式
/etc/asterisk/sip.conf
[general]
udpbindaddr=0.0.0.0:5060
; NAT(ルーター)の内側に Asterisk を置く場合は、次の2行が必須
; (公開 IP アドレスを知らせないと、音声が聞こえなくなります)
;externaddr=203.0.113.10
;localnet=192.168.0.0/255.255.0.0
; 登録:「/clocall-in」が着信の Request-URI のユーザー部になる
register => CLOCALL_USER:[email protected]/clocall-in
sendrpid=no
trustrpid=no
[clocall]
type=peer
host=sip.clocall.example
defaultuser=CLOCALL_USER
secret=CLOCALL_PASSWORD
; 発信者番号:From に割り当て番号(国内形式)を入れる
fromuser=0312345678
fromdomain=sip.clocall.example
context=from-clocall
insecure=port,invite
disallow=all
allow=ulaw
dtmfmode=inband
directmedia=no
nat=force_rport,comedia
; RTP の送信が1秒途切れたら、CN パケットを送る(最短の1秒)
rtpkeepalive=1
sendrpid=no
trustrpid=no
register 行の最後の「/clocall-in」が、登録する Contact のユーザー部です。クラコールからの着信は、この名前の内線(extension)宛てに届きます。insecure=port,invite は、クラコールからの着信 INVITE を認証なしで受け付けるための設定です。
/etc/asterisk/extensions.conf
[from-clocall]
; 着信先の番号(DID)は To ヘッダーから取り出す
exten => clocall-in,1,Set(DID=${CUT(CUT(SIP_HEADER(To),@,1),:,2)})
same => n,NoOp(DID=${DID} CALLER=${CALLERID(num)})
same => n,Goto(did-clocall,${DID},1)
[did-clocall]
exten => 0312345678,1,Dial(SIP/1001,30)
same => n,Hangup()
[to-clocall]
exten => _0X.,1,Dial(SIP/clocall/${EXTEN},60)
same => n,Hangup()
; 非通知で発信:番号の前に 184 を付ける
exten => _1840X.,1,Dial(SIP/clocall/${EXTEN},60)
same => n,Hangup()
IP-to-IP
/etc/asterisk/sip.conf
[general]
udpbindaddr=0.0.0.0:5060
; NAT(ルーター)の内側に Asterisk を置く場合は、次の2行が必須
;externaddr=203.0.113.10
;localnet=192.168.0.0/255.255.0.0
sendrpid=no
trustrpid=no
; 共通の設定(テンプレート)
[clocall-common](!)
type=peer
context=from-clocall
insecure=port,invite
fromuser=0312345678
disallow=all
allow=ulaw
dtmfmode=inband
directmedia=no
; RTP の送信が1秒途切れたら、CN パケットを送る(最短の1秒)
rtpkeepalive=1
sendrpid=no
trustrpid=no
; お知らせした IP アドレスごとに1つずつ作る(1つ目を発信に使う)
[clocall](clocall-common)
host=192.0.2.10
[clocall-2](clocall-common)
host=198.51.100.10
chan_sip は、着信の送り元の IP アドレスで peer を見分けます。クラコールの接続先の IP アドレスごとに peer を作ってください(例ではテンプレート (!) で共通の設定をまとめています)。
/etc/asterisk/extensions.conf
[from-clocall]
; IP-to-IP では Request-URI と To が同じ番号(国内形式)
exten => _0X.,1,NoOp(DID=${EXTEN} CALLER=${CALLERID(num)})
same => n,Goto(did-clocall,${EXTEN},1)
; ユーザー部のない OPTIONS に 200 OK を返すため(chan_sip は s を探す)
exten => s,1,Hangup()
; [did-clocall]・[to-clocall] は登録方式と同じ
発信者番号と非通知の注意点
複数の番号を使い分ける場合
設定例の from_user(chan_sip では fromuser)は、すべての発信を1つの番号にします。部署ごとなどで割り当て番号を使い分ける場合は、from_user を外し、ダイヤルプランで CALLERID(num) に割り当て番号を入れてから発信してください。From のユーザー部に、その番号が入ります。
; 例:内線 1002 からの発信だけ、別の割り当て番号を使う
; (endpoint の from_user を外したうえで)
[to-clocall]
exten => _0X.,1,Set(CALLERID(num)=${IF($["${CALLERID(num)}"="1002"]?0312345679:0312345678)})
same => n,Dial(PJSIP/${EXTEN}@clocall,60)
same => n,Hangup()
CALLERID(num) には、必ず割り当て番号を国内形式で入れてください。内線番号や、かかってきた相手の番号のまま発信すると、クラコールは発信をお断りします。また、着信を外線へ転送する場合も、元の相手の番号は発信者番号に使えません。
非通知で発信する場合
非通知の発信は、相手の番号の前に 184 を付けて送ってください。Asterisk の CALLERID(pres) で発信者番号を「通知しない」にする方法は使えません。PJSIP では、from_user を設定していないと、From が [email protected] に書き換えられます。割り当て番号を確認できないため、発信できなくなります。
うまくつながらないときの確認ポイント
Asterisk の CLI(asterisk -r)で、登録の状態と SIP のやり取りを確認できます。
; PJSIP
pjsip show registrations
pjsip show endpoint clocall
pjsip set logger on
; chan_sip
sip show registry
sip show peer clocall
sip set debug on
| 症状 | 確認すること |
|---|---|
| 登録できない(登録方式) | 認証 ID・パスワード、接続先のホスト名、ファイアウォールで UDP 5060 の通信が許可されているか |
| IP-to-IP で、相手に「この番号は現在使われておりません」と流れる | クラコールからの SIP OPTIONS に 200 OK で応答しているか(「IP-to-IP では SIP OPTIONS に必ず応答する」) |
| 着信しない | PJSIP の type=identify の match、着信用の context と extension(登録方式は contact_user の名前、IP-to-IP は _0X.) |
| 着信先の番号で振り分けられない | 登録方式で Request-URI(${EXTEN})を使っていないか。登録方式では To から取り出す |
| 発信が断られる | From のユーザー部が割り当て番号(国内形式)になっているか。pjsip set logger on で INVITE の From を確認する |
| 発信先が見つからない | 相手の番号を国内形式(0 から始まる形)で送っているか。+81 の形にしていないか |
| つながるが音声が聞こえない・片方向しか聞こえない | 「NAT(ルーター)の内側に Asterisk を置く場合」の設定。公開 IP アドレスの設定(PJSIP は external_media_address・local_net、chan_sip は externaddr・localnet)と、RTP のポート(rtp.conf の範囲)がファイアウォールで許可されているか |
| プッシュ音(DTMF)が相手に届かない・自動音声が反応しない | DTMF の設定が inband になっているか(PJSIP は dtmf_mode、chan_sip は dtmfmode)、コーデックが ulaw になっているか |
| 488 Not Acceptable Here | コーデックが ulaw になっているか |
通信を暗号化(TLS・SRTP)する場合は、ポートや設定が変わります。詳しくは 暗号化 SIP トランク をご覧ください。
まとめ Asterisk でクラコールSIP trunkを使うポイント
- 接続方式は、登録方式と IP-to-IP の2つ。登録方式では、着信先の番号を To ヘッダーから取り出す
- 番号はすべて国内形式。着信時の発信者番号は From ヘッダーを使う
- 発信の From には、必ず割り当て番号を入れる。PAI には対応していない
- 非通知の発信は、番号の前に 184 を付ける
- 新しく構築するなら PJSIP、Asterisk 16 以前で chan_sip をお使いなら chan_sip の設定例を参考に
設定例は一般的な構成の例です。お客様の環境に合わせた設定や、接続試験のご相談は、お気軽にお問い合わせください。
参考資料
この記事の設定項目は、Asterisk 公式のソースコードと設定サンプルで確認しています。
- pjsip.conf.sample(PJSIP の設定サンプル)
- pjsip_config.xml(endpoint・transport・auth の各設定の説明:dtmf_mode・from_user・trust_id_inbound・send_pai・rtp_keepalive・external_media_address など)
- res_pjsip_outbound_registration.c(登録の設定:contact_user・server_uri・client_uri)
- res_pjsip_endpoint_identifier_ip.c(identify の match)
- res_pjsip_header_funcs.c(PJSIP_HEADER 関数)
- res_pjsip_session.c(発信者番号を通知しない場合の From の書き換え)
- res_pjsip_sdp_rtp.c(rtp_keepalive の動き:送信が途切れたときだけ CN を送る)
- asterisk.conf.sample(transmit_silence)
- pjsip_options.c(PJSIP が OPTIONS に返す応答:options_on_rx_request)
- chan_sip.c(chan_sip が OPTIONS に返す応答:handle_request_options。Asterisk 20)
- sip.conf.sample(chan_sip の設定サンプル。Asterisk 20)
- Asterisk 17 UPGRADE.txt(chan_sip の非推奨化)
- Asterisk 21 Module Removal – chan_sip(asterisk.org)
※ 記載の社名・サービス名は各社の商標または登録商標です。クラコールは各社と提携・協業しておらず、各社から推奨・承認・認定を受けているものではありません。


