Ya he conseguido hacerlo. El problema era que estaba modificando el fichero /etc/asterisk/ extensions_additional.conf, y cada vez que aplicaba cualquier cambio vía web, este fichero quitaba mis cambios.
La solución era sencilla. Crear un CoS vacía (Local_051), denegando todo menos las reglas que afectan a las extensiones y a las rutas de salida (al menos en mi caso). Esto genera lo siguiente en el extension_additional.conf
[Local_051]
include => Local_051-custom
include => Local_051_bad-number
include => bad-number
exten => s,1,Macro(hangupcall,)
exten => h,1,Macro(hangupcall,)
;--== end of [Local_051] ==--;
Ahora la configuración personalizada la pongo en el fichero extension_custom.conf, y añado lo siguiente al inicio:
[Local_051-custom]
exten => _051X0,1,Answer
same => n,NoOp(Call limited checking...)
same => n,GotoIf($["${CALLERID(num):4}" != "0" ]?llamar)
same => n(timeout),Set(TIMEOUT(absolute)=30)
same => n,NoOp(Call limited timeout stablished 30)
same => n(llamar),Dial(SIP/${EXTEN})
same => n,Hangup()
Con esto, cada vez que una extensión acabada en 0 llame a otra acabada en 0, solo dura 30 segundos, mientras que si llama a otra que no acabe en 0, no tiene límite.
Por si al alguien le resulta útil.
Saludos.