IP電話機をローカル環境で試してみる ~SIPサーバの構築など~
皆さん、こんにちは。
IP電話に関して、2023年12月末にPSTN(Public Switched Telephone Network:公衆交換電話網)が廃止され、2024年1月より完全にIP網に移行した運用が始まりました。といっても、ユーザーはそれを意識することはなく、同じ電話機、同じ電話番号を使用できます。
今回は、IP電話機を2台使用して、ローカルな環境でお互いの通話を試したときの話をしたいと思います。
目次
IP電話の構築に必要なもの
IP電話は、IP(Internet Protocol)を利用して通話を行うこと可能とする電話機です。
ローカルのネットワークで、単純にIP電話機を接続すれば通話ができるということではありません。IP電話ではIPアドレスが使用されますが、電話をかける側が知っているのは相手電話番号だけで、相手電話機のIPアドレスを知りません。何か仕組みが必要になってきます。
SIP(Session Initiation Protocol)とは
IP電話機でお互いに通話するには、SIP(Session Initiation Protocol)サーバーが必要になります。以下の仕組みをサポートします。
- 相手のIPアドレスやポート番号を知る必要がある
- 音声をデジタル化する際には色々と圧縮方式(コーデック)があり互いがサポートしている圧縮方式を使用する必要がある
- 発信や着信、応答、切断といった「呼制御」と呼ばれる処理も必要
SIP動作の流れ
① | IP電話機起動後、自身の電話番号、IPアドレスを含む登録メッセージ(レジストリ)をSIPサーバーへ送信 |
---|---|
② | SIPサーバーは、UA(User Agent)の登録情報をデータベース(ローケーションサービス)に登録 |
③ | 電話機BからAと通話するために、電話機Aの電話番号などを指定した発信メッセージをSIPサーバーへ送信 |
④ | SIPサーバーはデータベース(ロケーションサービス)を検索し、電話番号に対応するIPアドレスへ発信メッセージを転送 |
⑤ | 着信を受けた電話機Aは、SIPサーバーへ応答メッセージを送り、SIPサーバーは発信元へそのメッセージを転送 |
⑥ | ①~⑤により、IP電話機同士はメッセージに含まれたお互いにIPアドレスを知り、RTPにより直接音声通話 |
SIPのプロトコルスタック
SIPリクエストメソッド
UA(User Agent:端末)がSIPサーバーに対して要求するリクエストはメソッドで表現し、RFC326で6つのメソッドが定義されています。
SDP(Session Description Protocol)
声や映像などのメディアデータのストリーミング送信を開始する際に、通信に必要なパラメータを伝達するためのデータ形式の一つで、セッションに参加するのに必要な制御情報を記述、伝送するのに用いられる。
- メッセージはテキスト形式
- リクエスト/レスポンスの形式
INVITE sip:bob@biloxi.example.com SIP/2.0
Via: SIP/2.0/TCP client.atlanta.example.com:5060;branch=z9hG4bK74bf9
Max-Forwards: 70
From: Alice <sip:alice@atlanta.example.com>;tag=9fxced76sl
To: Bob <sip:bob@biloxi.example.com>
Call-ID: 3848276298220188511@atlanta.example.com
CSeq: 1 INVITE
Contact: <sip:alice@client.atlanta.example.com;transport=tcp>
Content-Type: application/sdp
Content-Length: 151
v=0
o=alice 2890844526 2890844526 IN IP4 client.atlanta.example.com
s=-
c=IN IP4 192.0.2.101
t=0 0
m=audio 49172 RTP/AVP 0
a=rtpmap:0 PCMU/8000
登録(REGISTERメソッド)
発着信(INVITE, ACK, BYEメソッド)
SIPのフローについて、より詳しい資料は、以下のサイトをご参照ください。
https://datatracker.ietf.org/doc/draft-ietf-sipping-basic-call-flows/02/
SIPサーバーの構築
SIPサーバーを構築するにあたり、オープンソースのAsteriskというソフトウェアを使用します。Asteriskは、SIPサーバーのみならずPBX機能を備えており、オープンソースのソフトウェアということもあり、商用装置等でも利用されています。
- OS Linux Ubuntu 20.04 LSTにAsteriskをインストールする
- ソースコードを入手して、ビルド(コンパイル)しなければならない
Asteriskのインストール
Asteriskのビルドに必要となる依存関係パッケージを導入
sudo apt update
sudo add-apt-repository universe
sudo apt install build-essential curl git libjansson-dev libncurses5-dev libnewt-dev libsqlite3-dev libssl-dev libxml2-dev subversion uuid-dev wget
Asteriskのソースをダウンロード、事前処理
mkdir work
cd ~/work
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz
tar xvf asterisk-18-current.tar.gz
cd asterisk-18*/
contrib/scripts/get_mp3_source.sh
sudo contrib/scripts/install_prereq install
Asteriskのビルドとインストール
./configure
sudo make -j4
sudo make install
sudo make progdocs
sudo make samples
sudo make config
sudo ldconfig
Asteriskのスタート
Asteriskを実行するユーザーとグループを作成
sudo groupadd asterisk
sudo useradd -r -d /var/lib/asterisk -g asterisk asterisk
sudo usermod -aG audio,dialout asterisk
sudo chown -R asterisk.asterisk /etc/asterisk
sudo chown -R asterisk.asterisk /var/{lib,log,spool}/asterisk
sudo chown -R asterisk.asterisk /usr/lib/asterisk
Asteriskを実行するユーザーとグループを指定
sudo cp -a /etc/default/asterisk{,.original} ファイル asterisk を asterisk.original へコピー
sudo vim /etc/default/asterisk ファイル asterisk を編集するためエディターvim を起動
ファイル asterisk の 8,9行目 を
#AST_USER="asterisk"
#AST_GROUP="asterisk"
から
AST_USER="asterisk"
AST_GROUP="asterisk"
へ変更しファイル保存してエディターvim を終了
sudo cp -a /etc/asterisk/asterisk.conf{,.original} ファイル asterisk.conf を asterisk.conf.original へコピー
sudo vim /etc/default/asterisk,cong ファイル asterisk.conf を編集するためエディターvim を起動
ファイル asterisk の 75,76行目 を
;runuser = asterisk ; The user to run as.
;rungroup = asterisk ; The group to run as.
から
runuser = asterisk ; The user to run as.
rungroup = asterisk ; The group to run as.
へ変更しファイル保存してエディターvim を終了
Asteriskサービスの起動、確認、有効化
sudo systemctl restart asterisk
systemctl status asterisk
● asterisk.service - LSB: Asterisk PBX
Loaded: loaded (/etc/init.d/asterisk; generated)
Active: active (running)
sudo systemctl enable asterisk
Asteriskの設定
pjsip.confというファイルを編集して設定を行う。
- SIPサーバーに関する設定や内線電話(SIPクライアント)からの認証情報を設定
https://wiki.asterisk.orgのAsterisk Administrator Guideの以下の部分を参照する。
Example Endpoint Configuration
実際のpjsip.confに記載した設定
[transport-udp]
type=transport
protocol=udp ;udp,tcp,tls,ws,wss
bind=0.0.0.0
[7000]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=ulaw
auth=7000
aors=7000
[7000]
type=auth
auth_type=userpass
password=7000
username=7000
[7000]
type=aor
max_contacts=10
[7001]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=ulaw
auth=7001
aors=7001
[7001]
type=auth
auth_type=userpass
password=7001
username=7001
[7001]
type=aor
max_contacts=10
実際のextensions.confに記載した設定
[general]
static=yes
writeprotect=no
[from-internal]
exten = 100,1,Answer()
same = n,Wait(1)
same = n,Playback(hello-world)
same = n,Hangup()
# 7000
exten = 7000,1,Dial(PJSIP/7000,30,r)
same = n.Hangup()
# 7001
exten = 7001,1,Dial(PJSIP/7001,30,r)
same = n.Hangup()
Asteriskの再起動
設定を反映するため、Asteriskを再起動します。
sudo systemctl restart asterisk
AsteriskのCLIモードに入り状態を確認することもできます。
sudo asterisk -vvvcr
テスト環境
IP電話の設定
今回は、AudioCodes社というメーカーのIP電話機320HDを2台使用します。
設定方法は以下資料をご確認ください。
AudioCodes社IP電話機320HD設定
一方の電話機では、User ID 7000, IP address:192.168.0.20, SIP Proxy IP: 192.168.0.10
もう一方の電話機では、User ID 7001, IP address:192.168.0.30, SIP Proxy IP: 192.168.0.10で設定します。
通話
User ID 7000と設定したIP電話機のハンドセットを取り上げ、ボタンで7001を押すと、User ID 7001と設定したIP電話機をコールします。
Wiresharkによるパケットキャプチャー
ネットワークアナライザWiresharkで、実際のIP電話機同士での通話時のSIPのシーケンスを見てみます。
No.244ではIP電話機(192.168.0.30)からSIPサーバー(192.168.0.10)へ登録(REGISTER)のパケットが送られています。
No.245ではSIPサーバー(192.168.0.10)がIP電話機(192.168.0.30)を登録したので、その電話機へ200 OKのパケットが送られています。
No.303ではIP電話機(192.168.0.20)からSIPサーバー(192.168.0.10)へ登録(REGISTER)のパケットが送られています。
No.304ではSIPサーバー(192.168.0.10)がIP電話機(192.168.0.20)を登録したので、その電話機へ200 OKのパケットが送られています。
No.554ではIP電話機(192.168.0.20)からSIPサーバー(192.168.0.10)へINVITEのパケットが送られています。
No.557ではSIPサーバー(192.168.0.10)からIP電話機(192.168.0.30)へINVITEのパケットが送られています。
No.558ではIP電話機(192.168.0.30)からSIPサーバー(192.168.0.10)へ180 Ringingのパケットが送られています。
No.559ではSIPサーバー(192.168.0.10)からIP電話機(192.168.20)へ180 Ringingのパケットが送られています。
No.560ではIP電話機(192.168.30)からSIPサーバー(192.168.0.10)へ200 OKのパケットが送られています。
No.572ではSIPサーバー(192.168.0.10)からIP電話機(192.168.20)へ200 OKのパケットが送られています。
No.568ではIP電話機(192.168.20)からSIPサーバー(192.168.0.10)へACKのパケットが送られています。
No.573ではSIPサーバー(192.168.0.10)からIP電話機(192.168.30)へACKのパケットが送られています。
おわりに
今回のブログでは、IP電話の基本的な概念や設定、運用について詳しく解説しました。SIP(Session Initiation Protocol)からAsteriskの設定、さらにはWiresharkを用いたパケットキャプチャーに至るまで、IP電話システムの構築と管理の全体像を把握していただけましたでしょうか。
2023年12月末のPSTNの廃止に伴い、通信技術は大きな転換点を迎えます。しかし、この変化はユーザーにとって透過的で、我々の日常生活における通信の利便性はさらに向上することを意味します。
このブログを通じて、IP電話技術への理解が深まれば幸いです。
VoIP関連のDSP、システム・オン・チップ(SoC)などに関する情報は以下よりご確認ください。