Asterisk18 + Ubuntu で内線電話網を構築


初めに

このメモは xecusさん が発行されている 記事の内容 を再現して、一部詰まったところを記録したものです。

Asteriskで過去に内線環境自体は構築したことがあるのですが、そのときは声が届かず検証の時間も準備していなかったため、断念しました。今回はサクッとできる記事を見つけ、やってみたら本当にできたけど。っていう内容です。←備忘録です。

環境

ConoHa VPS上に Ubuntu インスタンスを立ち上げ、その中に Asteriskを立てています。

- VPS/RAM 1GB/CPU 2Core
- OS/Ubuntu 20.04 LTS
- asterisk/18.3.0

参考にしたもの:Asterisk17 + Ubuntuでさくっと内線電話網を構築する

Asterisk18 のビルド

ソースコードから落としてビルドします。

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18.3.0.tar.gz
tar xf asterisk-*
cd asterisk-*/
./contrib/scripts/install_prereq install
./configure --with-jansson-bundled
sudo make -j4
sudo make install
sudo make samples # 初期の設定ファイル等がインストールされる

Asterisk18 の設定

内線電話番号6001,6002を構築し、お互いにつながるようにします。

設定ファイルは基本的に最下部に追記しました。

pjsip.conf の設定

SIPサーバーに関する設定や内線電話(SIPクライアント)からの認証情報を設定します。

/etc/asterisk/pjsip.conf
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0

[6001]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=6001
aors=6001
rewrite_contact = yes # 6001がNAT環境下の場合、必要。

[6001]
type=auth
auth_type=userpass
password=unsecurepassword
username=6001

[6001]
type=aor
max_contacts=10

[6002]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=6002
aors=6002
rewrite_contact = yes # 6002がNAT環境下の場合、必要。

[6002]
type=auth
auth_type=userpass
password=unsecurepassword
username=6002

[6002]
type=aor
max_contacts=10

extensions.conf の設定

内線電話(SIPクライアント)からの発着信時のルールをここに記述します。

/etc/asterisk/extensions.conf
[from-internal]

exten = 100,1,Answer()
same = n,Wait(1)
same = n,Playback(hello-world)
same = n,Hangup()

# 6001がコールされたらSIPの6001を呼び出す
exten = 6001,1,Dial(PJSIP/6001,30,r)
same = n.Hangup()

# 6001がコールされたらSIPの6001を呼び出す

exten = 6002,1,Dial(PJSIP/6002,30,r)
same = n.Hangup()

UFWの設定

外国からの攻撃がすごいので、UFWによるファイアウォールを入れます。
日本のIPアドレスは JPNIC 参照していい感じに設定

sudo apt install ufw
sudo ufw enable
sudo ufw default DENY
# SIP用ポートを許可
sudo ufw allow from XXX.XXX.XXX.XXX/32 to any port 5060 proto udp
# RTP用ポートを許可
sudo ufw allow from XXX.XXX.XXX.XXX/32 to any port 10000:20000 proto udp
sudo ufw reload

Asterisk18 のサービス化

このままでは普通のサービスのように sudo systemctl restart asterisk ができないのでサービス化します。

新規作成: /etc/systemd/system/asterisk.service

refs: Asterisk Startup systemd

sudo useradd asterisk -s /sbin/nologin
/etc/systemd/system/asterisk.service
[Unit]
Description=Asterisk PBX and telephony daemon
Documentation=man:asterisk(8)
Wants=network.target
After=network.target

[Service]
Type=simple
User=asterisk
Group=asterisk
Environment=HOME=/var/lib/asterisk
WorkingDirectory=/var/lib/asterisk
ExecStart=/usr/sbin/asterisk -f -C /etc/asterisk/asterisk.conf
ExecStop=/usr/sbin/asterisk -rx 'core stop now'
ExecReload=/usr/bin/asterisk -rx 'core reload'

# safe_asterisk emulation
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable asterisk
sudo systemctl unmask asterisk

Asterisk18 のサービス起動

sudo systemctl start asterisk
sudo systemctl status asterisk

Asterisk18 の起動確認

systemctl status asterisk
ss -ltu | grep sip
sample_output
[email protected]:~$ systemctl status asterisk
● asterisk.service - Asterisk PBX and telephony daemon
     Loaded: loaded (/etc/systemd/system/asterisk.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2021-04-27 23:20:59 JST; 5min ago
       Docs: man:asterisk(8)
   Main PID: 92141 (asterisk)
      Tasks: 66 (limit: 1067)
     Memory: 67.7M
     CGroup: /system.slice/asterisk.service
             mq92141 /usr/sbin/asterisk -f -C /etc/asterisk/asterisk.conf
[email protected]:~$ ss -ltu | grep "sip\|iax"
udp    UNCONN  0        0                                0.0.0.0:sip                                    0.0.0.0:*                                      
udp    UNCONN  0        0                                0.0.0.0:iax                                    0.0.0.0:*
[email protected]:~$

実機テスト

検証で使用したApp:
iOS: https://apps.apple.com/jp/app/sessiontalk-sip-softphone/id362501443
Android: https://play.google.com/store/apps/details?id=co.froute.session_chat&hl=ja&gl=US

設定項目

アカウント名: テキトー
ユーザネーム: 6001 or 6002 or 作ったやつ
パスワード: 上の設定そのままなら unsecurepassword
ドメイン: サーバのIPアドレス or FQDN
認証ユーザネーム: ユーザネームと同じ

ios

android

最後に

元のドキュメントに、サービス化の設定書いてないのに systemctl 書いてたり、sudoしてなかったりでいろいろ苦労したけど、調べたらすぐ出てきたからそんなにドハマリはしなかった。一応コピペでできるように作ってるけど、うまく行かない箇所あれば答えられる範囲で答えます。保留音の設定とかはしらん。あと、うまく行かない人は一度エラーメッセージでぐぐってみると答え載ってる。( ー`дー´)キリッ