😽

asteriskでWebRTCサーバーを設定する。

2022/11/03に公開

目的:sip_uaを使用するためにまずはサーバーを準備する。

https://pub.dev/packages/sip_ua/changelog

サーバーはAsteriskを使用する。
sip_uaはjsSipを使用しているので、必然的にWebRTCを設定していくことになる。

https://www.asterisk.org/

WebRTCサーバーとして設定する際はソースからインストールする。(必須なスクリプトなどがあるため)

ソースをダウンロードして解凍する。

まずはソースを落とす。こちらから落とす。

https://downloads.asterisk.org/pub/telephony/asterisk/

展開するディレクトリに移動し、 右クリック→リンクをコピーで好きなやつを落とす。

/usr/local/srcに移動して落とした。
asterisk-**-current.tar.gzで好きなバージョンをwgetする。

cd /usr/local/src
sudo wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz

Asteriskの解凍とprerequirement scriptの実行

Asterisk18の最新が18.15.0のためこのようになる。

sudo tar -zxvf asterisk-18-current.tar.gz
cd asterisk-18.15.0

prerequirement scriptの実行(結構時間かかる)

cd ./contrib/scripts
sudo ./install_prereq install

configure → make menuselect

cd ../../
sudo ./configure 
sudo make menuselect

これでopusを選ぶ。

こちらがXXXとなり選べないときはその下に必要なライブラリが出てくるのでそちらをインストールして./configureする。

私の場合はxmlstarletが足りなかったため、そちらをsudo apt install xmlstarletした。

また、以下のresorceにチェックがあるか、なければチェックをする。

  • res_crypto
  • res_http_websocket
  • res_pjsip_transport_websocket

make → make install →コンフィグスクリプト→サービス起動

sudo make
sudo make install
sudo make config
sudo service asterisk start

SSL/TLS証明書の作成

次にSSL/TLS証明書を取得する。本当はLet's Encryptなどで取得するべきらしいが、自社鯖なんかで利用するくらいだったら自己署名でもOKかもしれない。

その場合はソースのScriptを利用する。
pbx.example.comはサーバーのIPアドレス、"My Organization"は自分とこの名前に置き換える。

途中でパスフレーズの入力があるので適宜入力していく。

cd /usr/local/src/asterisk-18.15.0
sudo mkdir /etc/asterisk/keys
sudo contrib/scripts/ast_tls_cert -C pbx.example.com -O "My Organization" -b 2048 -d /etc/asterisk/keys

ここからは

https://wiki.asterisk.org/wiki/display/AST/Configuring+Asterisk+for+WebRTC+Clients

の通りに設定していく

http.confの設定と確認

/etc/asterisk/http.conf
[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088
tlsenable=yes
tlsbindaddr=0.0.0.0:8089
tlscertfile=/etc/asterisk/keys/asterisk.crt
tlsprivatekey=/etc/asterisk/keys/asterisk.key

Asteriskのチェック

raspberrypi*CLI> http show status
HTTP Server Status:
Prefix: 
Server: Asterisk
Server Enabled and Bound to 0.0.0.0:8088

HTTPS Server Enabled and Bound to 0.0.0.0:8089

HTTPS Server Enabled and Bound to 0.0.0.0:8089が出たらOK。

pjsip.confとextensions.confの設定

pjsip.confextensions.confは下記より拝借する。

https://github.com/flutter-webrtc/dockers/tree/main/asterisk/configuration

pjsip.conf

;=========== General settings ===========
[global]
type=global
user_agent=Asterisk PBX
debug=yes
;externip = 192.168.1.6
;localnet=172.17.0.0/255.255.0.0
nat=yes

[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0

[transport-tcp]
type=transport
protocol=tcp
bind=0.0.0.0

[transport-ws]
type=transport
protocol=ws
bind=0.0.0.0

;=========== Extension 300 ===========
[300]
type=endpoint
context=from-internal
disallow=all
allow=alaw,ulaw
allow=h264,vp8
auth=300
aors=300
callerid=300
identify_by=username,auth_username
;media_address=192.168.1.6

[300]
type=auth
auth_type=userpass
password=300
username=300

[300]
type=aor
max_contacts=1

[400]
type=aor
max_contacts=5
remove_existing=yes
  
[400]
type=auth
auth_type=userpass
username=400
password=400

[400]
type=endpoint
aors=400
auth=400
callerid=400
dtls_auto_generate_cert=yes
webrtc=yes
; Setting webrtc=yes is a shortcut for setting the following options:
use_avpf=yes
; media_encryption=dtls
; dtls_verify=fingerprint
; dtls_setup=actpass
; ice_support=yes
media_use_received_transport=yes
rtcp_mux=yes
context=from-internal
disallow=all
allow=alaw,ulaw
allow=h264,vp8
identify_by=username,auth_username

[500]
type=aor
max_contacts=5
remove_existing=yes
  
[500]
type=auth
auth_type=userpass
username=500
password=500

[500]
type=endpoint
aors=500
auth=500
callerid=500
dtls_auto_generate_cert=yes
webrtc=yes
; Setting webrtc=yes is a shortcut for setting the following options:
use_avpf=yes
; media_encryption=dtls
; dtls_verify=fingerprint
; dtls_setup=actpass
; ice_support=yes
media_use_received_transport=yes
rtcp_mux=yes
context=from-internal
disallow=all
allow=alaw,ulaw
allow=h264,vp8
identify_by=username,auth_username

extensions.conf
[from-internal]
exten => 100,1,Answer()
same => n,Wait(1)
same => n,Playback(hello-world)
same => n,Echo()
same => n,Hangup()


exten => _XXX,1,Dial(PJSIP/${EXTEN})
same => n,Hangup()

以上。

Discussion