Complete Issabel Configs for MSTeams Direct Routing

Related to previous post about how to setup Issabel as Direct Routing SBC to MSTeams,I got requests from acquintances about the complete configurations from Issabel side.

So here they are:

sip_custom.conf (modify this from Asterisk File Editor webGUI)

[MSTeams-Inbound]
disallow=all
host=sip.pstnhub.microsoft.com
type=friend
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-internal
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz

[MSTeams02-Inbound]
disallow=all
host=sip2.pstnhub.microsoft.com
type=friend
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-internal
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz

[MSTeams03-Inbound]
disallow=all
host=sip3.pstnhub.microsoft.com
type=friend
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-internal
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz

[Carrier-Inbound]
disallow=all
host=xxx.xxx.xxx.xxx
type=friend
port=xxxx
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-internal
insecure=port,invite
nat=force_rport,comedia

replace xxx are Carrier ip address, and port. replace fromdomain with your own FQDN Issabel server.

sip_additional.conf (modify this from Trunk webGUI menu)

[MSTeams-Outbound]
disallow=all
host=sip.pstnhub.microsoft.com
type=peer
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-trunk
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz
encryption=yes

[MSTeams02-Outbound]
disallow=all
host=sip.pstnhub.microsoft.com
type=peer
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-trunk
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz
encryption=yes

[MSTeams03-Outbound]
disallow=all
host=sip3.pstnhub.microsoft.com
type=peer
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-trunk
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz
encryption=yes

[Carrier-Outbound]
host=xxx.xxx.xxx.xxx
port=xxxx
canreinvite=yes
type=peer
insecure=port,invite
nat=force_rport,comedia
context=from-trunk
qualify=yes
dtmfmode=rfc2833

replace xxx are Carrier ip address, and port. replace fromdomain with your own FQDN Issabel server.

Outbound to MSTeams DID

I created 3 outbounds route with this order:

  • Outbound to MSTeams
  • Outbound to Carrier for REFER
  • Outbound to Carrier for each DID

The order should as such. And you dont need to setup any Inbound Routes.

Outbound route to MSTeams should contain your assigned DIDs toward MSTeams account. Should look like this:

Outbound Route to Accomodate REFER

Since I dont know how to replace user part of the URI with RPID, I just pick one DID to accomodate REFER. This is less desireable but the REFER outbound route can act as Global CallerID for the direct routing. Notice that the route contains disposable prefix 9 to avoid overriding from 3rd route (i.e Route for each DID).

This image has an empty alt attribute; its file name is image-2.png

Outbound Route to Carrier for Each DID

(extra) Asterisk SIP Settings from Unembedded IssabelPBX menu

Point the tlsprivatekey, tlscertfile, and tlscafile to your approriate files. And realm should be the Issabel server’s FQDN. The tlsbindaddr can by any ip address and port you wish to use.

That should do it. If I miss anything, please clue me at the comment.

Microsoft Teams Direct Routing with Issabel (Asterisk)

Why?

