Asterisk DUNDi Call Routing

How to use DUNDi to distribute calls among the DUNDi Peering Network

General DUNDi Information

Quote from

"DUNDi™ is a peer to peer system for locating Internet gateways to telephony services. Unlike traditional centralized services (such as the remarkably simple and concise ENUM standard), DUNDi is fully distributed with no centralized authority whatsoever.

DUNDi is not itself a Voice over IP signalling or media protocol. Instead, it publishes routes which are in turn accessed via industry standard protocols such as IAX™, SIP and H.323."

DUNDi is available from CVS-HEAD from 10/18/2004 on.

To use the DUNDi E164 web of trust you must execute the General Peering Agreement with another peer.

See Peering Basics for information on setting up peers.

White Papers

Asterisk Setup

(Based on configurations in the configs directory and documents published by Brian K. West aka bkw_)

To setup Asterisk for DUNDi there are a few steps.

  • cd /var/lib/asterisk/keys
  • astgenkey -n [hostname] (Do not put a password on the keys unless you want to init keys every time you start asterisk.)
  • cd /etc/asterisk
  • Edit extensions.conf and add the following: (Please change the appriopriate strings to match your config.)

; List canonical entries here
;exten => 12564286000,1,Macro(std-exten,6000,IAX2/foo)
;exten => _125642860XX,1,Dial(IAX2/otherbox/${EXTEN:7})

; If you are an ITSP or Reseller, list your customers here.
;exten => _12564286000,1,Dial(SIP/customer1)
;exten => _12564286001,1,Dial(IAX2/customer2)

; If you are freely delivering calls to the PSTN, list them here
;exten => _1256428XXXX,1,Dial(Zap/g2/${EXTEN:7}) ; Expose all of 256-428
;exten => _1256325XXXX,1,Dial(Zap/g2/${EXTEN:7}) ; Ditto for 256-325

; Context to put your dundi IAX2 or SIP user in for
; full access
include => dundi-e164-canonical
include => dundi-e164-customers
include => dundi-e164-via-pstn

; Just a wrapper for the switch
switch => DUNDi/e164

; Locally to lookup, try looking for a local E.164 solution
; then try DUNDi if we don't have one.
include => dundi-e164-local
include => dundi-e164-switch

; DUNDi can also be implemented as a Macro instead of using
; the Local channel driver.
; ARG1 is the extension to Dial
; Usage: exten => _91NXXNXXXXXX,1,Macro(dundi-e164,${EXTEN:1})
; This would lookup the number using DUNDi.
exten => s,1,Goto(${ARG1},1)
include => dundi-e164-lookup

  • Edit dundi.conf and add the following: (Please change the appriopriate strings to match your config.)

; DUNDi configuration file
; The "general" section contains general parameters relating
; to the operation of the dundi client and server.
; The first part should be your complete contact information
; should someone else in your peer group need to contact you.
;department=Your Department
;organization=Your Company, Inc.
;locality=Your City
; Specify bind address and port number. Default is
; 4520
; Our entity identifier (Should generally be the MAC address of the
; machine it's running on. Defaults to the first eth address, but you
; can override it here, as long as you set it to the MAC of *something*
; you own!)
; Define the max depth in which to search the DUNDi system (also max # of
; seconds to wait for a reply)
; If we don't get ACK to our DPREQUEST within 2000ms, and autokill is set
; to yes, then we cancel the whole thing (that's enough time for one
; retransmission only). This is used to keep things from stalling for a long
; time for a host that is not available, but would be ill advised for bad
; connections. In addition to 'yes' or 'no' you can also specify a number
; of milliseconds. See 'qualify' for individual peers to turn on for just
; a specific peer.
; pbx_dundi creates a rotating key called "secret", under the family
; 'secretpath'. The default family is dundi (resulting in
; the key being held at dundi/secret).

; The "mappings" section maps DUNDi contexts
; to contexts on the local asterisk system. Remember
; that numbers that are made available under the e164
; DUNDi context are regulated by the DUNDi General Peering
; Agreement (GPA) if you are a member of the DUNDi E.164
; Peering System.
; dundi_context => local_context,weight,tech,dest[,options]]
; dundi_context is the name of the context being requested
; within the DUNDi request
; local_context is the name of the context on the local system
; in which numbers can be looked up for which responses shall be given.
; tech is the technology to use (IAX, SIP, H323)
; dest is the destination to supply for reaching that number. Note
; that the variable ${NUMBER} shall be replaced by the number being
; requested.
; Further options may include:
; nounsolicited: No unsolicited calls of any type permitted via this
; route
; nocomunsolicit: No commercial unsolicited calls permitted via
; this route
; residential: This number is known to be a residence
; commercial: This number is known to be a business
; mobile: This number is known to be a mobile phone
; nocomunsolicit: No commercial unsolicited calls permitted via
; this route
; nopartial: Do not search for partial matches
; There *must* exist an entry in mappings for DUNDi to respond
; to any request, although it may be empty.
;e164 => dundi-e164-canonical,0,IAX2,dundi:${SECRET}@${IPADDR}/${NUMBER},nounsolicited,nocomunsolicit,nopartial
;e164 => dundi-e164-customers,100,IAX2,dundi:${SECRET}@${IPADDR}/${NUMBER},nounsolicited,nocomunsolicit,nopartial

;e164 => dundi-e164-via-pstn,400,IAX2,dundi:${SECRET}@${IPADDR}/${NUMBER},nounsolicited,nocomunsolicit,nopartial

;digexten => default,0,IAX2,guest@lappy/${NUMBER}
;asdf =>

; The remaining sections represent the peers
; that we fundamentally trust. The section name
; represents the name and optionally at a specific
; DUNDi context if you want the trust to be established
; for only a specific DUNDi context.
; inkey - What key they will be authenticating to us with
; outkey - What key we use to authenticate to them
; host - What their host is
; order - What search order to use. May be 'primary', 'secondary',
; 'tertiary' or 'quartiary'. In large systems, it is beneficial
; to only query one up-stream host in order to maximize caching
; value. Adding one with primary and one with secondary gives you
; redundancy without sacraficing performance.
; include - Includes this peer when searching a particular context
; for lookup (set "all" to perform all lookups with that
; host.
; noinclude - Disincludes this peer when searching a particular context
; for lookup (set "all" to perform no lookups with that
; host.
; permit - Permits this peer to search a given DUNDi context on
; the local system. Set "all" to permit this host to
; lookup all contexts.
; deny - Denies this peer to search a given DUNDi context on
; the local system. Set "all" to deny this host to
; lookup all contexts.
; model - inbound, outbound, or symmetric for whether we receive
; requests only, transmit requests only, or do both.
; The '*' peer is special and matches an unspecified entity

; Sample Primary e164 DUNDi peer
model = symmetric
host =
inkey = digium
outkey = misery
include = e164
permit = e164
qualify = yes

; Sample Secondary e164 DUNDi peer
;model = symmetric
;host =
;inkey = misery
;outkey = ourkey
;include = e164
;permit = e164
;qualify = yes
;order = secondary


Created by: rwjblue, Last modification: Thu 23 of Aug, 2007 (14:37 UTC) by mmb74
Please update this page with new information, just login and click on the "Edit" or "Discussion" tab. Get a free login here: Register Thanks! - Find us on Google+