6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-28

昨日作ったJitsi MeetサーバーにIP電話で音声参加できるよう、AsterikでSIPサーバーを作る。

仮想マシンを準備する

1.例によって、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

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

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

以下は手抜きだが。
image.png

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

Asteriskをインストールする

これを書いている時点で最新版はv18.1か。
https://github.com/asterisk/asterisk

1.インストールというか野良ビルド。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

2.Asteriskの構成ファイルを2つ、修正する。
とりあえず、番号/ユーザー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()

3.Asteriskを起動する。

# make config
# systemctl enable asterisk
# systemctl start asterisk

Jitsi MeetをAsteriskに接続する

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

# sudo apt install jigasi

導入中にSIPユーザー名とパスワードを聞かれるので以下入力する。
SIP username: 6001@asterisk.example.com
SIP password: <パスワード>
image.png
image.png

2.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

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

/etc/hosts
(割愛)

4.jigasiを起動する。ついでにjicofoを再起動する。

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

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

5.画面上の「Invite more people」をクリックして、「Invite your contacts」の入力Boxが追加されていればOK。
image.png
image.png

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

1.詳細割愛するが、例えばMIZUDROIDとかのSIPクライアントをPlayストアからインストールし、Settingから以下を設定する。
  SIPサーバー: asterisk.example.com
  Username: 6002
  Password: <パスワード>
  
2.6001番(Jitsi Meet)に電話をかける。

3.Jitsi Meetの画面で6002番のユーザーが接続されたのを確認する。
image.png

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

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

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?