FYI

  • Should have Issabel server properly installed with ip public and . The server firewall should be hardened by only allowing Carrier and Microsoft cloud ip address blocks (52.112.0.0/14). Even better if the only maintenance can only be accessed by VPN. Dont open your Issabel webGUI, SSH, SIP & RTP ports to public internet whenever possible.
  • My Issbel (Asterisk) server is already connected to Ofon as the PSTN Carrier, and already has a DID assigned.
  • Requires to edit chan_sip.c to comply with Microsoft Teams Phone System that demands SIP From and Contact header host part to be FQDN. From header is easy, just add fromdomain at the Asterisk trunk config and you’re good. The Contact header is the tricky one, based on this screenshot clue (stolen from thread https://community.asterisk.org/t/fqdn-in-the-contact-header/77625):
  • By half-assed editing the chan_sip.c , I expect there will be repercussion somewhere else in the system (plus I am no good at C, should find a better way to insert the change with more elegant solution), so dont share the PBX with something else for production, and use this as POC only.
  • Dont ever think to commercialize this without Microsoft approval, nor use this for officials. You may not be able to open tickets if you encounter problems with this installation although you are a legit Office 365 tenant with Phone System license. The certified SBC list can be found here.
  • Should have access to DNS server to add TXT type record for domain authentication.
  • Should have global admin account to make changes in O365 portal.
  • In this example, I have two E1 O365 + Phone System licenses. One to be assigned to my account and one to be assigned to SIP trunk domain dummy user.
  • You cant do multi tenant with this installation. Asterisk itself is a single realm (CMIIW).
  • Still cant find how to modify Contact header in OPTIONS, hence you’ll find tlsdontverifyserver=yes in Issabel general config.
  • Will periodically update this post with something new whenever I find improvement. So forgive me if you find something different when you read back the post later.

Microsoft Teams Phone System Side Config

In this stage you will need to add an SSL’ed domain to Office 365 portal. Microsoft-recommended CA list can be found here. I myself use GeoTrust.

  • Microsoft has a very detailed documentation that can be found at https://docs.microsoft.com/en-us/microsoftteams/direct-routing-plan . I wont rewrite the details here.
  • Using global admin to add domain (mine is ast.ofon.biz), to O365 admin portal.
  • Add a dummy user for that domain and assign O365 + Phone System license for that dummy user. For example, my dummy user for the newly added domain is sip@ast.ofon.biz. If successfully added, I will find the user in Active users table like this:
  • that is how Microsoft Teams will recognize the SIP trunk to our Issabel (Asterisk) server and assign license to the trunk.
  • Login using powershell to your account using global admin user. Again, the powershell preparation wont be repeated here since the detailed documentation can be found at https://docs.microsoft.com/en-us/microsoftteams/direct-routing-configure. Next steps will require us to import Sfbonline module to powershell.
  • Start the session (you will be asked for password on a popped up windows) :
$sfb = New-CsOnlineSession -Username "admin@ofonio.onmicrosoft.com"
Import-PSSession $sfb -AllowClobber
  • Add the Issabel (Asterisk server) as PSTN Gateway:
New-CsOnlinePSTNGateway -Fqdn ast.ofon.biz -SipSignalingPort 5061 -ForwardCallHistory $true -Enabled $true -ForwardPai $true -MaxConcurrentSessions 5
  • See if the server is properly added with Get-CsOnlinePstnGateway :
 Get-CsOnlinePSTNGateway


Identity                            : ast.ofon.biz
InboundTeamsNumberTranslationRules  : {}
InboundPstnNumberTranslationRules   : {}
OutboundTeamsNumberTranslationRules : {}
OutboundPstnNumberTranslationRules  : {}
Fqdn                                : ast.ofon.biz
SipSignalingPort                    : 5061
FailoverTimeSeconds                 : 10
ForwardCallHistory                  : True
ForwardPai                          : True
SendSipOptions                      : True
MaxConcurrentSessions               : 5
Enabled                             : True
MediaBypass                         : False
GatewaySiteId                       :
GatewaySiteLbrEnabled               : False
FailoverResponseCodes               : 408,503,504
GenerateRingingWhileLocatingUser    : True
PidfLoSupported                     : False
MediaRelayRoutingLocationOverride   :
ProxySbc                            :
BypassMode                          : None
  • Create a routing and routing policy that will utilize the Issabel (Asterisk) server:
Set-CsOnlinePstnUsage -Identity Global -Usage @{Add="Default"}

New-CsOnlineVoiceRoute -Identity "CatchAll" -NumberPattern ".*" -OnlinePstnGatewayList ast.ofon.biz -Priority 1 -OnlinePstnUsages "Default"

New-CsOnlineVoiceRoutingPolicy -Identity "DefaultVoicePolicy" -OnlinePstnUsages "Default"
  • Assign DID & VoiceRoutingPolicy to my account.

Issabel (Asterisk) Side Config

We will have two SIP connection configs for Microsoft Teams Phone System and two SIP connection configs for Carrier. Each connection will have different contexts. One SIP connection for Microsoft Teams will be from-internal, so call from Microsoft Teams will be treated as call from extension. And the other SIP connection will be treated as outbound trunk with from-trunk context. Same deal with the two SIP connections toward Carrier.

Microsoft provides 3 hosts to connect a SIP trunk with:

  • sip.pstnhub.microsoft.com
  • sip2.pstnhub.microsoft.com
  • sip3.pstnhub.microsoft.com

This example will only test the first one (sip.pstnhub.microsoft.com).

  • Adding Trunk to Microsoft Teams from PBX -> PBX Configuration -> Trunks. Add SIP Trunk and fill these parameters :
Trunk Name: MSTeams-Outbound
PEER Details:
disallow=all
host=sip.pstnhub.microsoft.com
type=peer
transport=tls
port=5061
allow=all&ulaw
qualify=yes
dtmfmode=rfc2833
context=from-trunk
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz
encryption=yes
  • And as “extension” add the following configs to sip_custom.conf using PBX -> Tools -> Asterisk File Editor :
[MSTeams-Inbound]
disallow=all
host=sip.pstnhub.microsoft.com
type=friend
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-internal
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz
  • To refer to certifcate files, go to PBX -> PBX Configuration -> Unembedded IssabelPBX. At the following page, go to Settings -> Asterisk SIP Settings and then Add field at the Other SIP Settings with these:
realm=ast.ofon.biz
tlsenable=yes
tlsbindaddr=0.0.0.0:5061
tlsprivatekey=/etc/asterisk/keys/star_ofon_biz.key
tlscertfile=/etc/asterisk/keys/star_ofon_biz.pem
tlscafile=/etc/asterisk/keys/star_ofon_biz.crt
tlscipher=ALL
tlsclientmethod=tlsv1
tlsdontverifyserver=yes
  • Save and reload the config.
  • Add the Outbound Routes to Microsoft Teams and Carrier (Microsoft Teams outbound should be aboive the Carrier). Since my carrier mostly sends with prefix 0, I have to convert it to E.164. Please modify these according to your apporpriate settings:

At this point, you should be able to call outbound from Microsoft Teams account but not the other way (inbound). As mentioned before, Microsoft Teams Phone System require us to send From and Contact header host as FQDN. The trunk settings in Asterisk wont change Contact header host to FQDN hence we’ll receive this message:

INVITE sip:+622430000062@sip.pstnhub.microsoft.com:5061 SIP/2.0
Via: SIP/2.0/TLS xxx.xxx.xxx.xxx:5061;branch=z9hG4bK4e781f8a;rport
Max-Forwards: 70
From: "02139700001" <sip:02139700001@ast.ofon.biz>;tag=as36acd9d9
To: <sip:+622430000062@sip.pstnhub.microsoft.com:5061>
Contact: <sip:02139700001@xxx.xxx.xxx.xxx:5061;transport=tls>
Call-ID: 2239ff467456d8f03c4348826168d7a6@ast.ofon.biz
CSeq: 102 INVITE
User-Agent: Asterisk 16.7.0
Date: Fri, 08 May 2020 04:45:38 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Content-Type: application/sdp
Content-Length: 1324

...
...
...
SIP/2.0 403 Forbidden
FROM: "02139700001"<sip:02139700001@ast.ofon.biz>;tag=as36acd9d9
TO: <sip:+622430000062@sip.pstnhub.microsoft.com:5061>
CSEQ: 102 INVITE
CALL-ID: 2239ff467456d8f03c4348826168d7a6@ast.ofon.biz
VIA: SIP/2.0/TLS xxx.xxx.xxx.xxx:5061;branch=z9hG4bK4e781f8a;rport
REASON: Q.850;cause=63;text="735a16a2-5f83-4cb0-bdec-9cb64edff551;Provided Trunk FQDN 'xxx.xxx.xxx.xxx' is not allowed. Connection allows following fqdns: *.ofon.biz, ofon.biz, *.ofon.biz."
CONTENT-LENGTH: 0
ALLOW: INVITE,ACK,OPTIONS,CANCEL,BYE,NOTIFY
SERVER: Microsoft.PSTNHub.SIPProxy v.2020.5.6.2 i.ASEA.2

chan_sip.c

There is no Asterisk source in Issabel distro so we have to get it ourself. From Issabel linux console, git clone the Asterisk github and checkout for 16.7.0 (since this is my Issabel’s Asterisk version).:

cd /usr/src
git clone https://github.com/asterisk/asterisk.git
cd asterisk
git checkout 16.7.0

Edit file /usr/src/asterisk/channel/chan_sip.c. Look at build_contact() we will find these lines:

static void build_contact(struct sip_pvt *p, struct sip_request *req, int incoming)
{
        char tmp[SIPBUFSIZE];
        char *user = ast_uri_encode(p->exten, tmp, sizeof(tmp), ast_uri_sip_user);
        int use_sips;
        char *transport = ast_strdupa(sip_get_transport(p->socket.type));

        if (incoming) {
                use_sips = uas_sips_contact(req);
        } else {
                use_sips = uac_sips_contact(req);
        }

        if (p->socket.type == AST_TRANSPORT_UDP) {
                ast_string_field_build(p, our_contact, "<%s:%s%s%s>", use_sips ? "sips" : "sip",
                        user, ast_strlen_zero(user) ? "" : "@",
                        ast_sockaddr_stringify_remote(&p->ourip));
        } else {
                ast_string_field_build(p, our_contact, "<%s:%s%s%s;transport=%s>",
                        use_sips ? "sips" : "sip", user, ast_strlen_zero(user) ? "" : "@",
                        ast_sockaddr_stringify_remote(&p->ourip), ast_str_to_lower(transport));
        }
}

The last conditional lines are where the Contact header gets value from. Since we only need to modify for TCP transport, edit the line:

 else {
                ast_string_field_build(p, our_contact, "<%s:%s%s%s;transport=%s>",
                        use_sips ? "sips" : "sip", user, ast_strlen_zero(user) ? "" : "@",
                        ast_sockaddr_stringify_remote(&p->ourip), ast_str_to_lower(transport));
        }

to become :

 else {
                ast_string_field_build(p, our_contact, "<%s:%s%s%s;transport=%s>",
                        use_sips ? "sips" : "sip", user, ast_strlen_zero(user) ? "" : "@",
                        p->fromdomain, ast_str_to_lower(transport));
        }

p->fromdomain will follow whatever “fromdomain=” value in the SIP trunk config.

Update:
Got input from Igo Cunha that the call from MSteams to PSTN will be disconnected after 6 sec. I can confirm I got random disconnect call at about 6 sec from the same direction. Try replace:
 
ast_sockaddr_stringify_remote(&p->ourip) 

with your Asterisk's FQDN string (e.g "ast.ofon.biz" in my case) instead of p->fromdomain.

Thanks Igo!

I understand this is not elegant way, but that should do it. Compile the source and we will have brand new chan_sip.so. Backup the original one and replace it after:

copy /usr/lib64/asterisk/modules/chan_sip.so /usr/local/src/chan_sip.so.original
copy /usr/src/asterisk/channels/chan_sip.so /usr/lib64/asterisk/modules/chan_sip.so

then reload the module from Asterisk console:

asterisk -vr

ast*CLI> module reload chan_sip.so
Module 'chan_sip.so' reloaded successfully.
 Reloading SIP

Now test call to inbound, we should have correct SIP Contact header requirement as follows:

INVITE sip:+622430000062@sip.pstnhub.microsoft.com:5061 SIP/2.0
Via: SIP/2.0/TLS 103.135.74.15:5061;branch=z9hG4bK394b6483;rport
Max-Forwards: 70
From: "02139700001" <sip:02139700001@ast.ofon.biz>;tag=as20858906
To: <sip:+622430000062@sip.pstnhub.microsoft.com:5061>
Contact: <sip:02139700001@ast.ofon.biz;transport=tls>
Call-ID: 1a5d05f10eadb0036683f88a6177f80f@ast.ofon.biz
CSeq: 102 INVITE
User-Agent: Asterisk 16.7.0
Date: Fri, 08 May 2020 04:54:36 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Content-Type: application/sdp
Content-Length: 1324

and the call went through:

Remarks

Although it is possible to connect Direct Routing with Asterisk, still easier using Kamailio (and OpenSIPS) since they’re built solely for SIP packet engineering. Until some of them become certified with Microsoft, I guess I will be using the already ceritfied ones, like Sonus or AudioCodes, or just connect to a hosted Direct Routing Provider in Indonesia, like Ofon. Alternatively, there are Kamailo based products start providing hosted DR, like Gilawa and dSIPRouter. Check them out.

Complete Configs

Links:

Mengamankan Issabel dengan Fail2ban

Keperluan menginstall IP PBX dengan ip address public sepertinya memang sudah tidak bisa dihindari lagi demi mengurangi carbon footprint *halah*. Beberapa waktu yang lalu saya pernah menulis bagaimana saya mengamankan server Elastix dengan IPTABLES ketika harus dipasang dengan ip address public di sini. Cuma caranya kurang elegan karena masih mengubah port default SIP, dan firewallnya bisa dibilang statis (tidak bisa otomatis block/unblock ip address perpetrator). Padahal kalau melihat appliance yang ada di pasaran, seperti Yeastar IP PBX, Grandstream IP PBX, Sangoma IP PBX, dll (terutama yang Asterisk based), mereka sudah menerapkan Fail2ban sebagai default pengamanan dan dengan pede bisa membuka port 5060 di network public.

Fail2ban di Issabel, yang notabene sudah jalan di atas Centos 7, menggunakan tool Firewalld (bukan IPTABLES, walaupun masih disertakan juga sebagai backward compat).  Tapi saya masih kebawa ngubah port default layanan lain ke port berbeda (misal SSH jadi port 8022, http jadi port 8080, https jadi port 8443, dst), sekedar menambahkan “onion layer” ke layer pengamanan.

“Cara Kerja Fail2ban Gimana sih?”

Fail2ban membaca file log layanan (ssh, http, https, Asterisk, FreeSWITCH, dst) untuk dibandingkan dengan regex yang ada di direktori ~fail2ban/filter.d/*.conf. Misal di Issabel ini, saya sudah menginstruksikan Fail2ban membaca file /var/log/asterisk/full (file log utama Asterisk) di ~fail2ban/jail.conf seperti di bawah ini:

...
[asterisk]

port = 5060,5061
action = %(banaction)s[name=%(__name__)s-tcp, port="%(port)s", protocol="tcp", chain="%(chain)s", actname=%(banaction)s-tcp]
%(banaction)s[name=%(__name__)s-udp, port="%(port)s", protocol="udp", chain="%(chain)s", actname=%(banaction)s-udp]
%(mta)s-whois[name=%(__name__)s, dest="%(destemail)s"]
logpath = /var/log/asterisk/full
maxretry = 3
...

Nilai default maxretry di setting ini 10. Sengaja saya turunkan menjadi 3.

Fail2ban akan membaca file /var/log/asterisk/full (defaultnya /var/log/asterisk/messages) untuk dicocokkan dengan regex yang ada di dalam file ~fail2ban/filter.d/asterisk.conf . Silahkan check sendiri, isinya agak panjang jadi ndak saya paste di sini. Yang perlu diperhatikan adalah keyword  . Regex akan mengeluarkan variable yang disimpan di  untuk kemudian dijadikan parameter blocking di Firewalld, lalu meyimpan record tersebut di database SQLite. Kalau mau tau di mana lokasi databasenya jalankan saja perintah:

[root@issabel ~]# fail2ban-client get dbfile
Current database file is:
`- /var/lib/fail2ban/fail2ban.sqlite3

Kalo ngerti SQLite, silahkan dilihat2 isi dari database tersebut, sementara ndak saya bahas di sini cara ngeliatnya pake SQLite.

“Kenapa catatan ip address yang diblokir harus disimpan? “

Kadang-kadang kan memang kejadiannya ndak sengaja. Misal ada user yang pada saat setting endpoint salah dalam mengisikan password. Jadi ada baiknya diberikan kesempatan. Untuk jumlah berapa kali boleh diberikan kesempatan tergantung Sysadminnya segalak apa. Jadi Fail2ban secara default akan memberikan kesempatan 5x autentikasi, lalu diblokir selama 3 menit, kemudian dibuka blokirnya. Jika terjadi lagi salah autentikasi 5x, akan dilakukan blokir selama 3 menit lagi. Block/unblock ini akan dihitung oleh Fail2ban. Jika sudah sampai 10x, maka ip address client akan diblokir permanen. Ini sebabnya dibutuhkan database untuk mencatat.

Untuk server dengan ip address public, biasanya saya menurunkan jumlah toleransi dari 5x percobaan autentikasi yang diperbolehkan menjadi 3x saja. Lalu blocking/unblocking yang defaultnya dari 10 menjadi 3. Lumayan saving resource karena saat server hadap ke jaringan public, jumlah percobaan akan berlipat puluhan kali, bahkan sampai ribuan kali lebih banyak jika dibandingkan dengan jaringan internal kantor, misalnya.

Walhasil baru sebentar sudah panen hama:

[root@issabel fail2ban]# fail2ban-client status asterisk
Status for the jail: asterisk
|- Filter
| |- Currently failed: 2
| |- Total failed: 227890
| `- File list: /var/log/asterisk/full
`- Actions
|- Currently banned: 5
|- Total banned: 31
`- Banned IP list: 46.29.162.24 185.22.152.78 46.29.162.11 185.22.152.88 62.210.143.116

Untuk menjalankan Fail2ban default install, yang perlu diubah hanya lokasi file log di Asterisk seperti yang sudah saya cantumkan di atas. Selain itu matikan layanan IPTABLES, dan aktifkan Firewalld.

[root@issabel ~]# systemctl stop iptables
[root@issabel ~]# systemctl disable iptables
[root@issabel ~]# systemctl enable firewalld
[root@issabel ~]# systemctl start firewalld

Lalu tambahkan layanan Issabel/Asterisk untuk SIP di Firewalld:

[root@issabel ~]# firewall-cmd --permanent --zone=public --add-port={5060,5061}/tcp
[root@issabel ~]# firewall-cmd --permanent --zone=public --add-port={5060,5061}/udp
[root@issabel ~]# firewall-cmd --permanent --zone=public --add-port=10000-20000/udp
[root@issabel ~]# firewall-cmd --reload

Dan pastikan level logging di Asterisk di dalam file logger_logfiles_additional.conf ada baris:

full => debug,error,notice,verbose(3),warning

Jika ingin mengubah verbosity, maka perlu dipikirkan juga perubahan regex yang mungkin terjadi di dalam file ~fail2ban/filter.d/asterisk.conf.

Dan terakhir aktifkan Fail2ban:

[root@issabel ~]# systemctl enable fail2ban
[root@issabel ~]# systemctl start fail2ban

Selamat mencoba dan selamat menyambut tahun baru 2018!

Links

Update

Di setup Issabel belakangan, untuk menjalankan fail2ban, saya harus menyalin file jail.conf ke jail.local:

cp -pf /etc/fail2ban/jail.conf  /etc/fail2ban/jail.local

Trunk Antar IP PBX Di Belakang NAT

Berawal dari keinginan untuk menyambungkan dua buah IP PBX Elastix, yang satu menggunakan ip address public, sedangkan yang lain berada di NAT. Untuk menjadikannya full-mesh, idealnya masing-masing bisa “melihat” ip address satu sama lain (bisa ping dari kedua arah). Tapi dalam kondisi ini, hanya IP PBX yang berada di bawah NAT lah yang bisa ping ke IP PBX dengan ip address public, sementara IP PBX dengan ip address public tidak bisa melakukan ping ke IP PBX yang berada di bawah NAT (ribet banget bahasanya ya).

Karena hanya IP PBX Kantor A  yang bisa melakukan ping ke IP PBX Kantor B, maka IP PBX Kantor A yang harus registrasi ke IP PBX Kantor B. Setelah terjadi registrasi, masing-masing IP PBX akan bisa melempar panggilan melalui ip address yang tercatat di registrasi tersebut. Caranya adalah sebagai berikut:

Konfigurasi IP PBX Kantor B

Dengan asumsi, ip address private IP PBX kantor A adalah 10.0.10.10 dengan nat ip public 1.1.1.1, dan ip address public IP PBX kantor B : 2.2.2.2.

Karena IP PBX Kantor B menggunakan ip address public, maka IP PBX ini yang akan menerima registrasi. Tambahkan informasi user untuk IP PBX Kantor A di iax_custom.conf (untuk menambahkan baris berikut, sebaiknya melalui webGUI, sepert yang pernah saya bahas di postingan https://www.otakudang.org/?p=356 ):

[KantorA]
username=KantorA
secret=KantorA
context=from-internal
host=dynamic
type=friend
port=4569
qualify=yes
permit=0.0.0.0/0.0.0.0
requirecalltoken=no

Lalu tambahkan trunk IAX2 dari webUI, dengan keterangan sebagai berikut:

Trunk Name: TrunkToKantorA
Peer Detail
host=dynamic
type=peer
nat=yes
qualify=yes
insecure=port,invite
context=from-internal

Konfigurasi IP PBX Kantor A

Di mesin IP PBX kantor A tambahkan trunk IAX2 dari webUI dan isikan sebagai berikut:

Trunk Name: KantorA
host=2.2.2.2
username=KantorA
secret=KantorA
type=friend
nat=yes
context=from-internal
qualify=yes
port=4569

Dan di bagian Register String isikan:

KantorA:KantorA@2.2.2.2:4569

Jangan lupa selalu klik Submit Changes dan Apply Changes baik di IP PBX kantor A dan kantor B.

Pastikan bahwa IP PBX kantor A sudah registrasi ke kantor B dengan melihat console Asterisk masing-masing  (asterisk -vr) dengan perintah: iax2 show peers

Jika berhasil, seharusnya akan tampil seperti :

IP PBX Kantor A

KantorA*CLI> iax2 show peers
 Name/Username       Host                Mask               Port      Status
 KantorA             2.2.2.2     (S)     255.255.255.255    4569      OK (6 ms)
 1 iax2 peers [1 online, 0 offline, 0 unmonitored]


IP PBX Kantor B :

 KantorB*CLI> iax2 show peers
 Name/Username       Host                Mask               Port      Status
 KantorA             1.1.1.1     (S)     255.255.255.255    4569      OK (10 ms)
 1 iax2 peers [1 online, 0 offline, 0 unmonitored]

 

Dari kantor B, IP PBX kantor A akan muncul dengan ip address router NAT-nya. Jika masing-masing server sudah bisa melihat ip address host tujuan, tinggal kita tambahkan saja OutBound Route nya. Sudah tau kan caranya?

Selamat mencoba!

[Tips] Dialplan Untuk Pak Boss

Latar Belakang

Ceritanya, di sebuah instansi, terdapat 5 orang direktur yang masing-masing memiliki sekretaris sendiri. Para direktur ini tidak mau nomer bisa didial langsung dari IVR maupun dari ekstensi selain ekstensi masing-masing sekretarisnya. Jika ada yang mendial nomer ekstensi salah satu direktur, jika bukan dari ekstensi sekretarisnya, maka panggilan akan terlebih dahulu diarahkan ke nomer ekstensi sekretarisnya, baru kemudian bisa ditransfer ke nomer direktur tersebut.

Caranya?

Berikut ini adalah cara yang sudah saya coba di distro Asterisk. Di dalam distro tersebut, secara default semua ekstensi masuk ke context from-internal. Untuk nomer ekstensi sekretaris dan direktur, saya masukkan semua sebagai context tersebut. Selain itu, saya buatkan context khusus supaya tidak bisa melakukan panggilan langsung ke nomer ekstensi direktur. Sebelumnya saya pernah membuat script untuk memblokir panggilan keluar dengan nama context from-internal-restricted yang bisa dibaca di https://www.otakudang.org/?p=300 . Kali ini saya akan mengembangkan context tersebut untuk memblokir panggilan langsung ke ekstensi tertentu dan membelokkan ke ekstensi lain.

Dalam contoh ini, nomer ekstensi direktur (misal) 6666 dan nomer sekretaris adalah (misal) 6015. Edit context from-internal-restricted (yang sudah include dengan script restricted.sh) menjadi seperti berikut:

[from-internal-restricted]
 #exec /var/lib/asterisk/bin/restricted.sh
 exten => 6666,1,NoOp()
 same => n,GotoIf($[${CALLERID(num)} = 6015]?dial1:dial2)
 same => n(dial1),Dial(SIP/6666)
 same => n,Hangup()
 same => n(dial2),Dial(SIP/6105)
 same => n,Hangup()

Arti dari dialplan di atas adalah, jika caller id penelpon adalah 6015 (nomer ekstensi sekretaris), maka rule dial1 yang akan dieksekusi, yaitu mendial SIP/6666 nomer ekstensi direktur). Jika nomer penelpon bukan nomer ekstensi sekretaris (6015), maka rule dial2 yang akan dieksekusi, yaitu mendial SIP/6015 (nomer ekstensi sekretaris).

Selamat mencoba!

Menyambungkan Panggilan Dengan cmd Originate()

Jadi intinya ada request begini:

Operator diminta menyambungkan sebuah ekstensi ke nomer PSTN/GSM. Hanya saja, pada saat penyambungan panggilan, si operator tidak perlu harus menunggu sampe panggilan ke PSTN/GSM tersambung dulu lalu transfer call ke ekstensi. Maunya dial, nomer PSTN/GSM, lalu dial ekstensi yang melakukan request, setelah itu operator mengerjakan yang lain lagi.

Saya ngebayangin akan ada dua input, yaitu nomer PSTN/GSM, lalu nomer ekstensi, yang didial sekaligus. Untuk membedakan mana yang nomer PSTN/GSM dan mana nomer ekstensi, perlu dibuat delimiter, dalam hal ini saya memilih dua buah tanda pagar. Jadi jika ingin melakukan dial dengan hasil di atas, cukup dengan (misal): 08123456789##2002.

Karena kebetulan yang panjang digitnya tetap adalah nomer ekstensi (4 digit), ditambah delimiter dua tanda pagar, sementara nomer PSTN/GSM panjangnya bisa berbeda-beda, maka perlu dibagi seperti di dialplan berikut, lalu masing-masing nomer PSTN/GSM dan nomer ekstensi dimasukkan ke variabel terpisah, untuk bisa dijadikan input perintah Originate().

[stextbox id=”grey” mode=”css” shadow=”false” color=”FFFFFF” bgcolor=”000000″]exten =>_XXXXX.##ZXXX,1,NoOp()
same => n,Set(Tujuan=${EXTEN::-6})
same => n,Set(Ekstensi=${EXTEN:-4:4})
same => n,Originate(DAHDI/g0/${Tujuan},exten,from-internal,${Ekstensi},1)
same => n,Hangup()[/stextbox]

di baris Set(Tujuan=${EXTEN::-6}) jika diterapkan ke 08123456789##2002, akan menghilangkan 6 karakter terakhir, yang sisanya adalah nomer PSTN/GSM 08123456789 (karakter ##2002 dihilangkan), lalu dimasukkan ke variale Tujuan.

Set(Ekstensi=${EXTEN:-4:4}) jika diterapkan ke 08123456789##2002, akan menghitung 4 digit dari belakang, dan menghilangkan selain 4 digit tersebut. Selanjutnya 4 digit ini dimasukkan ke variabel Extensi.

Setelah mendapatkan dua variable Tujuan dan Ekstensi, kita bisa menjalankan perintah Originate() di baris:

same =>n,Originate(DAHDI/g0/${Tujuan},exten,from-internal,${Ekstensi},1)

perintah tersebut jika dinterpolasi akan seperti:

same =>n,Originate(DAHDI/g0/08123456789,exten,from-internal,2002,1)

Untuk contoh manipulasi variable bisa dibaca di:

https://wiki.asterisk.org/wiki/display/AST/Manipulating+Variables+Basics

Tips

Untuk membuat dialplan seperti di atas, ada baiknya jika dibuat context khusus, karena dialplan tersebut sangat rentan fraud jika kita tidak berhati-hati. Misal, kita bisa memasukkan dialplan tersebut ke dalam context yang hanya bisa diakses oleh ekstensi khusus operator, atau bisa dengan menambahkan auth password dialplan.

Berikut ini cuplikan dari buku Asterisk™ : The Definitive Guide mengenai contoh digit manipulation:

More Advanced Digit Manipulation
The ${EXTEN} variable properly has the syntax ${EXTEN:x:y}, where x is the starting
position and y is the number of digits to return. Given the following dial string:
94169671111
we can extract the following digit strings using the ${EXTEN:x:y} construct:
• ${EXTEN:1:3} would contain 416
• ${EXTEN:4:7} would contain 9671111
• ${EXTEN:-4:4} would start four digits from the end and return four digits, giving
us 1111
• ${EXTEN:2:-4} would start two digits in and exclude the last four digits, giving us
16967
• ${EXTEN:-6:-4} would start six digits from the end and exclude the last four digits,
giving us 67
• ${EXTEN:1} would give us everything after the first digit, or 4169671111 (if the
number of digits to return is left blank, it will return the entire remaining string)

This is a very powerful construct, but most of these variations are not very common in
normal use. For the most part, you will be using ${EXTEN} (or perhaps ${EXTEN:1} if
you need to strip off an external access code, such as a prepended 9).

Menambahkan IP Phone CISCO 3911 Ke Elastix IP PBX

Latar belakangnya adalah, seorang teman membeli ip phone Cisco 3911 dengan harga murah di toko online, dengan harapan bisa dipasang di kantor dan tersambung dengan IP PBX Asterisk based. Sayangnya, ip phone tersebut sebenarnya IPT untuk Cisco Unified Communication versi 6 atau 5. Halaman web ui ip phone tersebut hanya mencantumkan status network dan tidak ada entry untuk memasukkan informasi user/password maupun alamat registrar.

0900aecd806a2b07_null_null_null_08_02_07-1

Berikut ini cara menambahkan ekstensi 8047 ke Elastix yang memiliki ip address 172.16.1.16:

  • install tftp-server, tftp dan xinetd di Elastix jika belum ada. Tapi selama ini di instalasi Elastix otomatis sudah menyertakan tftpserver dan xinetd.
  • Upload file BOOT3951.0-0-0-9.zzDSP3951.0-0-0-2.zzSIP3951.8-1-4a.loadsSIP3951.8-1-4a.zz, dan XMLDefault.cnf.xml ke direktori /tftpboot.
  • Edit file sipdefault.cnf di baris berikut lalu upload ke direktori /tftpboot.

 [stextbox id=”grey” shadow=”false” color=”FFFFFF” bgcolor=”000000″]

proxy1_address: 172.16.1.16

outbound_proxy: 172.16.1.16 ;

…[/stextbox]

  • Edit file SEP<macaddress>.cnf.xml di baris berikut dan juga upload ke /tftpboot. Karena mac address ip phone Cisco 3911 adalah 001AA11B512A, maka nama filenya adalah SEP001AA11B512A.cnf.xml.

 [stextbox id=”grey” mode=”css” shadow=”false” color=”FFFFFF” bgcolor=”000000″]

<device xsi:type=”axl:XIPPhone” ctiid=”1566023366″>
<deviceProtocol>SIP</deviceProtocol>

<devicePool>
<dateTimeSetting>
<dateTemplate>D-M-YA</dateTemplate>
<timeZone>Arabian Standard Time</timeZone>
<ntps>
<ntp>
<name>172.16.1.16</name>
<ntpMode>Unicast</ntpMode>
</ntp>
</ntps>
</dateTimeSetting>

<callManagerGroup>
<members>
<member priority=”0″>
<callManager>
<ports>
<ethernetPhonePort>2000</ethernetPhonePort>
<sipPort>5060</sipPort>
<securedSipPort>5061</securedSipPort>
</ports>
<processNodeName>172.16.1.16</processNodeName>
</callManager>
</member>
</members>
</callManagerGroup>
</devicePool>

<sipProfile>
<sipProxies>
<backupProxy></backupProxy>
<backupProxyPort></backupProxyPort>
<emergencyProxy></emergencyProxy>
<emergencyProxyPort></emergencyProxyPort>
<outboundProxy></outboundProxy>
<outboundProxyPort></outboundProxyPort>
<registerWithProxy>true</registerWithProxy>
</sipProxies>

<sipCallFeatures>
<cnfJoinEnabled>true</cnfJoinEnabled>
<callForwardURI>x-cisco-serviceuri-cfwdall</callForwardURI>
<callPickupURI>x-cisco-serviceuri-pickup</callPickupURI>
<callPickupListURI>x-cisco-serviceuri-opickup</callPickupListURI>
<callPickupGroupURI>x-cisco-serviceuri-gpickup</callPickupGroupURI>
<meetMeServiceURI>x-cisco-serviceuri-meetme</meetMeServiceURI>
<abbreviatedDialURI>x-cisco-serviceuri-abbrdial</abbreviatedDialURI>
<rfc2543Hold>false</rfc2543Hold>
<callHoldRingback>2</callHoldRingback>
<localCfwdEnable>true</localCfwdEnable>
<semiAttendedTransfer>true</semiAttendedTransfer>
<anonymousCallBlock>2</anonymousCallBlock>
<callerIdBlocking>2</callerIdBlocking>
<dndControl>0</dndControl>
<remoteCcEnable>true</remoteCcEnable>
</sipCallFeatures>

<sipStack>
<sipInviteRetx>6</sipInviteRetx>
<sipRetx>10</sipRetx>
<timerInviteExpires>180</timerInviteExpires>
<timerRegisterExpires>3600</timerRegisterExpires>
<timerRegisterDelta>5</timerRegisterDelta>
<timerKeepAliveExpires>120</timerKeepAliveExpires>
<timerSubscribeExpires>120</timerSubscribeExpires>
<timerSubscribeDelta>5</timerSubscribeDelta>
<timerT1>500</timerT1>
<timerT2>4000</timerT2>
<maxRedirects>70</maxRedirects>
<remotePartyID>false</remotePartyID>
<userInfo>None</userInfo>
</sipStack>

<autoAnswerTimer>1</autoAnswerTimer>
<autoAnswerAltBehavior>false</autoAnswerAltBehavior>
<autoAnswerOverride>true</autoAnswerOverride>
<transferOnhookEnabled>false</transferOnhookEnabled>
<enableVad>false</enableVad>

<stutterMsgWaiting>1</stutterMsgWaiting>
<callStats>false</callStats>
<silentPeriodBetweenCallWaitingBursts>10</silentPeriodBetweenCallWaitingBursts>
<disableLocalSpeedDialConfig>false</disableLocalSpeedDialConfig>
<startMediaPort>16384</startMediaPort>
<stopMediaPort>32766</stopMediaPort>

<sipLines>
<line button=”1″>
<featureID>9</featureID>
<featureLabel>0011</featureLabel>
<proxy>172.16.1.16</proxy>
<port>5060</port>
<name>8047</name>
<displayName>8047</displayName>
<autoAnswer>
<autoAnswerEnabled>2</autoAnswerEnabled>
</autoAnswer>
<callWaiting>3</callWaiting>
<authName></authName>
<AuthUserName></AuthUserName>
<authPassword></authPassword>
<sharedLine>false</sharedLine>
<messageWaitingLampPolicy>1</messageWaitingLampPolicy>
<messagesNumber>*97</messagesNumber>
<ringSettingIdle>4</ringSettingIdle>
<ringSettingActive>5</ringSettingActive>
<contact>0011</contact>
<forwardCallInfoDisplay>
<callerName>true</callerName>
<callerNumber>false</callerNumber>
<redirectedNumber>false</redirectedNumber>
<dialedNumber>true</dialedNumber>
</forwardCallInfoDisplay>
</line>

</sipLines>

<voipControlPort>5060</voipControlPort>
<dscpForAudio>184</dscpForAudio>
<ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy>

</sipProfile>

<webAccess>1</webAccess>

<loadInformation>SIP3951.8-1-4a</loadInformation>

<capfAuthMode>0</capfAuthMode>
<capfList>
<capf>
<phonePort>3804</phonePort>
</capf>
</capfList>

<certHash></certHash>
<encrConfig>false</encrConfig>

</device>

[/stextbox]

  • Set DHCP server dengan opsi 150 dan diarahkan ke server IP PBX untuk tftpserver.
  • Karena IP phone Cisco 3911 tidak bisa menggunakan username dan password, tambahkan ekstensi 8047 langsung ke sip_custom.conf:

 [stextbox id=”grey” mode=”css” shadow=”false” color=”FFFFFF” bgcolor=”000000″];Cisco IP PHone 3911
[8047]
deny=0.0.0.0/0.0.0.0
secret=
canreinvite=no
context=from-internal
host=dynamic
type=friend
nat=yes
port=5060
qualify=yes
transport=udp
pickupgroup=
dial=SIP/8047
mailbox=8047@device
permit=0.0.0.0/0.0.0.0[/stextbox]

  • Edit extensions_custom.conf di bawah context [from-internal-custom] tambahkan baris:

 [stextbox id=”grey” mode=”css” shadow=”false” color=”FFFFFF” bgcolor=”000000″];cisco 3911
exten => 8047,1,Dial(SIP/8047,30)[/stextbox]

  • Setelah klik Save dan Reload Asterisk, cabut dan nyalakan perangkat ip phone Cisco 3911. Jika berhasil, maka ip phone bisa digunakan untuk menelpon dan juga ditelpon.

photo_2016-11-07_15-59-51

 

Link Download:

Line/Trunk BLF di Grandstream GXP2200/GXP2200EXT & Elastix

Kadang memigrasikan sebuah PBX lama ke Asterisk based IP PBX gampang-gampang susah. Malah yang lebih membuat tidak mudah adalah user yang ingin mempertahankan “kebiasaan” dalam berkomunikasi melalui PBX lama. Salah satunya, yang sedang saya kerjakan adalah request operator untuk memunculkan indikator line/trunk mana yang kosong seperti di telepon keytel lamanya.

panasonic-digital-proprietary-telepon-kx-dt321-7524-765028-1

Sedangkan perangkat penggantinya adalah sebuah ip phone keluaran Grandstream seri GXP2200 + GXP2200EXT yang memiliki tambahan board dengan 20 tombol/lampu BLF (karena layar bisa digeser, bisa memuat 40 tombol cepat ekstensi yang bisa dihubungi).

gxp2200ext2_822f7560f300417004402e44dc5c486a

Akhirnya diputuskan memanfaatkan lampu indikator BLF tersebut untuk keperluan indikator line/trunk. Yang dilakukan adalah sebagai berikut:

Setting Elastix

Dengan asumsi IP PBX yang digunakan adalah Elastix dengan 10 line PSTN , maka edit file extensions_custom.conf melalui web (menu PBX -> Tools -> Asterisk File Editor -> Show Filter) dan tambahkan baris di bawah [from-internal-custom] seperti berikut:

[stextbox id=”grey” shadow=”false” color=”FFFFFF” bgcolor=”000000″]

[from-internal-custom]

exten => LINE01,1,Dial(DAHDI/1)
exten => LINE01,hint,DAHDI/1
exten => LINE02,1,Dial(DAHDI/2)
exten => LINE02,hint,DAHDI/2
exten => LINE03,1,Dial(DAHDI/3)
exten => LINE03,hint,DAHDI/3
exten => LINE04,1,Dial(DAHDI/4)
exten => LINE04,hint,DAHDI/4
exten => LINE05,1,Dial(DAHDI/5)
exten => LINE05,hint,DAHDI/5
exten => LINE06,1,Dial(DAHDI/6)
exten => LINE06,hint,DAHDI/6
exten => LINE07,1,Dial(DAHDI/7)
exten => LINE07,hint,DAHDI/7
exten => LINE08,1,Dial(DAHDI/8)
exten => LINE08,hint,DAHDI/8
exten => LINE09,1,Dial(DAHDI/9)
exten => LINE09,hint,DAHDI/9
exten => LINE10,1,Dial(DAHDI/10)
exten => LINE10,hint,DAHDI/10

[/stextbox]

Klik Save dan Reload Asterisk. Setelah itu, edit sip_custom.conf dari web juga dan tambahkan baris:

[stextbox id=”grey” shadow=”false” color=”FFFFFF” bgcolor=”000000″][LINE01]
subscribecontext=from-internal-custom
[LINE02]
subscribecontext=from-internal-custom
[LINE03]
subscribecontext=from-internal-custom
[LINE04]
subscribecontext=from-internal-custom
[LINE05]
subscribecontext=from-internal-custom
[LINE06]
subscribecontext=from-internal-custom
[LINE07]
subscribecontext=from-internal-custom
[LINE08]
subscribecontext=from-internal-custom
[LINE09]
subscribecontext=from-internal-custom
[LINE10]
subscribecontext=from-internal-custom [/stextbox]

Atau kalau mau lebih ringkes:

[stextbox id=”grey” shadow=”false” color=”FFFFFF” bgcolor=”000000″][trunk-blf](!)

subscribecontext=from-internal-custom

[LINE01](trunk-blf)

[LINE02](trunk-blf)

[LINE03](trunk-blf)

[LINE04](trunk-blf)

[LINE05](trunk-blf)

[LINE06](trunk-blf)

[LINE07](trunk-blf)

[LINE08](trunk-blf)

[LINE09](trunk-blf)

[LINE10](trunk-blf)[/stextbox]

Klik Save dan Reload Asterisk.

Setting Di Grandstream GXP2200

Login di web manajemen GXP2200, pilih tab Advanced Settings -> MPK EXT1 Settings lalu pilih line MPK 1 sampai dengan 10. Untuk pengisian, misal di MPK nomer 10:

Key ModeBusy Lamp Field (BLF)

Account : <nama akun SIP>

Name: <nama line yang akan muncul di layar> LINE10

UserID: <sesuai setting di sip_custom.conf> LINE10

line-pstn-monitoring

Setting yang sama untuk line 1 – 9 seperti pada gambar. Jika berhasil, maka seluruh line/trunk akan terdeteksi di BLF GXP2200EXT.

photo_2016-11-06_00-11-37

Kalau kita melakukan panggilan keluar, maka line yang digunakan akan berwarna merah:

photo_2016-11-06_00-11-43

Selain itu kita juga bisa memilih hendak menelpon melalui line/trunk yang manapun dengan menekan salah satu tombol BLF line/trunk tersebut. Dan yang lebih lucu lagi, kita bisa menyusun ulang tombol-tombol BLF sesuai permintaan. Misal, LINE01 di baris BLF di atas dimulai dari sebelah kanan, lalu LINE02 di kiri, LINE03 ke kanan dst seperti zigzag. Request dari user, agar supaya semua BLF terkumpul di sebelah kiri semua. Di halaman MPK EXT1 Settings di atas, kita bisa mengurutkan dengan menekan tombol up down dengan mudah.

photo_2016-11-06_00-17-51

Selamat mencoba!

[Tips] Menghilangkan Warning “chan_iax2.c: update_registry: Restricting registration for peer ‘XXXX’ to 60 seconds”

Pernah menemui log seperti ini:

[2016-09-27 11:31:14] NOTICE[2284]: chan_iax2.c:8974 update_registry: Restricting registration for peer ‘XXXX’ to 60 seconds (requested 30 0)
[2016-09-27 11:32:09] NOTICE[2284]: chan_iax2.c:8974 update_registry: Restricting registration for peer ‘XXXX’ to 60 seconds (requested 30 0)
[2016-09-27 11:33:04] NOTICE[2278]: chan_iax2.c:8974 update_registry: Restricting registration for peer ‘XXXX’ to 60 seconds (requested 30 0)
[2016-09-27 11:33:59] NOTICE[2280]: chan_iax2.c:8974 update_registry: Restricting registration for peer ‘XXXX’ to 60 seconds (requested 30 0)
[2016-09-27 11:34:54] NOTICE[2278]: chan_iax2.c:8974 update_registry: Restricting registration for peer ‘XXXX’ to 60 seconds (requested 30 0)

contohnya kalau kita memiliki virtual FAX di Asterisk kita dengan IAX2 protocol, biasanya sering muncul log demikian. Sebenarnya ini ndak menimbulkan masalah, tapi cukup untuk memenuhi log, apalagi jika verbosity-nya tinggi. Untuk mengatasi warning tersebut,edit file /etc/iaxmodem/iaxmodem-cfg.ttyIAX1 dan ganti baris:

refresh         300

Menjadi:

refresh         60

Lalu reload iaxmodem dengan perintah:  service iaxmodem restart.

Selamat mencoba.

[tips] CallPickup

Pernah menemui kejadian seperti berikut?

Pada saat jam istirahat, atau beberapa kolega sedang ada rapat/pertemuan bulanan, kita menemui banyak meja kantor yang kosong. Beberapa meja terdapat ip phone yang kadang lupa diset DND (Do Not Disturb), sehingga ketika ada panggilan masuk, telepon akan tetap berdering. Lalu kebetulan kita sedang berada di ruangan yang sama, hanya saja letak pesawat telepon yang berdering agak jauh dari meja kita, sehingga harus berjalan dulu menuju ke meja tersebut untuk mengangkat telepon (bagi kantor yang menganggap semua panggilan masuk cukup penting), untuk sekedar memberitahukan orang yang dituju belum datang atau sedang ada keperluan ke luar.Itu sebabnya diperlukan call pickup. Ada dua jenis call pickup, yaitu call pickup biasa dan direct call pickup.

Call pickup biasa bisa diakses dengan menekan tombol *8 tanpa harus mengetahui nomer ekstensi mana yang sedang berdering, selama nomer ekstensi tersebut berada di dalam satu group call pickup.

Direct call pickup bisa diakses dengan menekan **<nomer ekstensi>, apabila kita sudah tau nomer ekstensi yang sedang berdering, atau jika ada lebih dari satu nomer ekstensi yang berdering saat kantor kosong, dan kita ingin memilih menerima telpon dari salah satu nomer yang berdering. Misal nomer ekstensi lain yang sedang berdering adalah 101, untuk melakukan direct call pickup, cukup menekan **101.

Supaya kita bisa melakukan call pickup, pertama harus ditentukan terlebih dahulu ekstensi-ekstensi mana saja yang boleh dipickup, kemudian jadikan satu group. Hal ini untuk menghindari kejadian bila kita hendak call pickup sebuah nomer ekstensi yang sedang berdering dengan kode *8, tapi tanpa sepengetahuan kita, ternyata telepon di kantor CEO juga sedang berdering, sehingga bisa alih-alih pickup ekstensi yang ada di dekat kita, malah ekstensi CEO yang kita pickup, atau departemen lain.

Masuk ke menu PBX -> PBX Configuration -> Extensions lalu pilih ekstensi yang hendak dijadikan satu group. Pada halaman tersebut di bagian callgroup dan pickupgroup masukkan nomer group, misal 1. Klik Submit setelah itu, lalu ulangi dengan ekstensi lain yang hendak dijadikan satu group. Setelah selesai klik Apply Config.

Pastikan setting berjalan dengan melakukan test.