{"id":267653,"date":"2026-10-26T09:51:19","date_gmt":"2026-10-26T09:51:19","guid":{"rendered":"https:\/\/ded9.com\/?p=267653"},"modified":"2026-10-26T09:51:19","modified_gmt":"2026-10-26T09:51:19","slug":"how-to-install-issabel-and-connect-a-phone-number-a-complete-walkthrough","status":"publish","type":"post","link":"https:\/\/ded9.com\/tr\/how-to-install-issabel-and-connect-a-phone-number-a-complete-walkthrough\/","title":{"rendered":"How to Install Issabel and Connect a Phone Number: A Complete Walkthrough"},"content":{"rendered":"<p dir=\"ltr\">Issabel is an open-source unified communications platform built on top of Asterisk. It bundles the operating system, the <a href=\"https:\/\/www.asterisk.org\/\" target=\"_blank\" rel=\"noopener\">Asterisk<\/a> engine, and a web administration interface into a single installable image, which means you get a working PBX without compiling anything by hand.<\/p>\n<p dir=\"ltr\">This guide covers the full path from a blank server to a working phone line: installing Issabel, creating an extension, connecting a <a href=\"https:\/\/ded9.com\/voip-technology-and-its-comparison-with-traditional-telecommunication-services\/\">VoIP<\/a> provider over a SIP trunk, routing calls in both directions, and locking the server down afterward.<\/p>\n<p dir=\"ltr\">All phone numbers, IP addresses, credentials, and domains in this guide are examples. Replace them with the real values from your own provider.<\/p>\n<hr \/>\n<h2 dir=\"ltr\">Before You Start<\/h2>\n<h3 dir=\"ltr\">What you need<\/h3>\n<ul dir=\"ltr\">\n<li><strong>A server or virtual machine.<\/strong> Two CPU cores, 4 GB of RAM, and 40 GB of disk space handle a small office comfortably. Issabel installs over the whole disk, so the machine must be dedicated to it.<\/li>\n<li><strong>A static public IP address.<\/strong> Most VoIP providers let you restrict your account to a single IP, and that protection only works if the address does not change.<\/li>\n<li><strong>Console access.<\/strong> If you are on a VPS, make sure you can reach the provider&#8217;s console before you start. A firewall mistake can lock you out of SSH, and the console is the way back in.<\/li>\n<li><strong>A SIP account from a VoIP provider.<\/strong> You need a SIP login, a password, and the provider&#8217;s SIP server address. You can set this up after installing, but having it ready saves a round trip.<\/li>\n<\/ul>\n<h3 dir=\"ltr\">A note on hosting location<\/h3>\n<p dir=\"ltr\">If you plan to buy a phone number in a specific country, check that country&#8217;s regulations before you commit. Some regulators restrict outbound calling on geographic numbers. In the United Kingdom, for example, Ofcom&#8217;s anti-fraud rules block calls to UK numbers from a UK number unless the subscriber is physically in the UK. Your provider&#8217;s support team can confirm what applies to the number you want.<\/p>\n<hr \/>\n<h2 dir=\"ltr\">Part 1: Installing Issabel<\/h2>\n<h3 dir=\"ltr\">Step 1 \u2014 Download the ISO<\/h3>\n<p dir=\"ltr\">Go to the Issabel website and download the current stable ISO image. The file is roughly 1 GB.<\/p>\n<p dir=\"ltr\">If you are installing on a physical machine, write the ISO to a USB drive with a tool such as Rufus or BalenaEtcher. If you are installing on a virtual machine, upload the ISO to your hypervisor&#8217;s image store and attach it to the VM&#8217;s virtual CD drive.<\/p>\n<h3 dir=\"ltr\">Step 2 \u2014 Boot the installer<\/h3>\n<p dir=\"ltr\">Boot the machine from the ISO. The first screen offers several options. Choose the standard installation entry and press Enter.<\/p>\n<p dir=\"ltr\">The installer then asks for your language and keyboard layout. These settings affect the server console only, not the web interface, so the defaults are fine unless you have a specific reason to change them.<\/p>\n<h3 dir=\"ltr\">Step 3 \u2014 Set the time zone<\/h3>\n<p dir=\"ltr\">Pick the time zone your business actually operates in, not the time zone of the data center.<\/p>\n<p dir=\"ltr\">This matters more than it looks. The time zone drives the timestamps in your call records and, more importantly, it drives Time Conditions \u2014 the rules that decide what happens to calls inside and outside business hours. Getting it wrong here means every scheduled rule you build later fires at the wrong time.<\/p>\n<h3 dir=\"ltr\">Step 4 \u2014 Configure the disk<\/h3>\n<p dir=\"ltr\">Accept the default partitioning scheme unless you have specific requirements.<\/p>\n<p dir=\"ltr\">Issabel erases the entire disk. The installer warns you before it does, but it is worth repeating: anything already on that disk is gone.<\/p>\n<h3 dir=\"ltr\">Step 5 \u2014 Set the root password<\/h3>\n<p dir=\"ltr\">Choose a strong password for the <code dir=\"ltr\">root<\/code> account. This is the account you will use for SSH and for console access, so store it somewhere safe.<\/p>\n<p dir=\"ltr\">The installer now copies packages to disk. Depending on your hardware, this takes between 10 and 30 minutes. When it finishes, the machine reboots.<\/p>\n<h3 dir=\"ltr\">Step 6 \u2014 Complete the first boot<\/h3>\n<p dir=\"ltr\">On the first boot, Issabel asks for two more passwords:<\/p>\n<ol dir=\"ltr\">\n<li><strong>The MySQL root password<\/strong>, used by the database that stores your configuration.<\/li>\n<li><strong>The Issabel admin password<\/strong>, used to log into the web interface.<\/li>\n<\/ol>\n<p dir=\"ltr\">Use different passwords for these and for the system <code dir=\"ltr\">root<\/code> account.<\/p>\n<p dir=\"ltr\">The console then prints the address of your web interface, something like:<\/p>\n<div dir=\"ltr\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div>\n<pre><code>https:\/\/203.0.113.45<\/code><\/pre>\n<\/div>\n<\/div>\n<h3 dir=\"ltr\">Step 7 \u2014 Log into the web interface<\/h3>\n<p dir=\"ltr\">Open that address in a browser. Your browser will warn you about the certificate \u2014 Issabel generates a self-signed one during installation \u2014 so accept the warning and continue.<\/p>\n<p dir=\"ltr\">Log in with the username <code dir=\"ltr\">admin<\/code> and the Issabel admin password you set during first boot.<\/p>\n<p dir=\"ltr\">You now have a working PBX. It just has no phones and no outside line yet.<\/p>\n<hr \/>\n<h2 dir=\"ltr\">Part 2: Creating an Extension<\/h2>\n<p dir=\"ltr\">An extension is an internal line. Each desk phone, softphone, or mobile app registers to one.<\/p>\n<ol dir=\"ltr\">\n<li>Go to <strong>PBX \u2192 PBX Configuration \u2192 Extensions<\/strong>.<\/li>\n<li>Choose <strong>Generic SIP Device<\/strong> and click <strong>Submit<\/strong>.<\/li>\n<li>Fill in the three fields that matter:<\/li>\n<\/ol>\n<div dir=\"ltr\">\n<table>\n<thead>\n<tr>\n<th scope=\"col\">Field<\/th>\n<th scope=\"col\">Example value<\/th>\n<th scope=\"col\">What it does<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>User Extension<\/td>\n<td><code dir=\"ltr\">1001<\/code><\/td>\n<td>The number colleagues dial internally<\/td>\n<\/tr>\n<tr>\n<td>Display Name<\/td>\n<td><code dir=\"ltr\">Reception<\/code><\/td>\n<td>The name shown on internal calls<\/td>\n<\/tr>\n<tr>\n<td>secret<\/td>\n<td>A strong password<\/td>\n<td>The password the phone uses to register<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<ol dir=\"ltr\" start=\"4\">\n<li>Click <strong>Submit<\/strong>, then click the red <strong>Apply Config<\/strong> button at the top of the page.<\/li>\n<\/ol>\n<p dir=\"ltr\">Nothing you change in Issabel takes effect until you click <strong>Apply Config<\/strong>. If a change does not seem to work, this is the first thing to check.<\/p>\n<p dir=\"ltr\">Now configure a softphone \u2014 Zoiper, Linphone, and MicroSIP all work \u2014 with these settings:<\/p>\n<ul dir=\"ltr\">\n<li><strong>Domain or server:<\/strong> your server&#8217;s IP, for example <code dir=\"ltr\">203.0.113.45<\/code><\/li>\n<li><strong>Username:<\/strong> <code dir=\"ltr\">1001<\/code><\/li>\n<li><strong>Password:<\/strong> the secret you just set<\/li>\n<\/ul>\n<p dir=\"ltr\">Once the softphone shows as registered, confirm it from the server console:<\/p>\n<div dir=\"ltr\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div>bash<\/div>\n<div>\n<pre><code class=\"language-bash\">asterisk -rx \"sip show peers\"<\/code><\/pre>\n<\/div>\n<\/div>\n<p dir=\"ltr\">A line showing the extension <code dir=\"ltr\">1001<\/code> with a status of <code dir=\"ltr\">OK<\/code> and a latency figure in milliseconds means the phone is connected.<\/p>\n<hr \/>\n<h2 dir=\"ltr\">Part 3: Connecting a Phone Number<\/h2>\n<p dir=\"ltr\">A phone number lives with your VoIP provider. A <strong>SIP trunk<\/strong> is the connection that carries calls between that provider and your PBX.<\/p>\n<p dir=\"ltr\">There are two ways to authenticate a trunk:<\/p>\n<ul dir=\"ltr\">\n<li><strong>Registration<\/strong> \u2014 your PBX logs in with a username and password. This works from behind NAT and is the simpler option.<\/li>\n<li><strong>IP authentication<\/strong> \u2014 the provider accepts calls only from your server&#8217;s IP address, with no login. This requires a static IP and is usually reserved for higher-volume setups.<\/li>\n<\/ul>\n<p dir=\"ltr\">This guide uses registration.<\/p>\n<h3 dir=\"ltr\">Step 1 \u2014 Collect your provider credentials<\/h3>\n<p dir=\"ltr\">From your provider&#8217;s control panel, find the SIP account details. You need three things:<\/p>\n<div dir=\"ltr\">\n<table>\n<thead>\n<tr>\n<th scope=\"col\">Detail<\/th>\n<th scope=\"col\">Example value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>SIP server<\/td>\n<td><code dir=\"ltr\">sip.example-voip.net<\/code><\/td>\n<\/tr>\n<tr>\n<td>SIP login<\/td>\n<td><code dir=\"ltr\">512345<\/code><\/td>\n<\/tr>\n<tr>\n<td>SIP password<\/td>\n<td>(from your provider&#8217;s panel)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p dir=\"ltr\">While you are in the panel, do two more things:<\/p>\n<ol dir=\"ltr\">\n<li><strong>Attach your phone number to the SIP account.<\/strong> Most providers call this &#8220;connect number to SIP&#8221; or &#8220;call routing&#8221;. Without it, inbound calls never reach your PBX.<\/li>\n<li><strong>Restrict the account to your server&#8217;s IP.<\/strong> Look for a setting named &#8220;IP restriction&#8221; or &#8220;allowed IP&#8221; and enter your server address, for example <code dir=\"ltr\">203.0.113.45<\/code>. If your SIP password ever leaks, this single setting is what stops a stranger from running up an international call bill on your account.<\/li>\n<\/ol>\n<h3 dir=\"ltr\">Step 2 \u2014 Create the trunk in Issabel<\/h3>\n<p dir=\"ltr\">Go to <strong>PBX \u2192 PBX Configuration \u2192 Trunks<\/strong> and click <strong>Add SIP Trunk<\/strong>.<\/p>\n<p dir=\"ltr\">\n<p dir=\"ltr\"><strong>General Settings:<\/strong><\/p>\n<div dir=\"ltr\">\n<table>\n<thead>\n<tr>\n<th scope=\"col\">Field<\/th>\n<th scope=\"col\">Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Trunk Name<\/td>\n<td><code dir=\"ltr\">Provider-UK<\/code><\/td>\n<\/tr>\n<tr>\n<td>Outbound CallerID<\/td>\n<td><code dir=\"ltr\">442079460958<\/code><\/td>\n<\/tr>\n<tr>\n<td>Maximum Channels<\/td>\n<td><code dir=\"ltr\">3<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p dir=\"ltr\">Set <strong>Maximum Channels<\/strong> to the number of simultaneous outbound calls your provider allows. This caps your exposure if the trunk is ever compromised.<\/p>\n<p dir=\"ltr\">Leave the <strong>Dialed Number Manipulation Rules<\/strong> section empty. Number formatting is handled in the outbound route instead, and doing it in both places transforms the number twice.<\/p>\n<p dir=\"ltr\"><strong>Outgoing Settings:<\/strong><\/p>\n<p dir=\"ltr\">Set the inner <strong>Trunk Name<\/strong> to <code dir=\"ltr\">provider<\/code>, then clear the <strong>PEER Details<\/strong> box completely and paste this in its place:<\/p>\n<div dir=\"ltr\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div>\n<pre><code>host=sip.example-voip.net\r\ntype=friend\r\ninsecure=invite,port\r\nfromdomain=sip.example-voip.net\r\ndefaultuser=512345\r\nfromuser=512345\r\nsecret=YOUR_SIP_PASSWORD\r\ndisallow=all\r\nallow=alaw&amp;ulaw\r\ndtmfmode=auto\r\nqualify=400\r\ndirectmedia=no\r\nnat=force_rport,comedia\r\ncontext=from-trunk<\/code><\/pre>\n<\/div>\n<\/div>\n<p dir=\"ltr\">Replace <code dir=\"ltr\">YOUR_SIP_PASSWORD<\/code> with your actual password, and the host, user, and domain values with your provider&#8217;s.<\/p>\n<p dir=\"ltr\">Two lines deserve a note. <code dir=\"ltr\">nat=force_rport,comedia<\/code> tells Asterisk to send audio back to the address the packets actually came from, which is what makes audio work through NAT. <code dir=\"ltr\">directmedia=no<\/code> keeps the audio stream flowing through your PBX rather than directly between endpoints, which is almost always what you want on a trunk.<\/p>\n<p dir=\"ltr\"><strong>Incoming Settings:<\/strong><\/p>\n<p dir=\"ltr\">Leave <strong>USER Context<\/strong> empty, and clear the <strong>USER Details<\/strong> box so that it is completely empty. With registration-based authentication, the peer definition above handles both directions.<\/p>\n<p dir=\"ltr\"><strong>Registration:<\/strong><\/p>\n<p dir=\"ltr\">In the <strong>Register String<\/strong> field, enter:<\/p>\n<div dir=\"ltr\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div>\n<pre><code>512345:YOUR_SIP_PASSWORD@sip.example-voip.net\/512345<\/code><\/pre>\n<\/div>\n<\/div>\n<p dir=\"ltr\">The value after the final slash is what your provider sends as the called number on incoming calls. You will need it again in a moment.<\/p>\n<p dir=\"ltr\">Click <strong>Submit Changes<\/strong>, then <strong>Apply Config<\/strong>.<\/p>\n<h3 dir=\"ltr\">Step 3 \u2014 Verify the registration<\/h3>\n<p dir=\"ltr\">On the server console, run:<\/p>\n<div dir=\"ltr\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div>bash<\/div>\n<div>\n<pre><code class=\"language-bash\">asterisk -rx \"sip show registry\"<\/code><\/pre>\n<\/div>\n<\/div>\n<p dir=\"ltr\">You should see your provider&#8217;s host with a state of <code dir=\"ltr\">Registered<\/code>:<\/p>\n<div dir=\"ltr\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div>\n<pre><code>Host                        Username   Refresh  State\r\nsip.example-voip.net:5060   512345         105  Registered<\/code><\/pre>\n<\/div>\n<\/div>\n<p dir=\"ltr\">If the trunk does not appear at all, the configuration never reached Asterisk. Reload and check again:<\/p>\n<div dir=\"ltr\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div>bash<\/div>\n<div>\n<pre><code class=\"language-bash\">asterisk -rx \"sip reload\"\r\nasterisk -rx \"sip show registry\"<\/code><\/pre>\n<\/div>\n<\/div>\n<p dir=\"ltr\">If it still does not appear, go back to the trunk in the web interface and confirm the Register String was saved, then click <strong>Apply Config<\/strong> again.<\/p>\n<p dir=\"ltr\"><img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter size-full wp-image-267654\" src=\"https:\/\/ded9.com\/wp-content\/uploads\/2026\/10\/1.png\" alt=\"Go to PBX \u2192 PBX Configuration \u2192 Trunks and click Add SIP Trunk.\" width=\"521\" height=\"777\" srcset=\"https:\/\/ded9.com\/wp-content\/uploads\/2026\/10\/1.png 521w, https:\/\/ded9.com\/wp-content\/uploads\/2026\/10\/1-201x300.png 201w\" sizes=\"(max-width: 521px) 100vw, 521px\" \/><\/p>\n<hr \/>\n<h2 dir=\"ltr\">Part 4: Routing Calls<\/h2>\n<p dir=\"ltr\">A registered trunk carries calls, but Issabel still needs to be told where incoming calls should land and which calls should leave over which line.<\/p>\n<h3 dir=\"ltr\">Inbound route<\/h3>\n<ol dir=\"ltr\">\n<li>Go to <strong>PBX \u2192 PBX Configuration \u2192 Inbound Routes<\/strong> and click <strong>Add Incoming Route<\/strong>.<\/li>\n<li>Fill in:<\/li>\n<\/ol>\n<div dir=\"ltr\">\n<table>\n<thead>\n<tr>\n<th scope=\"col\">Field<\/th>\n<th scope=\"col\">Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Description<\/td>\n<td><code dir=\"ltr\">Provider-UK<\/code><\/td>\n<\/tr>\n<tr>\n<td>DID Number<\/td>\n<td><code dir=\"ltr\">512345<\/code><\/td>\n<\/tr>\n<tr>\n<td>CallerID Number<\/td>\n<td>(leave empty)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p dir=\"ltr\">The <strong>DID Number<\/strong> must match the number your provider actually sends, which is usually the SIP login rather than the public phone number. If you are not sure, leave the field empty at first so the route catches everything, place a test call, and watch the console to see what arrives:<\/p>\n<div dir=\"ltr\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div>bash<\/div>\n<div>\n<pre><code class=\"language-bash\">asterisk -rvvv<\/code><\/pre>\n<\/div>\n<\/div>\n<p dir=\"ltr\">Then come back and set the field precisely.<\/p>\n<ol dir=\"ltr\" start=\"3\">\n<li>Scroll to <strong>Set Destination<\/strong>, choose <strong>Extensions<\/strong>, and select an extension <code dir=\"ltr\">1001<\/code>.<\/li>\n<li>Click <strong>Submit<\/strong>, then <strong>Apply Config<\/strong>.<\/li>\n<\/ol>\n<h3 dir=\"ltr\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-267657\" src=\"https:\/\/ded9.com\/wp-content\/uploads\/2026\/10\/2.png\" alt=\"Part 4: Routing Calls\" width=\"625\" height=\"757\" srcset=\"https:\/\/ded9.com\/wp-content\/uploads\/2026\/10\/2.png 625w, https:\/\/ded9.com\/wp-content\/uploads\/2026\/10\/2-248x300.png 248w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/h3>\n<h3 dir=\"ltr\">Outbound route<\/h3>\n<p dir=\"ltr\">An outbound route matches dialed numbers against a pattern and sends them out over a chosen trunk.<\/p>\n<ol dir=\"ltr\">\n<li>Go to <strong>PBX \u2192 PBX Configuration \u2192 Outbound Routes<\/strong> and click <strong>Add Route<\/strong>.<\/li>\n<li>Fill in:<\/li>\n<\/ol>\n<div dir=\"ltr\">\n<table>\n<thead>\n<tr>\n<th scope=\"col\">Field<\/th>\n<th scope=\"col\">Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Route Name<\/td>\n<td><code dir=\"ltr\">International<\/code><\/td>\n<\/tr>\n<tr>\n<td>Route Position<\/td>\n<td>First in the list<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<ol dir=\"ltr\" start=\"3\">\n<li>In <strong>Dial Patterns that will use this Route<\/strong>, enter:<\/li>\n<\/ol>\n<div dir=\"ltr\">\n<table>\n<thead>\n<tr>\n<th scope=\"col\">prepend<\/th>\n<th scope=\"col\">prefix<\/th>\n<th scope=\"col\">match pattern<\/th>\n<th scope=\"col\">CallerID<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>(empty)<\/td>\n<td><code dir=\"ltr\">9<\/code><\/td>\n<td><code dir=\"ltr\">00.<\/code><\/td>\n<td>(empty)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<ol dir=\"ltr\" start=\"4\">\n<li>Under <strong>Trunk Sequence for Matched Routes<\/strong>, select <code dir=\"ltr\">Provider-UK<\/code> in position <code dir=\"ltr\">0<\/code>.<\/li>\n<li>Leave <strong>Dial patterns wizards<\/strong> set to <code dir=\"ltr\">(pick one)<\/code> \u2014 those presets add North American dial patterns that will conflict with your own.<\/li>\n<li>Click <strong>Submit Changes<\/strong>, then <strong>Apply Config<\/strong>.<\/li>\n<\/ol>\n<p dir=\"ltr\">Here is how that pattern works. The <strong>prefix<\/strong> is stripped before the call leaves; the <strong>match pattern<\/strong> is what remains. The trailing dot means &#8220;any number of further digits&#8221;. So a user dials <code dir=\"ltr\">9<\/code> to select this line, then <code dir=\"ltr\">00<\/code> and the international number, and the provider receives the number without the leading <code dir=\"ltr\">9<\/code>.<\/p>\n<p dir=\"ltr\">To call <code dir=\"ltr\">+1 555 0100<\/code> in the United States, a user dials:<\/p>\n<div dir=\"ltr\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div>\n<pre><code>9001555 0100<\/code><\/pre>\n<\/div>\n<\/div>\n<h3 dir=\"ltr\">Route order<\/h3>\n<p dir=\"ltr\">Outbound routes are evaluated from the top down, and the first matching pattern wins. If an existing route uses a catch-all pattern of <code dir=\"ltr\">.<\/code>, any route that needs to take precedence must sit above it.<\/p>\n<p dir=\"ltr\">In the Outbound Routes list, confirm that your new route appears above any broader route. This is also how a PBX with two providers splits traffic: specific patterns at the top for the cheaper line, a catch-all at the bottom for everything else.<\/p>\n<p dir=\"ltr\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-267660\" src=\"https:\/\/ded9.com\/wp-content\/uploads\/2026\/10\/3.png\" alt=\"Outbound route\" width=\"615\" height=\"732\" srcset=\"https:\/\/ded9.com\/wp-content\/uploads\/2026\/10\/3.png 615w, https:\/\/ded9.com\/wp-content\/uploads\/2026\/10\/3-252x300.png 252w\" sizes=\"(max-width: 615px) 100vw, 615px\" \/><\/p>\n<hr \/>\n<h2 dir=\"ltr\">Part 5: Testing<\/h2>\n<p dir=\"ltr\">Test each direction separately so that a failure points to one thing.<\/p>\n<p dir=\"ltr\"><strong>Inbound:<\/strong> call your phone number from a mobile. Extension <code dir=\"ltr\">1001<\/code> should ring. Answer it and confirm audio works in both directions.<\/p>\n<p dir=\"ltr\"><strong>Outbound:<\/strong> from extension <code dir=\"ltr\">1001<\/code>, dial an external number using your prefix, for example <code dir=\"ltr\">9001555 0100<\/code>. Confirm the call connects, that audio works both ways, and that the person you called sees your number \u2014 <code dir=\"ltr\">+44 20 7946 0958<\/code> in our example \u2014 rather than &#8220;unknown&#8221; or a provider default.<\/p>\n<p dir=\"ltr\">If a call connects but one side hears nothing, the problem is almost always NAT or a blocked RTP range. Check that <code dir=\"ltr\">nat=force_rport,comedia<\/code> is present in your trunk&#8217;s PEER Details, and that UDP ports 10000\u201320000 are open in the firewall.<\/p>\n<p dir=\"ltr\">To watch a call as it happens, run <code dir=\"ltr\">asterisk -rvvv<\/code> on the console before dialing. Type <code dir=\"ltr\">exit<\/code> to leave that view.<\/p>\n<hr \/>\n<h2 dir=\"ltr\">Part 6: Securing the Server<\/h2>\n<p dir=\"ltr\">A PBX reachable from the internet is a target. Compromised trunks get used for international fraud, and the bill lands on you. Spend twenty minutes on these four items.<\/p>\n<h3 dir=\"ltr\">Restrict the trunk by IP<\/h3>\n<p dir=\"ltr\">Covered above, but worth repeating because it is the single most effective protection: set the IP restriction in your provider&#8217;s panel so that only your server can use the SIP account.<\/p>\n<h3 dir=\"ltr\">Move SSH off port 22<\/h3>\n<p dir=\"ltr\">Edit <code dir=\"ltr\">\/etc\/ssh\/sshd_config<\/code> and change the port:<\/p>\n<div dir=\"ltr\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div>\n<pre><code>Port 7220<\/code><\/pre>\n<\/div>\n<\/div>\n<p dir=\"ltr\">Restart the service:<\/p>\n<div dir=\"ltr\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div>bash<\/div>\n<div>\n<pre><code class=\"language-bash\">systemctl restart sshd<\/code><\/pre>\n<\/div>\n<\/div>\n<p dir=\"ltr\">Keep your current session open and test the new port from a second terminal before closing anything. If the new port does not work, your open session is the way back in.<\/p>\n<h3 dir=\"ltr\">Restrict the web interface and SSH to known addresses<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-267663\" src=\"https:\/\/ded9.com\/wp-content\/uploads\/2026\/10\/4.png\" alt=\"Restrict the web interface and SSH to known addresses\" width=\"267\" height=\"280\" \/><\/h3>\n<p dir=\"ltr\">In <strong>Security \u2192 Firewall \u2192 Firewall Rules<\/strong>, create an ACCEPT rule for each address you administer from. For an office at <code dir=\"ltr\">198.51.100.20<\/code>, create three rules with that address as the source: one for HTTP, one for HTTPS, and one for your SSH port.<\/p>\n<p dir=\"ltr\">Then deactivate the general rules \u2014 the ones with a source address of <code dir=\"ltr\">0.0.0.0\/0<\/code> \u2014 for HTTP, HTTPS, and SSH.<\/p>\n<p dir=\"ltr\">Two things matter here:<\/p>\n<ol dir=\"ltr\">\n<li><strong>Order.<\/strong> Firewall rules are evaluated top to bottom, and a general DROP rule sits near the bottom of the chain. Your ACCEPT rules must be above it, or they are never reached.<\/li>\n<li><strong>Loopback.<\/strong> Make sure a rule allowing traffic on the <code dir=\"ltr\">Loopback<\/code> interface sits near the top. Issabel&#8217;s web interface talks to Asterisk over an internal connection, and if the firewall blocks it, <strong>Apply Config<\/strong> fails with a manager connection error even though everything else looks fine.<\/li>\n<\/ol>\n<p dir=\"ltr\">After applying, test immediately: open the panel from an allowed address, then from a different network such as a mobile connection. The first should work and the second should not.<\/p>\n<h3 dir=\"ltr\">Cap your spending<\/h3>\n<p dir=\"ltr\">In your provider&#8217;s panel, set a balance limit or spending cap, and disable calling to any destination you do not need. Prepaid billing is useful here too, since the most you can lose is the balance on the account.<\/p>\n<h2 dir=\"ltr\">Troubleshooting<\/h2>\n<p dir=\"ltr\"><strong>Apply Config fails with a manager connection error.<\/strong> Issabel cannot reach Asterisk over the internal connection. Check that the firewall allows loopback traffic and that the rule sits above any general DROP rule.<\/p>\n<p dir=\"ltr\"><strong>The trunk never registers.<\/strong> Confirm the Register String saved correctly, check the password against the provider&#8217;s panel, and verify that the IP restriction on the provider&#8217;s side matches your server&#8217;s actual public address. Run <code dir=\"ltr\">curl -s ifconfig.me<\/code> to see that address.<\/p>\n<p dir=\"ltr\"><strong>Inbound calls do not arrive.<\/strong> Check that the number is attached to the SIP account in the provider&#8217;s panel, and that the DID Number in your inbound route matches what the provider actually sends. Watch a test call with <code dir=\"ltr\">asterisk -rvvv<\/code> to see the real value.<\/p>\n<p dir=\"ltr\"><strong>One-way or no audio.<\/strong> Almost always NAT. Confirm <code dir=\"ltr\">nat=force_rport,comedia<\/code> in the trunk, and open UDP 10000\u201320000 in the firewall.<\/p>\n<p dir=\"ltr\"><strong>Outbound calls are rejected.<\/strong> Check whether the destination is permitted on your account, whether your balance is sufficient, and whether a regulatory restriction applies to that destination.<\/p>\n<h2 dir=\"ltr\">FAQ<\/h2>\n<div id=\"rank-math-rich-snippet-wrapper\"><div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-1\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Can I install Issabel alongside other software on the same server?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>No. Issabel ships as a full operating system image and takes over the whole disk. Use a dedicated machine or a dedicated virtual machine.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-2\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Do I need a static IP address?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Not strictly, but you should have one. IP-based trunk restriction \u2014 the best protection against trunk fraud \u2014 only works with a static address.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-3\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">How many simultaneous calls can one phone number handle?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>That depends on your provider, not on Issabel. Entry-level numbers often allow two or three concurrent calls, with more available at extra cost. Set Maximum Channels on the trunk to match.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-4\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Can I connect more than one provider?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Yes. Create a separate trunk for each, then use outbound routes to send each destination over the line you prefer. Specific patterns at the top, a catch-all at the bottom.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-5\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">What is the difference between Issabel and FreePBX?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>FreePBX is a web interface for Asterisk. Issabel is a complete distribution that includes the operating system, Asterisk, and a web interface whose PBX section is built on FreePBX. That is why FreePBX configuration guides generally work on Issabel, with the menu paths adjusted.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-6\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Why are my call records showing the wrong time?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>The server time zone is wrong. Check it with timedatectl, set it with timedatectl set-timezone Region\/City, and reboot so every service picks up the change.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Issabel is an open-source unified communications platform built on top of Asterisk. It bundles the operating system, the Asterisk engine, and a web administration interface into a single installable image, which means you get a working PBX without compiling anything by hand. This guide covers the full path from a blank server to a working [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":267666,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[92],"tags":[6748],"class_list":["post-267653","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-internet","tag-voip"],"acf":[],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/ded9.com\/tr\/wp-json\/wp\/v2\/posts\/267653","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ded9.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ded9.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ded9.com\/tr\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/ded9.com\/tr\/wp-json\/wp\/v2\/comments?post=267653"}],"version-history":[{"count":1,"href":"https:\/\/ded9.com\/tr\/wp-json\/wp\/v2\/posts\/267653\/revisions"}],"predecessor-version":[{"id":267669,"href":"https:\/\/ded9.com\/tr\/wp-json\/wp\/v2\/posts\/267653\/revisions\/267669"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ded9.com\/tr\/wp-json\/wp\/v2\/media\/267666"}],"wp:attachment":[{"href":"https:\/\/ded9.com\/tr\/wp-json\/wp\/v2\/media?parent=267653"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ded9.com\/tr\/wp-json\/wp\/v2\/categories?post=267653"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ded9.com\/tr\/wp-json\/wp\/v2\/tags?post=267653"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}