Have a question that's not listed here? Get in contact with us! Either submit a ticket under the "Support" category, or contact us by phone.

QuestBlue strives to be the best support in the industry, to ensure that you never have to worry about your system on top of your business. We also want to provide the tools for you to succeed at managing your system, as well! Below are some common questions and issues with PBXs and networks, that you can reference as needed.

Secure Your PBX

When it comes to securing your PBX, QuestBlue, by default, uses a whitelist-type firewall. This method provides very strong control and security over who has access to your system, but regardless of what you use, it is important that it stays active at all times. Securing root access with a password is not enough. If you need assistance setting up your firewall, you can speak with a QuestBlue representative about setting up a time and date for a remote session so that we may assist.

Regardless of what route you go to protect a server, there are some IPs which are necessary to allow access to in order to keep your PBX funcitoning normally:

  • Access from QuestBlue's SBC HA-NODE-IP Address: sbc.questblue.com
  • Access for UDP to pass to your system for ports 10000-64000 from any IP (not a port forward, but just do not block it when your PBX requests it)
  • Access from your LAN if your PBX is local in your office network or your WAN IP if your PBX is hosted in a data center or offsite in another location
  • Access for any remote workers, support personnel, vendors, or any other party that will need regular access from an outside network

Other than these, you should reject the rest. The system should be dark to all other forms of traffic.

In your Asterisk deployment you will want to secure your PBX in the file /etc/sysconfig/iptables. We've provided a sample introductory iptables file below:

Barebones iptables file:

-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p udp --match multiport --dports 10000:64000 -j ACCEPT
#Port 5060 - SBC QuestBlue
#Remote Phones
#Port 3306 - Mysql from Known Sources
-A INPUT -p tcp -m tcp -s --dport 3306 -j ACCEPT
#Reject The Rest
-A INPUT -p tcp -m tcp -j REJECT --reject-with tcp-reset
-A INPUT -p udp -m udp -j REJECT

