Enrutamiento de tráfico a números +999
Para operadores y propietarios de servidores SIP: cómo entregar llamadas y mensajes a números +999 y cómo te llegan a ti. Estándares abiertos, sin contrato ni registro. Cada número +999 pertenece a una persona verificada mediante Persona.
Números +999 para tu centralita
La forma más sencilla de conseguir números para empleados y departamentos: gratis, sin operador ni contrato, en un minuto en este sitio web. Diriges el número a tu centralita en la cuenta y, a partir de ahí, es un número entrante normal, salvo que las llamadas a él no cuestan nada.
- Un número para cada uno. Hasta tres números por persona: para departamentos, una recepción, proyectos. El número pertenece a una persona verificada y no se puede falsificar.
- Llamadas directas. Los usuarios de Armor y otras centralitas encuentran tu número en ENUM y llaman directamente a tu centralita, sin intermediarios ni cobro por minuto.
- Llama tú a +999. Los usuarios de tu centralita marcan cualquier +999 y la centralita busca la dirección en ENUM. Más abajo hay ejemplos para Asterisk y FreeSWITCH.
Coge un número
En la aplicación Armor y, después, inicia sesión en tu cuenta en armor.tel.
Diríjelo a tu centralita
En la cuenta, junto al número: «Llamadas» → «a mi centralita» → el nombre del servidor, por ejemplo pbx.example.com.
Recibe en la centralita
La llamada llega a sip:+999…@pbx.example.com. El puerto sale del registro SRV _sip._udp; si no existe, es el 5060.
Enrutamiento: ENUM
Cada número emitido tiene un registro NAPTR en la zona e164.armor.tel. El nombre son los dígitos del número en orden inverso, separados por puntos. La zona está firmada con DNSSEC. Comprueba las firmas: de lo contrario, un registro falsificado significa un número secuestrado.
- Consulta para +999 730 905 13 05: 5.0.3.1.5.0.9.0.3.7.9.9.9.e164.armor.tel IN NAPTR
- Respuesta: 10 10 "u" "E2U+sip" "!^.*$!sip:+9997309051305@sip.armor.tel!" .
- NXDOMAIN significa que el número no está emitido o ha sido liberado. No envíes esas llamadas: el servidor responde 404.
- Caché. Los registros tienen un TTL de 5 minutos. Un número liberado no se vuelve a emitir durante 90 días.
Señalización: SIP
- La dirección sale de NAPTR; el servidor y el puerto se resuelven según la RFC 3263 (SRV _sips._tcp, _sip._tcp, _sip._udp).
- Se recomienda TLS: puerto 5061 (SRV _sips._tcp), un certificado de Let's Encrypt para sip.armor.tel, SNI obligatorio, sin certificado de cliente. Sin cifrar: UDP y TCP en el puerto 5080.
- Sin registro ni contraseña. Cualquier servidor que encuentre el número en ENUM puede llamar a un +999.
- From se pasa al usuario tal cual y no se comprueba. Pon el número de quien llama en E.164 con un «+».
- Límites: 10 INVITE por segundo desde una misma dirección y 30 llamadas simultáneas por número. Por encima: 503 con Retry-After.
- Retransmisiones según la RFC 3261; sobre TCP/TLS mantén la conexión abierta, con keep-alives CRLF.
Medios: RTP
- Sin transcodificación. El servidor hace de proxy del RTP y no toca los códecs del SDP: se negocian con el dispositivo del usuario. Los dispositivos admiten Opus, G.722, G.711 A/µ.
- SRTP y ZRTP pasan sin cambios: a=zrtp-hash y los paquetes ZRTP llegan al usuario. Si tu lado admite ZRTP, la llamada va cifrada entre tú y el usuario.
- DTMF: RFC 4733 (telephone-event) en RTP.
- No se admiten: early media ni late offer. Un INVITE sin SDP recibe 488.
Cómo va una llamada
100 Trying y luego 180
El servidor despierta con un push los dispositivos dormidos del usuario y los hace sonar todos a la vez. El primer 180 puede tardar unos segundos.
200 OK del primero que contesta
Los demás dispositivos dejan de sonar. Los medios pasan por el servidor de Armor; las direcciones están en el SDP de la respuesta.
Errores
404: el número no está emitido. 480: ningún dispositivo está en línea. 486: ocupado o rechazado. 503: límite alcanzado.
Mensajes
SIP MESSAGE a la misma dirección sip:+999…@sip.armor.tel, con un cuerpo text/plain o message/cpim. El servidor lo entrega a todos los dispositivos del usuario, y a los que están sin conexión cuando se conectan; la respuesta es 202. La respuesta del usuario va a la dirección de tu From, así que debe ser accesible desde internet.
Tráfico de +999 hacia ti
El servidor de Armor no hace llamadas salientes a otras redes. Un usuario de +999 llega a tus números a través de una cuenta contigo: añade tu línea a la aplicación y llama desde tu número. Para ti es un abonado SIP normal.
- Qué necesitamos de ti: acceso SIP (dirección, usuario, contraseña, TLS), desvío a una dirección SIP y, si quieres, SMS mediante SIP MESSAGE.
- Para configurar en dos toques, da a tus usuarios un código QR con los ajustes en el formato de aprovisionamiento remoto de Linphone. La aplicación lo lee.
- Catálogo de operadores. Podemos añadirte a la lista de operadores de la aplicación: el usuario te elige e inicia sesión en tu cuenta mediante OAuth, y la aplicación obtiene los ajustes por sí sola. Necesitas un inicio de sesión OAuth y un endpoint de ajustes.
- Un número +999 verificado en From al llamarte no está disponible. Si lo necesitas, escríbenos.
Ejemplo: Asterisk
PJSIP, Asterisk 18 o posterior. Las llamadas entrantes a tus números +999 se aceptan sin registro, pero solo para los números indicados. Las llamadas salientes a +999 van a la dirección de ENUM.
; pjsip.conf
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
; Calls to your +999: the caller found the PBX in ENUM, no registration
[anonymous]
type=endpoint
context=from-armor
disallow=all
allow=opus,g722,alaw,ulaw
rtp_symmetric=yes
rewrite_contact=yes
direct_media=no
; Calls to +999 from your PBX
[armor]
type=endpoint
context=from-armor
disallow=all
allow=opus,g722,alaw,ulaw
from_domain=pbx.example.com
direct_media=no; extensions.conf
[from-armor]
; your +999 number -> an extension
exten => +9997309051305,1,Dial(PJSIP/101,30)
same => n,Hangup()
; include in your users' context: include => to-armor
[to-armor]
exten => _+999XXXXXXXXXX,1,Set(URI=${ENUMLOOKUP(${EXTEN},sip,,1,e164.armor.tel)})
same => n,GotoIf($["${URI}" = ""]?missing)
same => n,Dial(PJSIP/armor/sip:${URI},60)
same => n,Hangup()
same => n(missing),Hangup(1)- Seguro. El contexto from-armor solo tiene tus números, así que ninguna llamada ajena puede pasar por la centralita.
- Número no emitido: ENUM está vacío y la llamada termina de inmediato, sin intentar conectar.
Ejemplo: FreeSWITCH
Las llamadas entrantes las acepta el perfil external (puerto 5080: publica un registro SRV _sip._udp.pbx.example.com con este puerto). Las llamadas salientes pasan por mod_enum.
<!-- autoload_configs/enum.conf.xml (and mod_enum in modules.conf.xml) -->
<configuration name="enum.conf" description="ENUM">
<settings>
<param name="default-root" value="e164.armor.tel"/>
</settings>
<routes>
<route service="E2U+SIP" regex="sip:(.*)" replace="sofia/external/$1"/>
</routes>
</configuration><!-- dialplan/public/armor.xml: calls to your +999 -->
<include>
<extension name="armor-in">
<condition field="destination_number" expression="^\+9997309051305$">
<action application="bridge" data="user/1001@${domain_name}"/>
</condition>
</extension>
</include>
<!-- dialplan/default/armor.xml: calls to +999 from the PBX -->
<include>
<extension name="armor-out">
<condition field="destination_number" expression="^(\+999\d{10})$">
<action application="enum" data="$1 e164.armor.tel"/>
<action application="bridge" data="${enum_auto_route}"/>
</condition>
</extension>
</include>- El contexto public acepta solo los números indicados: FreeSWITCH rechaza todo lo demás.
Pruebas
El número de prueba +999 100 000 00 01 contesta y dice la hora: una forma práctica de comprobar la ruta, el transporte y los medios. Para consultas y para unirte al catálogo, escribe a ops@armor.tel.