# Rincian Konfigurasi Sistem VoIP Menggunakan Asterisk dan PJSIP Kelompok 4
## Daftar Isi
1. [Persiapan Awal](#persiapan-awal)
2. [Instalasi Asterisk dengan PJSIP](#instalasi-asterisk-dengan-pjsip)
3. [Konfigurasi Dasar](#konfigurasi-dasar)
4. [Konfigurasi PJSIP](#konfigurasi-pjsip)
5. [Konfigurasi Extensions](#konfigurasi-extensions)
6. [Konfigurasi Voicemail](#konfigurasi-voicemail)
7. [Konfigurasi Music on Hold](#konfigurasi-music-on-hold)
8. [Konfigurasi TLS](#konfigurasi-tls)
9. [Troubleshooting](#troubleshooting)
10. [Konfigurasi Client](#konfigurasi-client)
11. [Analisis SIP dengan SNGREP](#analisis-sip-dengan-sngrep)
12. [Analisis Protokol dengan Wireshark](#analisis-protokol-dengan-wireshark)
13. [Perhitungan QoS dan MOS](#perhitungan-qos-dan-mos)
## Persiapan Awal
### Instalasi Sistem Ubuntu 22.04
Sistem VoIP dibangun pada VM Ubuntu 22.04 dengan spesifikasi:
- IP Address: 192.168.0.111
- Interface Network: enp0s3
- Netmask: 255.255.255.0
### Instalasi Paket Dasar
```bash
# Update repository
sudo apt update
# Upgrade sistem
sudo apt upgrade -y
# Instalasi paket yang dibutuhkan
sudo apt install -y build-essential git wget libssl-dev libxml2-dev libncurses5-dev uuid-dev sqlite3 libsqlite3-dev pkg-config libjansson-dev libxml2-dev libxslt1-dev libedit-dev
```
## Instalasi Asterisk dengan PJSIP
### Download Source Code Asterisk
```bash
# Buat direktori source
cd /usr/src/
sudo mkdir asterisk
sudo chown $USER:$USER asterisk
cd asterisk
# Download Asterisk 18.26.1
wget https://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-18.26.1.tar.gz
# Ekstrak tarball
tar -xvf asterisk-18.26.1.tar.gz
# Masuk ke direktori hasil ekstraksi
cd asterisk-18.26.1/
```
### Konfigurasi dan Kompilasi
```bash
# Konfigurasi dengan dukungan PJSIP bundled
sudo ./configure --with-pjproject-bundled
# Pilih modul (pastikan res_pjsip dan modul terkait diaktifkan)
sudo make menuselect
# Kompilasi dan instalasi
sudo make
sudo make install
sudo make samples
sudo make config
# Konfigurasi Asterisk untuk start saat boot
sudo systemctl enable asterisk
# Start layanan Asterisk
sudo systemctl start asterisk
```
## Konfigurasi Dasar
### Backup Konfigurasi
```bash
# Buat direktori backup
sudo mkdir -p /etc/asterisk/backup
# Backup konfigurasi asli
sudo cp /etc/asterisk/*.conf /etc/asterisk/backup/
```
### Konfigurasi modules.conf
```bash
sudo nano /etc/asterisk/modules.conf
```
Isi file:
```ini
[modules]
autoload=yes
; Explicitly load the PJSIP channel driver
noload => chan_sip.so
load => res_pjsip.so
load => res_pjsip_session.so
load => res_pjsip_pubsub.so
load => res_pjsip_sdp_rtp.so
load => res_pjsip_notify.so
load => res_pjsip_outbound_publish.so
load => res_pjsip_outbound_registration.so
load => res_pjsip_path.so
load => res_pjsip_registrar.so
load => res_pjsip_endpoint_identifier_ip.so
load => res_pjsip_mwi.so
load => res_pjsip_nat.so
load => res_pjsip_transport_websocket.so
load => res_pjsip_transport_management.so
; Load the RTP engine
load => res_rtp_asterisk.so
; Load SRTP for secure media
load => res_srtp.so
; Load music on hold module (for the additional feature)
load => res_musiconhold.so
; Load voicemail module (for the additional feature)
load => app_voicemail.so
; Load dialplan applications
load => app_dial.so
load => app_playback.so
load => app_stack.so
load => app_verbose.so
load => app_voicemail.so
load => app_directory.so
load => app_confbridge.so
```
### Konfigurasi rtp.conf
```bash
sudo nano /etc/asterisk/rtp.conf
```
Isi file:
```ini
[general]
rtpstart=10000
rtpend=20000
icesupport=yes
dtmfmode=auto
strictrtp=no
; SRTP configuration
srtp_tag_32=yes
```
## Konfigurasi PJSIP
### Konfigurasi pjsip.conf (Versi Final)
```bash
sudo nano /etc/asterisk/pjsip.conf
```
Isi file:
```ini
; Global settings
[global]
type=global
externaddr=192.168.0.111
localnet=192.168.0.0/24
user_agent=Asterisk PBX
; Transport definitions
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
[transport-tls]
type=transport
protocol=tls
bind=0.0.0.0:5061
cert_file=/etc/asterisk/keys/asterisk.pem
priv_key_file=/etc/asterisk/keys/asterisk.pem
method=tlsv1_2
;====== UDP Endpoints (1 + last 4 digits of NIM) ======
; User 1 - UDP (101012300325)
[10325]
type=endpoint
transport=transport-udp
context=internal
disallow=all
allow=ulaw,alaw,g722
aors=10325
auth=10325
callerid="User1" <10325>
direct_media=no
[10325]
type=auth
auth_type=userpass
username=10325
password=123
[10325]
type=aor
max_contacts=5
remove_existing=yes
qualify_frequency=30
; User 2 - UDP (101012330294)
[10294]
type=endpoint
transport=transport-udp
context=internal
disallow=all
allow=ulaw,alaw,g722
aors=10294
auth=10294
callerid="User2" <10294>
direct_media=no
[10294]
type=auth
auth_type=userpass
username=10294
password=123
[10294]
type=aor
max_contacts=5
remove_existing=yes
qualify_frequency=30
; User 3 - UDP (101012330220)
[10220]
type=endpoint
transport=transport-udp
context=internal
disallow=all
allow=ulaw,alaw,g722
aors=10220
auth=10220
callerid="User3" <10220>
direct_media=no
[10220]
type=auth
auth_type=userpass
username=10220
password=123
[10220]
type=aor
max_contacts=5
remove_existing=yes
qualify_frequency=30
; User 4 - UDP (101012300324)
[10324]
type=endpoint
transport=transport-udp
context=internal
disallow=all
allow=ulaw,alaw,g722
aors=10324
auth=10324
callerid="User4" <10324>
direct_media=no
[10324]
type=auth
auth_type=userpass
username=10324
password=123
[10324]
type=aor
max_contacts=5
remove_existing=yes
qualify_frequency=30
;====== TLS Endpoints (2 + last 4 digits of NIM) ======
; User 1 - TLS (101012300325)
[20325]
type=endpoint
transport=transport-tls
context=internal
disallow=all
allow=ulaw,alaw,g722
aors=20325
auth=20325
callerid="User1-TLS" <20325>
direct_media=no
[20325]
type=auth
auth_type=userpass
username=20325
password=123
[20325]
type=aor
max_contacts=5
remove_existing=yes
qualify_frequency=30
; User 2 - TLS (101012330294)
[20294]
type=endpoint
transport=transport-tls
context=internal
disallow=all
allow=ulaw,alaw,g722
aors=20294
auth=20294
callerid="User2-TLS" <20294>
direct_media=no
[20294]
type=auth
auth_type=userpass
username=20294
password=123
[20294]
type=aor
max_contacts=5
remove_existing=yes
qualify_frequency=30
; User 3 - TLS (101012330220)
[20220]
type=endpoint
transport=transport-tls
context=internal
disallow=all
allow=ulaw,alaw,g722
aors=20220
auth=20220
callerid="User3-TLS" <20220>
direct_media=no
[20220]
type=auth
auth_type=userpass
username=20220
password=123
[20220]
type=aor
max_contacts=5
remove_existing=yes
qualify_frequency=30
; User 4 - TLS (101012300324)
[20324]
type=endpoint
transport=transport-tls
context=internal
disallow=all
allow=ulaw,alaw,g722
aors=20324
auth=20324
callerid="User4-TLS" <20324>
direct_media=no
[20324]
type=auth
auth_type=userpass
username=20324
password=123
[20324]
type=aor
max_contacts=5
remove_existing=yes
qualify_frequency=30
```
## Konfigurasi Extensions
### Konfigurasi extensions.conf
```bash
sudo nano /etc/asterisk/extensions.conf
```
Isi file:
```ini
[general]
static=yes
writeprotect=no
priorityjumping=no
autofallthrough=yes
[globals]
[subscriptions]
[internal]
; Regular extensions for UDP
exten => 10325,1,NoOp(Call to User1)
same => n,Set(CALLERID(name)=User1)
same => n,Answer()
same => n,Set(TIMEOUT(absolute)=3600)
same => n,Dial(PJSIP/10325,20,tm(default))
same => n,Voicemail(10325@default,u)
same => n,Hangup()
exten => 10294,1,NoOp(Call to User2)
same => n,Set(CALLERID(name)=User2)
same => n,Answer()
same => n,Set(TIMEOUT(absolute)=3600)
same => n,Dial(PJSIP/10294,20,tm(default))
same => n,Voicemail(10294@default,u)
same => n,Hangup()
exten => 10220,1,NoOp(Call to User3)
same => n,Set(CALLERID(name)=User3)
same => n,Answer()
same => n,Set(TIMEOUT(absolute)=3600)
same => n,Dial(PJSIP/10220,20,tm(default))
same => n,Voicemail(10220@default,u)
same => n,Hangup()
exten => 10324,1,NoOp(Call to User4)
same => n,Set(CALLERID(name)=User4)
same => n,Answer()
same => n,Set(TIMEOUT(absolute)=3600)
same => n,Dial(PJSIP/10324,20,tm(default))
same => n,Voicemail(10324@default,u)
same => n,Hangup()
; TLS extensions
exten => 20325,1,NoOp(Call to User1-TLS)
same => n,Set(CALLERID(name)=User1-TLS)
same => n,Answer()
same => n,Set(TIMEOUT(absolute)=3600)
same => n,Dial(PJSIP/20325,20,tm(default))
same => n,Voicemail(20325@default,u)
same => n,Hangup()
exten => 20294,1,NoOp(Call to User2-TLS)
same => n,Set(CALLERID(name)=User2-TLS)
same => n,Answer()
same => n,Set(TIMEOUT(absolute)=3600)
same => n,Dial(PJSIP/20294,20,tm(default))
same => n,Voicemail(20294@default,u)
same => n,Hangup()
exten => 20220,1,NoOp(Call to User3-TLS)
same => n,Set(CALLERID(name)=User3-TLS)
same => n,Answer()
same => n,Set(TIMEOUT(absolute)=3600)
same => n,Dial(PJSIP/20220,20,tm(default))
same => n,Voicemail(20220@default,u)
same => n,Hangup()
exten => 20324,1,NoOp(Call to User4-TLS)
same => n,Set(CALLERID(name)=User4-TLS)
same => n,Answer()
same => n,Set(TIMEOUT(absolute)=3600)
same => n,Dial(PJSIP/20324,20,tm(default))
same => n,Voicemail(20324@default,u)
same => n,Hangup()
; Voicemail access
exten => *98,1,Answer()
same => n,VoiceMailMain(@default)
same => n,Hangup()
; Music on Hold test
exten => *99,1,Answer()
same => n,MusicOnHold(default,60)
same => n,Hangup()
; Call Forwarding example - User1 to User2
exten => *21,1,Answer()
same => n,Set(DB(CF/${CALLERID(num)})=10294)
same => n,Playback(call-forwarding-activated)
same => n,Hangup()
; Deactivate call forwarding
exten => *22,1,Answer()
same => n,DBDel(CF/${CALLERID(num)})
same => n,Playback(call-forwarding-deactivated)
same => n,Hangup()
```
## Konfigurasi Voicemail
### Konfigurasi voicemail.conf
```bash
sudo nano /etc/asterisk/voicemail.conf
```
Isi file:
```ini
[general]
format=wav49|wav
serveremail=voip-server@localhost
attach=yes
skipms=3000
maxsilence=10
silencethreshold=128
maxlogins=3
sendvoicemail=yes
maxmsg=100
maxsecs=300
minsecs=3
maxgreet=60
review=yes
operator=yes
nextaftercmd=yes
emailsubject=New voicemail from ${VM_CALLERID}
emailbody=You have a new voicemail from ${VM_CALLERID} lasting ${VM_DUR} seconds.\n\nThanks,\nAsterisk VoIP Server
[default]
10325 => 1234,User1,user1@example.com
10294 => 1234,User2,user2@example.com
10220 => 1234,User3,user3@example.com
10324 => 1234,User4,user4@example.com
20325 => 1234,User1-TLS,user1@example.com
20294 => 1234,User2-TLS,user2@example.com
20220 => 1234,User3-TLS,user3@example.com
20324 => 1234,User4-TLS,user4@example.com
```
## Konfigurasi Music on Hold
### Konfigurasi musiconhold.conf
```bash
sudo nano /etc/asterisk/musiconhold.conf
```
Isi file:
```ini
[default]
mode=files
directory=/var/lib/asterisk/moh
random=yes
```
### Memastikan File Musik Tersedia
```bash
# Periksa apakah file music on hold ada
ls -la /var/lib/asterisk/moh
# Jika tidak ada file ditemukan, download beberapa sampel
if [ ! "$(ls -A /var/lib/asterisk/moh)" ]; then
sudo apt install -y sox mpg123
cd /tmp
sudo wget -O music.wav https://www.voip-info.org/wp-content/uploads/2019/02/classical-hold-music.wav
sudo sox music.wav -t raw -r 8000 -c 1 /var/lib/asterisk/moh/music.wav
sudo chown -R asterisk:asterisk /var/lib/asterisk/moh
fi
```
## Konfigurasi TLS
### Membuat Sertifikat untuk TLS
```bash
# Buat direktori untuk sertifikat
sudo mkdir -p /etc/asterisk/keys
# Generate sertifikat self-signed menggunakan OpenSSL
sudo openssl req -new -x509 -days 3650 -nodes \
-out /etc/asterisk/keys/asterisk.pem \
-keyout /etc/asterisk/keys/asterisk.pem \
-subj "/C=ID/ST=Jakarta/L=Jakarta/O=Asterisk/CN=192.168.0.111"
# Atur permission yang sesuai
sudo chown -R asterisk:asterisk /etc/asterisk/keys 2>/dev/null || sudo chown -R root:root /etc/asterisk/keys
sudo chmod -R 550 /etc/asterisk/keys
```
## Troubleshooting
### Masalah Sertifikat TLS
```bash
# Periksa apakah file sertifikat ada
ls -la /etc/asterisk/keys/
# Cek permission
sudo chmod -R 550 /etc/asterisk/keys
sudo chown -R asterisk:asterisk /etc/asterisk/keys
```
### Masalah Koneksi Client
```bash
# Verifikasi konfigurasi endpoint PJSIP
sudo asterisk -rx "pjsip show endpoints"
# Cek transport yang aktif
sudo asterisk -rx "pjsip show transports"
# Periksa kontak yang terdaftar
sudo asterisk -rx "pjsip show contacts"
# Melihat log Asterisk untuk error
sudo tail -f /var/log/asterisk/full
# Aktifkan debug mode di Asterisk CLI
sudo asterisk -r
*CLI> pjsip set logger on
*CLI> core set verbose 5
```
### Masalah Firewall
```bash
# Periksa status firewall
sudo ufw status
# Nonaktifkan firewall jika diperlukan (untuk testing)
sudo ufw disable
```
## Konfigurasi Client
### Konfigurasi MicroSIP
Untuk koneksi UDP (10xxx):
- Account name: User1 (atau nama yang sesuai)
- SIP Server: 192.168.0.111
- User: 10325 (atau ekstensi yang dipilih)
- Domain: 192.168.0.111
- AuthID: 10325
- Password: 123
- Display Name: User1
- Transport: UDP
Untuk koneksi TLS (20xxx):
- Account name: User1-TLS (atau nama yang sesuai)
- SIP Server: 192.168.0.111
- User: 20325 (atau ekstensi yang dipilih)
- Domain: 192.168.0.111
- AuthID: 20325
- Password: 123
- Display Name: User1-TLS
- Transport: TLS
### Konfigurasi Linphone
Proses konfigurasi Linphone mirip dengan MicroSIP, dengan parameter yang sama.
## Analisis SIP dengan SNGREP
### Instalasi SNGREP
```bash
sudo apt install -y sngrep
```
### Cara Menggunakan SNGREP
```bash
# Capture traffic SIP di port UDP
sudo sngrep -d any port 5060
# Capture traffic SIP di port TLS
sudo sngrep -d any port 5061
```
## Analisis Protokol dengan Wireshark
### Instalasi Wireshark
```bash
sudo apt install -y wireshark tshark
sudo usermod -a -G wireshark $USER
```
### Capture Traffic
```bash
# Capture traffic VoIP
sudo tshark -i any -f "port 5060 or port 5061 or udp portrange 10000-20000" -w /tmp/voip_capture.pcap
```
## Perhitungan QoS dan MOS
Untuk perhitungan QoS, kita dapat menganalisis data Wireshark yang sudah di-capture:
1. Buka file capture di Wireshark
2. Klik Statistics > VoIP Calls
3. Pilih panggilan dan klik "Analyze"
4. Cek tab RTP untuk jitter, packet loss dan metrik lainnya
Untuk perhitungan MOS, gunakan rumus E-model:
- R-value = 93.2 - Id - Ie - Is
- dimana:
- Id adalah delay impairment (fungsi dari one-way delay)
- Ie adalah equipment impairment (tergantung pada codec)
- Is adalah simultaneous impairment
- MOS = 1 + 0.035*R + 7*10^-6*R*(R-60)*(100-R)
## Restart Asterisk Setelah Konfigurasi
```bash
sudo systemctl restart asterisk
```
## Verifikasi Konfigurasi Final
```bash
# Masuk ke Asterisk CLI
sudo asterisk -rvvv
# Verifikasi endpoint
*CLI> pjsip show endpoints
# Verifikasi transport
*CLI> pjsip show transports
# Verifikasi kontak
*CLI> pjsip show contacts
```
Hasil dari `pjsip show endpoints` dan `pjsip show transports` menunjukkan bahwa konfigurasi bekerja dengan baik, dengan semua ekstensi UDP (10xxx) dan TLS (20xxx) terdaftar dan tersedia. Transport UDP dan TLS juga aktif dan berjalan pada port yang sesuai (5060 untuk UDP dan 5061 untuk TLS).
## Kesimpulan
Konfigurasi VoIP menggunakan Asterisk dengan PJSIP telah berhasil diimplementasikan. Sistem mendukung:
1. Ekstensi UDP (10xxx) dan TLS (20xxx) sesuai nomor NIM
2. Fitur Music on Hold
3. Fitur Voicemail
4. Fitur Call Forwarding
Semua ekstensi dapat saling terhubung dan berkomunikasi melalui softphone (MicroSIP atau Linphone). Protokol komunikasi (UDP, SIP, SRTP, dan TLS) telah dikonfigurasi dengan benar, dan dapat dianalisis menggunakan SNGREP dan Wireshark.