(Note: in the section labeled #Remote Phones you'll want to delete the -A INPUT -s -j ACCEPT line and fill that section with any IPs that require remote access. Do not include these lines in parenthesis in your iptables file.)

If you use the command nano /etc/sysconfig/iptables from the command line, you will find the above file. You can make a copy of the file ahead of time just in case you want to fall back to the original before editing and saving changes. The above recommended firewall settings on your Asterisk system will help prevent unwanted visitors to your system, as it makes the server look like it doesn't exist to anyone on the internet, unless they are in the approved IP list.

Once you are done editing these changes, save the file. CTRL-X will exit the file in Nano. Hit y to save your changes, and Enter to keep the same filename.

Then, run service iptables restart from the command line to restart the iptables service and apply the new firewall rules. You should recieve green OKs across the board. If you get any red Failed messages, then your firewall is not currently running! Make sure you fix whatever errors the command line notifies you of and restart the firewall, otherwise your system is not protected!

Port Scanning and Security

Port scanning is when an external client that doesn't have access attempts to identify open ports on a server or network. This is a popular means of breaching security, as it provides hackers convenient information about vulnerabilities in your system, if not an outright means of access.

You can identify when port scanning is occurring if you start receiving multiple random calls at all hours of the day, usually with a caller ID of 100, 1000, or another extension that doesn't exist on your PBX. These are often referred to as ghost calls or phantom calls.

In order to prevent port scanning, ensure your router firewall has the following settings:

  • Allow port 5060 access from the IP address of the PBX and sbc.questblue.com only
  • Never allow ANY port 5060, UDP or TCP, from ANY/ANY
  • Always allow 10000-64000 UDP from ANY/ANY

Follow these guidelines and you should lock down your network from port scanning.

SIP Trunk Setup on FreePBX

QuestBlue's Support Department has compiled documentation on how to get started building your SIP Trunks on FreePBX:

For FreePBX users with Version 11 please click the below button to view the SIP Trunk documentation:

Download FreePBX 11 SIP Trunk Setup (PDF)

For FreePBX users with Version 12+ please click the below button to view the SIP Trunk documentation

Download FreePBX 12+ SIP Trunk Setup (PDF)

Creating a New SIP Trunk Through the User Portal

QuestBlue Systems offers some of the fastest creation times on SIP Trunks in the industry. Our SIP Trunks do not have any cost associated with them. You can have as many SIP Trunks as you have PBXs to support in your account. Usage costs do apply though, please note.

Once you are a registered user, you will find that your SIP Trunk can be added and activated in a couple of simple steps.
Simply fill in the form (pictured) to create your new SIP Trunk. All it asks for is a name and IP address. The trunk name must be alphanumeric with no spaces or special characters. The IP address is the public IP/WAN IP of your PBX. Press the Create SIP Account button and your trunk is now active in real-time with no delays or approval process.

QuestBlue SIP Trunks also require no registration. We use IP authentication, which is quite simple if you follow some basic rules of networking:

  • Port forward port 5060 in your router/firewall to the internal IP of your PBX. If you have an advanced router/firewall you can restrict this port forward from sbc.questblue.com
  • Allow or port forward 10000-20000 UDP in your routher/firewall to the internal IP of your PBX. This should be allowed from any outside IP to be able to pass the audio of the RTP stream
  • To further protect your system please create and use the firewall sample we created for you in the Secure Your PBX section above.

A screenshot of the SIP Trunk creation screen in the user portal

Disabling SIP ALG

What is SIP ALG?

SIP ALG stands for SIP Application Layer Gateway, and is often found on most commercial routers on the market today. It was initially designed to avoid problems caused by the router's firewall settings by examining VOIP packets, which control voice calls, and making changes to them if necessary. Although it was designed to help the end-user, it actually modifies VOIP traffic in an unpredictable way causing packets to be corrupt and indecipherable. More often than not the SIP ALG is enabled by default, and may not always be a setting that the end-user has access to. A call to your Internet Service Provider may be required to verify the SIP ALG setting on your home or office router. Common issues with SIP ALG include:

  • Phones dropping out of and back into registration
  • Incoming calls failing
  • One-way audio
  • Inability to transfer calls
  • Inability to place a call on hold or in park
  • Inability to pick up a call on hold or in park
  • Improper routing of calls
How to Disable SIP ALG

When disabling SIP ALG, keep in mind that the process will ultimately depend on your specific device. It is always good practice to begin by reading through the manufacturer's handbook for your device. You can also do a quick internet search for "disable SIP ALG on (my device)," supplying your model. And remember, you can always reach out to your Internet Service Provider directly. They will be the most familiar with the settings of your specific device and have the most up-to-date information.

Guide to Getting Started with iFax

Not sure how to get started now that you're signed up? We've created a guide that will help you through the process of understanding iFax. You'll be using it in no time!

iFax Instructions (PDF)

Available API Methods

API version

Current API version - 2.1.4 Released - February 7, 2018 
If your current API was installed prior to February 7, 2018  we recommend to upgrade your API methods


Getting Started

  • Send API access request;
  • On getting API access approval (you will receve Email notification) copy your Private Access Key on API request page
  • Download API files and example, unzip it;
  • Open config.inc.php file with your desired editor and configure it with your customer.questblue.com Login name, Password and Private Access Key. 
    Set connection type - curl or socket depending on your server the configuration (curl by default);
  • Open index.php file see available API options;
  • Upload API files into your server (which runs on IP address you specified when you requested access to the API);
  • Enjoy!


Available Methods

testApiConnect() - Test API connection to make sure that login, password, API key is OK

myIP() - Show your current IP address


SIP Trunking

createSipTrunk(trunk, IPaddress) - Create new SIP Trunk
    trunk (string) - desired name, must consist of alphanumeric characters and digits
    IPaddress - IP address of the host that will make queries

listSipTrunks(trunk) - List Registered SIP Trunks
    trunk - trunkname to get properties.
      Available options:
        empty (blank value) - List All Registered Trunks Property
        string - List property for entered trunk only
        array - List property for trunks in array (Example: listSipTrunks( array('trunkName1', 'trunlName2') )   ).

sipFailoverIp(trunk, action, props) - Set SIP trunk failover IP on exceeding X offline calls within Y minutes
    trunk - trunkname to set failover IP address to
    action - Set / Unset failover IP address. Values: enable / disable. 
the method called with argument disable will always return success if ever no failover IP is set
    props (failover_ip_address, call_number, offlline time) - Failover IP address property. Should be assigned if action argument is set to enable only.
            failover_ip_address - IP address to set as failover. Should be unique IP in the system
            call_number - offline inbound offline calls number (made within offline time). Value: from 1 to 100
            offline_time - Time range (in minutes) to receive call_number offline calls   

updateSipIp(trunk IPaddress') -  Update SIP trunk with new IP address
    trunk - trunkname to get properties. 
    IPaddress - IP address to route to SIP trunk

routeIp2Sip(trunk, IPaddress) - Add (route) additional IP address to SIP trunk 
    trunk (string) - trunkname 
    IPaddress (string, valid IP address) - IP address to route

listIp2Sip(trunk) - List of Routed IP addreses
    trunk (string) - trunkname 

unrouteIp2Sip(trunk, IPaddress) - delete (unroute) additional IP address from SIP trunk
    trunk (string) - trunkname 
    IPaddress (string, valid IP address) - IP address to unroute

deleteSipTrunk(trunk) - Delete SIP Trunk
    trunk - trunkname to delete

callHistory(trunk, period, type, show_empty) - pull CDRs records
    trunk (string | array) - trunkname,  default value 'all' to show all trunks
    period - period to generate CDRs.
      Available options:
           0 (default) - current hour,
           1 - Previous hour,
           2 - Today,
           3- Yesterday,
          array - start time / end time. Example: array('2015-06-21 21:00:00', '2015-06-26 22:00:00')
    type - call type: inbound or outbound.
      Available options:
           0 (default) - All directions,
           1 - Inbound calls,
           2 - Outbound calls
    show_empty - Whether to show unsuccessful CDRs
            no (default) - Show only successful calls
            yes - Show all calls

We recommend to use this feature with caution. To not cause API slowdown your CDR report with number of records more than 2000 will generate "too many records" error. To avoid the error set  optimal date range to generate reports. "Optimal" reports depend on call numbers made per day.

Example. If the number of calls per day is 500 then you can run the API method with date range 24 hours. It will pull all daily CDRs in a same time.  If  the number of calls per day is 6000 run the method with date range 3-4 hour it reduce numbers of CDRs reported by API.



listStates() -  List US States Codes. Is used in method listRateCenters() Rate Centers list

listRateCenters(stateCode, tier) -  Rate Centers List
    stateCode - US states 2 chars code. Example: MA
    tier - DID tier. Available values: 1(default)1b2

listAvailableLocalDIDs(rateCenter, stateCode, npa, tier) - Available Local DIDs List
    rateCenter - name of rate center. Example: ADAMS
    stateCode - US states 2 chars code. Example: MA
    npa - (3 chars, numeric). North American Numbering Plan area codes
    Should be used in two mode:
        Sending pare: rateCenter stateCode. Example: listAvailableLocalDIDs('ADAMS', 'MA')
        Sending NPA code. Example: listAvailableLocalDIDs(null, null, 303)
  tier - DID tier. Available values: 1(default)1b2.  If tier value is set to 2 then DID list without SMS supporting will be provided

listAvailableTfDIDs(tier) - Available Toll Free DIDs List
    tier - allowed values 1, 1b

orderDID(did, tier, note) - Order Local or Toll Free DID
    did - DID (Direct Inward Dialing) to Order. (see listAvailableLocalDIDs and listAvailableTfDIDs methods)
    tier - DID tier. Available values: 11b2.  If tier value is set to 2 then DID without SMS supporting will be ordered
    note - Optional DID note. Up to 12 chars allowed

setDidNote(did, note) - Add / Remove DID note
    did - Existing active DID to add/remove note to
    note - Optional DID note. Up to 12 chars allowed

removeDID(did) - Delete Local or Toll Free DID
    did - Ordered DID

propertyDid(did) - Ordered Did(s) Property
      Available options:
        empty (blank value) - List All Registered DID's Property
        string - List property for entered DID only
        array - List property for DIDs  in array (Example: propertyDID( array('1231231231', '4564564564') )   )

setDidFaiover(did, props) - Set(unset) call route forwarding on exceeding X offline calls within Y minutes
    did - DID to set/unset failover calls to
    props (failover_did, call_number, offlline time) - Failover properties, set NULL to unset failover call route
            failover_did -US based number to set failover. Value: Ten digit only
            failover_num - offline inbound offline calls number (made within offline time). Value: from 1 to 100
            failover_time - Time range (in minutes) to receive failover_num offline calls. Possible values: 2, 3, 5, 7, 10, 15, 20, 30, 60 

forwardDID(did, did2forward) - Forward incoming call to some US based DID 
    did - active DID to set forwarding
    did2forward - Valid  US based DID (10 digits length)

routeDID(did, trunk) - Route / unroute  DID to SIP account
    did - Ordered DID
    trunk - trunkname to get properties
      Available trunk value options:
        empty (blank value) - DID is going to be unrouted
        string - DID is going to be route to trunk

orderCnam(did) - Order CNAM Service
    did - Ordered DID

removeCnam(did) - Remove (unsubscribe) CNAM service
    did - Ordered DID

orderE911(params) - Order E911 Service
    params - Array of Values:
        did - DID to order e911 service
        name - Customer Name (first and last)
        address - Customer Address
        unit_type - Unit type, Optional. Allowed only values (one of): unit, suite, apt
        unitnumber - Unit Number. Optional. Works if Unit Type is set
        city - City
        state - State (2 chars)
        zip - ZIP code

removeE911(did) - Remove (unsubscribe) E911 service
    did - Ordered DID

setLidb(did, cname) - Set the CallerID for a DID
    did - did to set caller ID
    cname - Caller ID to set. Alphanumeric, up 15 chars


International DIDs

listInternationalCountry() - Get country list where international DIDs ordering is available

listInternationalCity(country_code) - Get city list where International DID ordering is available
    country_code - Two chars country code

orderInternationalDid(country_code, city) - Order International DID
    country_code - Two chars country code
    city - City name to order DID in

listInternationalDids() - List ordered International DIDs

setInternationalDidForward(international_did, did_to_forward) - Set / Remove call forwarding
    international_did - Ordered active international DID
    did_to_forward -  Ordered active local DID to forward calls to. Leave blank to remove forwarding

removeInternationalDid(international_did) - Remove International DID
    international_did - Ordered international DID

listInternationalCountry() - Retrieve coutry list where international rates are available

internationalRates(country_id) - Retrieve all operators international rates for selected country
    country_id - Country ID to get rate

internationalRates2() - Retrieve international rates for non 011 countries


Local number portability

checkPortLnp(port_number) - Check Number to port  availability for LNP request
  port_number - Number to Port to check

orderLnp(params, files) - Order LNP (Local Number Portability)
    params - Array of Values:
        port_number - Number to Port. Length 10 chars (digits). Required.
        route_to - Optional. SIP trunk name to route the DID to. For voice DIDs only.
        partial_port - Partial Port. Values: 0 - No, 1 - Yes. Required.
        extra_services - Additional Remaining Services. Text. Optional.
        location - Location. Values: Business, Residential. Required.
        company - Company name. Required id location is set to Business
        wireless_no - Wireless Number. Values: 0 - No, 1 - Yes. Required.
        lidb_list - LIDB/Directory Listings. Values: 0 - No, 1 - Yes. Required.
        provider_name - Service Provider Name. Max. 255 chars. Required.
        account_no - Service Provider Account Number. Max. 100 chars. Required.
        user_name - End User Name On Statement. Max. 100 chars. Required.
        authorize_contact - Authorized Contact. Max. 100 chars. Required.
        contact_title - Contact Title. Values: Employee, President, CEO/Owner. Required.
        street_no - Street Number. Max. 50 chars. Required.
        dir_prefix - DIR Prefix. Max. 10 chars. Values example: None, N, NE, E, SE, S, SW, W, NW. Optional.
        street_name - Street Name. Max. 100 chars. Required.
        dir_suffix - DIR Suffix. Max. 10 chars. Values example: None, N, NE, E, SE, S, SW, W, NW. Optional.
        service_unit - Service Suit/Unit. Max. 100 chars. Required. PO Boxes are not accepted!
        city - Service City. Max. 100 chars. Required.
        states - Service State. Optional.
        zipcode - Service ZipCode. Max. 20 chars. Required.
        billing_telephone_no - Billing Telephone Number. Max. 20 chars. Required.
    file - Array of Values:
        bill_file - Phone bill. Value: full path to GIF, JPG,PNG or PDF file. Size up to 2Mb. Required

statusLnp(port_number) - get LNP request status and FOC Received date
 port_number - Number to Port.
       Response options
                awaiting signature
                awaiting documentation
                pending approval
                foc received
            FOC received date
                yyyy-mm-dd OR none

deleteLnp(port_number) - remove LNP request. Only LNP with following statuses allowed to remove: awaiting signature, awaiting documentation, pending approval, processing
    port_number - Number to Port. 


Fax Methods

vFax product will not be supported after the conversion to iFax.pro

faxListStates() - List US States Codes. Is used in method faxListRatecenters() Rate Centers list

faxListRatecenters(stateCode) - iFax Rate Centers List
        stateCode - US states 2 chars code. Example: MA

faxListAvailableDids(rateCenter, stateCode) - Available iFax DIDs - Local or Toll Free
                          Method returns Toll Free DIDs if params not added
        rateCenter - Name of rate center. Example: ADAMS
        stateCode - US states 2 chars code. Example: MA

faxOrderDid(did) - Order and Assign new DID to iFax account(Local or Toll free )
        did - iFax DID

setFaxDidNote(did, note) - Add / Remove Fax DID note
    did - Existing active Fax DID to add/remove note to
    note - Optional Fax DID note. Up to 12 chars allowed

faxListDids() - List iFax assigned DIDs  

faxRemoveDid(did) -  Remove iFAx DID 
        did - bFax DID to Remove

faxAuthEmail(did, auth_email, forw_email) - Set iFax Authorized Email - send outbound / forward inbound faxes
Note: Email(s) in the wrong format will be omitted
    did - active iFAx DID
    auth_email - Email(s) allowed to send outbound iFax. Multiple Email are allowed, commas separated
    forw_email - Email(s) to forward inboud iFax. Multiple Email are allowed, commas separated

faxSend(didfrom, didto, name, filePath) -  Send iFax
        didfrom - Ordered active vFax DID
        didto - Recipient Fax number
        name - Recipient name (optional)
        filePath - Path to file to send.
        Allowed files:
            jpg - JPG Image;
            pdf - Adobe PDF;
            ps - Adobe PostScript;
            tif, tiff - TIFF; 
            doc, docx - MS Word file;
            xls, csv - Excel or CSV file;
            htm, html - HTML page;
            txt - Plain Text.

faxHistory(did, period, type) -  Retrieve iFax history
    did (string | array) - your iFax DID,  default value 'all' to show all DIDs
    period - period to generate CDRs.
      Available options:
           0 (default) - Today, 
           1 - Yesterday, 
          array - start time / end time. Example: array('2015-06-21 21:00:00', '2015-06-26 23:59:59')
    type - fax type: inbound or outbound.
      Available options:
           0 (default) - All directions, 
           1 - Inbound faxes, 
           2 - Outbound faxes

faxDownload(fax_id) - Retrieve iFax file base64 encoded
    fax_id(int) - iFax ID (obtained by faxHistory method)

faxCreateUser(name, email, login, password, did) - Create iFax  customer
        name - Customer real name. Up to 48 chars
        email - Fax customer Email address
        login - Login name to access account. Up to 24 chars, alpha-numeric
        password - Customer password
        did - iFax DID to send/receive faxes

faxDeleteUser(login) - Delete iFax customer
        login - Login name to delete

faxForwardEmail(did, email) - Depreciated. Assign Email to forward Fax
        did - Existing vFax DID
        email - Email address to forward fax. Multiple Email are allowed, commas separated

SMS Methods
Note: SMS serice available for Tier 1 and 1b!

smsManageDid(did, action) - Enable / disable DID for SMS service
        did - Ordered DID to enable (disable)
        action - Enable / disable

smsManageEmailForward(did, email) - Assign or remove Email to forward SMS
        did - DID to add (remove) SMS forwarding (must be active to add)
        email - Email to forward SMS messages. Set empty value to remove forwarding

smsSend(didfrom, didto, msg) - Send SMS message
        didfrom - Ordered active did to send message from. Must be SMS enabled
        didto - Phone number to send SMS message (10 digits)
        msg - Message to send


Dedicated and Virtual servers

serverAdd(type, note) - Order virtual or dedicated server
        type - Server type. Values: dedicated, virtual
        note - Server note (comment). Optional

serverList(type) - Ordered servers list.
        type - Server type. Values: dedicated, virtual

serverRemove(id) - Remove dedicated or virtual server
        id - server ID

serverIpAdd(id, ip_address) - Add IP address to the list allowed to login (SSH) IPs
    id - server ID (see serverLIst() method)
    ip_address - IP address to add. Must be valid IP

serverIpList(id) - List of IP allowed to access the server via SSH
    id - server ID (see serverLIst() method)

serverIpRemove(id, ip_address) - Remove IP address from list allowed IP to login
    id - server ID (see serverLIst() method)
    ip_address - Existing IP address to remove. 


QuBe - Dedicated and Virtual servers

serverQubeAdd(type, note) - Order virtual or dedicated QuBe server
        type - QuBe server type. Values: dedicated, virtual
        note - QuBe server note (comment). Optional

serverQubeList(type) - Ordered QuBe servers list.
        type - QuBe server type. Values: dedicated, virtual

serverQubeRemove(id) - Remove QuBe dedicated or virtual server
        id - QuBe server ID

serverQubeIpAdd(id, ip_address, note) - Add IP address to the list allowed to login (SSH) IPs
    id - QuBe server ID (see serverLIst() method)
    ip_address - IP address to add. Must be valid IP
    note - Comment or note. Optional

serverQubeIpList(id) - List of IP allowed to access the QuBe server via SSH
    id - QuBe server ID (see serverLIst() method)

serverQubeIpRemove(id, ip_address) - Remove IP address from list allowed IP to login
    id - QuBe server ID (see serverQubeLIst() method)
    ip_address - Existing IP address to remove. 



accountGetBalance - Get your account balance

accountSetRefill(autorefill) - Enable or Disable autorefill balance
    autorefill - Values: enable / disable

accountRefillConfig(minimum_balance, reload_amount) - Modify refill settings 
    minimum_balance - Minimal account balance. Possible values: 5, 25, 30, 35, 40, 45, 50
    reload_amount - Autorefill balance amount. Possible values:  25, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500

accountRefill(amount) - Refill account balance
    amount - Amount to refill balance. Minimal value $10

accountRates() - Retrieve account rates and fees


Support Tickets

supportLastTicketsList() - List last 20 tickets

supportReadTicket(ticket_id) - Get support ticket (and all it posts)
    ticket_id - ticket ID

supportCreatePost(message, subject, ticket_id, close_ticket, files) - post message to new ticket or to existing one
    message - Message to post. Required
    subject - message subject. Required for new ticket. On posting to existing ticket ignored.
    ticket_id - Ticket to add post to. Required on adding post to existing ticket. For new ticket set value to 0 (zero)
    files - Path to file(s) to upload. Should be array. Example: $files = array('/full/path/to/bill.pdf', /full/path/to/other.doc');  


 API Responses

            - optional Object (depend on query)

            - code
            - message


Contact Information

Business Hours (Eastern Time)

  • Monday-Friday: 9 AM to 5:30 PM
  • Saturday/Sunday: Closed

QuestBlue on Social Media