AsteriskでASAHIネットIP電話Cサービスに接続

# Asterisk

最近ではAsteriskの情報も少なくなってきました。この記事は自分のための備忘録も兼ねています。ある程度Asteriskの扱いに慣れている方を対象としています。

AsteriskとはIP-PBXなどといいますが、簡単に言うとインターネット電話サーバです。

筆者はインターネットプロバイダのASAHIネットと契約しており、固定IPアドレスと「IP電話C」というサービスを利用しています。050で始まる電話番号が割り当てられます。Asteriskを利用して内線を構築し、外線の発着もできるようにします。

## 接続情報の設定（sip.conf）

筆者に提供されている接続情報は次のようなものです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61222/bc7f9331-7f77-de7d-dc49-5545837023eb.png)

接続情報があるとき、`sip.conf`の`register => `の行にどのように書けばいいかが難しいです。ネット上を散々探し回って見つけた答えがこれです。

`register => 電話番号@サービスドメイン:パスワード:ユーザーID@サーバ/電話番号`

ファイル全体は下記のようになります。

``` sip.conf
[general]
externip=123.45.67.89
externhost=example.jp
localnet=192.168.0.0/255.255.255.0
context=default                 ; Default context for incoming calls. Defaults to 'default'
allowoverlap=no                 ; Disable overlap dialing support. (Default is yes)
udpbindaddr=0.0.0.0:5060
tcpenable=no                    ; Enable server for incoming TCP connections (default is no)
tcpbindaddr=0.0.0.0             ; IP address for TCP server to bind to (0.0.0.0 binds to all interfaces)
transport=udp                   ; Set the default transports.  The order determines the primary default transport.
srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
register => 05012345678@asahi-net.or.jp:PASSWORD:USERNAME@xxxxxx.xx.asahi-net.or.jp/05012345678
[authentication]
[basic-options](!)                ; a template
dtmfmode=rfc2833
context=from-office
type=friend
[natted-phone](!,basic-options)   ; another template inheriting basic-options
directmedia=no
host=dynamic
[public-phone](!,basic-options)   ; another template inheriting basic-options
directmedia=yes
[my-codecs](!)                    ; a template for my preferred codecs
disallow=all
allow=ilbc
allow=g729
allow=gsm
allow=g723
allow=ulaw
[ulaw-phone](!)                   ; and another one for ulaw-only
disallow=all
allow=ulaw
[asahi-net.or.jp]
type=friend
username=USERNAME
secret=PASSWORD
fromuser=05012345678
fromdomain=asahi-net.or.jp
host=xxxxxx.xx.asahi-net.or.jp
context=outsideline
insecure=port,invite
```

`externip=`は、外から見える自分のサーバーのIPアドレスです。固定IPアドレス契約で割り当てられたアドレスをそのまま記述します。

`externhost=`は、自分で取得したドメイン名です。

`register =>` の記述と `[asahi-net.or.jp]` セクションの書き方が肝です。

## ユーザーの設定（user.conf）

次に `user.conf` です。例として3つの内線を登録しています。

``` user.conf
[general]
fullname = New User
userbase = 6000
hasvoicemail = yes
vmsecret = 1234
hassip = yes
hasiax = yes
hasmanager = no
callwaiting = yes
threewaycalling = yes
callwaitingcallerid = yes
transfer = yes
canpark = yes
cancallforward = yes
callreturn = yes
callgroup = 1
pickupgroup = 1
[200]
type=friend
username=Panasonic
secret=PASSWORDHOGEHOGE
canreinvite=no
host=dynamic
nat=yes
[201]
type=friend
username=ZenFone3
secret=PASSWORDHOGEHOGE
canreinvite=no
host=dynamic
nat=yes
[202]
type=friend
username=alice
secret=PASSWORDHOGEHOGE
canreinvite=no
host=dynamic
nat=yes
```

一般に、各ユーザーの登録は、次のようになります。

```
[電話番号]
type=friend
username=人が読みやすい名前
secret=パスワード
canreinvite=no
host=dynamic
nat=yes
```

`username=`は認証とは関係ないようですので、わかりやすい名前を書いておけばいいです。自宅サーバーでの運用ならルーターの内側だと思いますので、`nat=yes`が必要になるでしょう。

スマホなどのIP電話アプリに認証情報を登録する際は、`[電話番号]`と`secret=パスワード`の設定内容を登録します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61222/3430da97-a8f6-c8c6-83d5-ec53ce309093.png)

## 外線対応（extension.conf）

実は筆者も、このあたりは完全に理解していません。

200番台は内線ということにしています。それ以外は外線です。`[outsideline]`以降の定義で、外線着信したときは、200番の電話機に廻すようにしています。

``` extension.conf
[default]
include => stdexten
exten => _200,1,Dial(SIP/${EXTEN})
exten => _200,n,Hangup
exten => _201,1,Dial(SIP/${EXTEN})
exten => _201,n,Hangup
exten => _202,1,Dial(SIP/${EXTEN})
exten => _202,n,Hangup
exten => _1XX,1,Macro(callout-asahi-net.or.jp,${EXTEN})
exten => _00.,1,Hangup
exten => _0N0XXXXXXXX,1,Macro(callout-asahi-net.or.jp,${EXTEN:0:11})
exten => _0ZZXXXXXXX,1,Macro(callout-asahi-net.or.jp,${EXTEN})
[macro-callout-asahi-net.or.jp]
exten => s,1,Dial(SIP/${ARG1}@asahi-net.or.jp,,tT)
exten => s,n,Hangup
[outsideline]
exten => 05012345678,1,Dial(SIP/200,20,rt)
exten => 05012345678,n,Hangup
```

# その他

フレッツのひかり電話などのサービスを利用している場合、もしかすると、SIPサーバーで一般的に使用されるUDP/5060のポートがかぶることがありえます。またUDP/5060をそのまま開けておくと、大量の不正アクセスが到来します。不正アクセスといっても、ユーザー設定が脆弱でない限り、たいていはAsteriskサーバが弾いてくれます。でも、鬱陶しいので、ポート番号を標準以外に設定しておくと（気休めですが）多少安全になるでしょう。筆者宅では5060ではなく5600に変更しています。

# 情報が少ないです

Asteriskサーバを構築しようとしても、ネット上の情報も書籍も少なく、設定に苦労します。

この記事も、これで正しいかどうか、怪しい部分があると思います。詳しい方、もしいらっしゃったら、これでいいかご指導ください。