AsteriskでSIPサーバーを作って、Jitsi Meetにつなぐ

[昨日作ったJitsi Meetサーバー](https://qiita.com/rk05231977/items/a8e627d87767ee4ec5ac)にIP電話で音声参加できるよう、AsterikでSIPサーバーを作る。

# 仮想マシンを準備する
１．例によって、Amazon Lightsailで仮想マシンを作る。
https://lightsail.aws.amazon.com/

インスタンスロケーションの選択: ap-northeast、ゾーンD
インスタンスイメージの選択: Linux/unix、OSのみ、Ubuntu 20.04 LTS
インスタンスプランの選択: $3.5USD（メモリ 512 GB、CPU 1個、SSD 20GB）
インスタンスを確認: asterisk

２．インスタンス作成後、インスタンス管理画面 > ネットワークにて以下の設定を追加。
　・一応、静的IPアドレスを割り当てておく。
　・ファイアウォールのルールは以下の様に設定する。
　　SSH TCP 22
　　カスタム UDP 5060

　　なお、5060ポートに対してはボルチモアとかの海外からブルートフォース的な認証失敗アクセスがそこそこやってくるので、接続元のIPアドレスはせめて日本国内からに絞るのがよさそう。
https://www.nic.ad.jp/ja/dns/jp-addr-block.html

以下は手抜きだが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/280b3c3d-de4b-a523-0f78-acb20674a60f.png)


３．DNS名を割り当てておく。
一応、静的IPを割り当ててDNSにレコード登録しておく。
例としては以降、```asterisk.example.com```。

# Asteriskをインストールする
これを書いている時点で最新版はv18.1か。
https://github.com/asterisk/asterisk

１．インストールというか野良ビルド。Asteriskサーバーにssh接続し、rootユーザーで以下のコマンドを実行する。

```
# apt-get update
# apt-get install build-essential
# git clone https://github.com/asterisk/asterisk
# cd asterisk
# apt-get install libedit-dev
# apt-get install uuid-dev
# apt-get install libjansson-dev
# apt-get install libxml2-dev
# apt-get install libsqlite3-dev
# ./configure
# make
# make install
# make samples
```

２．Asteriskの構成ファイルを２つ、修正する。
とりあえず、番号/ユーザー6001がJitsi Meet用。
6002がスマホとかのSIPクライアント用。

```:/etc/asterisk/pjsip.conf
[transport-udp-nat]
type=transport
protocol=udp
bind=0.0.0.0
local_net=172.26.0.0/20
external_media_address=＜asteriskサーバーのPublicの静的IP＞
external_signaling_address=＜asteriskサーバーのPublicの静的IP＞

[6001]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=6001
aors=6001

[6001]
type=auth
auth_type=userpass
password=＜パスワード＞
username=6001

[6001]
type=aor
max_contacts=10

[6002]
type=endpoint
context=from-internal
disallow=all
allow=ulaw
auth=6002
aors=6002

[6002]
type=auth
auth_type=userpass
password=＜パスワード＞
username=6002

[6002]
type=aor
max_contacts=10
```

```:/etc/asterisk/extensions.conf
（ファイルの最後に以下を追加）

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

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

３．Asteriskを起動する。

```
# make config
# systemctl enable asterisk
# systemctl start asterisk
```

# Jitsi MeetをAsteriskに接続する

１．Jisti Meetサーバーにsshでログインして以下を実行。
Jigasiという、Jitsi Meetと連携するSIPクライアントを導入する。

```
# sudo apt install jigasi
```

導入中にSIPユーザー名とパスワードを聞かれるので以下入力する。
SIP username:    6001@asterisk.example.com
SIP password:    ＜パスワード＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/101d9013-a561-b885-b755-c8f9224f5f29.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/91d7c484-2e2d-353c-b8bc-d7bf5ba5e508.png)

２．jigasiの設定ファイルの最後に以下を追加する。

```:/etc/jitsi/jigasi/sip-communicator.properties
（最終行に追加）
net.java.sip.communicator.impl.protocol.sip.acc1403273890647.AUTHORIZATION_NAME=6001
net.java.sip.communicator.service.gui.ALWAYS_TRUST_MODE_ENABLED=true
```

３．もしかすると、/etc/hostsを修正してjitsi-meet、asteriskサーバーがお互いにLightsailの内部アドレスで名前解決できるようにすると（NATを経由せずにお互いが通信できると）良いことがあるかもしれない。

```:/etc/hosts
（割愛）
```

４．jigasiを起動する。ついでにjicofoを再起動する。

```
# systemctl stop jicofo
# systemctl stop jigasi
# systemctl start jigasi
# systemctl start jicofo
```

４．PCのWebブラウザからJitsi Meetにアクセスし、「siptest」という会議室を開く。（外からのSIP接続がsiptestという名前の会議室につながるため）

５．画面上の「Invite more people」をクリックして、「Invite your contacts」の入力Boxが追加されていればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/cddf04b4-d29d-318e-077d-8940b64232b9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/8c1175e9-d14c-d20b-5022-d436696cc94f.png)

# スマホのSIPクライアントでAsteriskにつなぐ

１．詳細割愛するが、例えばMIZUDROIDとかのSIPクライアントをPlayストアからインストールし、Settingから以下を設定する。
　　SIPサーバー:    asterisk.example.com
　　Username:    6002
　　Password:    ＜パスワード＞
　　
２．6001番（Jitsi Meet）に電話をかける。

３．Jitsi Meetの画面で6002番のユーザーが接続されたのを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/d640506d-ed89-ed8c-0771-33efbfc80906.png)


これでお互いの音声が聞こえるようなら成功だが、まあ、クソ不安定でなかなか難しい。jigasiがSIPサーバーにログインしに行くタイミングがいまいちつかめなかったり、片方からしか音声聞こえなかったり、NATの影響とかが良くわからなかったり、一回保留して解除すると声が聞こえ始めるようになるとか。
SIPとか使わずにJitsi Meetで音声やり取りできればいいだろうという事である。

（追記）NATで片方からしか音声が聞こえない件は、IBM Cloudの仮想マシンがパブリックIPを直接持てるのでそれで解決した。
https://qiita.com/rk05231977/items/d7360724806f10346089