Дано:  Маршрутизатор ESR-12, подключенный транком к IP PBX, через порт FXO к телефонной сети общего пользования (PSTN).

Требуется: Настроить резервный путь прохождения для голосового трафика через телефонную сеть общего пользования (PSTN).

Решение:  При исправном SIP-транке исходящие на внешних абонентов вызовы должны маршрутизироваться в SIP-транк. 

В соответствии с этим условием создаем набор правил ruleset main_rule, первым правилом описываем маршрутизацию в SIP-транк при нормальном режиме работы.

rule 1
      pattern '_X.,1,Dial(SIP/003)'
      enable
    exit

Далее, при недоступности встречной IP PBX через SIP-транк либо при ошибках при обработке вызова на встречной IP-PBX , вызов маршрутизируем через порт FXO в телефонную сеть общего пользования.

Формируем второе правило для резервного пути.

rule 2
      pattern '_50XX,2,Dial(SIP/9/9${EXTEN})'
      enable
    exit

Следующее формируемое правило нужно для корректного освобождения всех каналов, участвующих в построении разговорного тракта, после окончания разговора.

rule 3
      pattern '_50XX,3,Hangup()'
      enable
    exit

Ниже приведен пример диагностики состояния SIP-транка.

esr-12vf# show pbx registrations 
Username                   Host address       Port     Registration time          Refresh    Status                     
------------------------   ----------------   ------   ------------------------   --------   ------------------------   
100                        192.0.2.2          5060     Wed, 27 Sep 2023           105        Registered                 
                                                       04:23:54       


esr-12vf# show pbx registrations 
Username                   Host address       Port     Registration time          Refresh    Status                     
------------------------   ----------------   ------   ------------------------   --------   ------------------------   
100                        192.0.2.2          5060     --                         120        Request Sent         

Диагностику SIP-обмена можно выполнять непосредственно из cli ESR. Ниже пример неудачного вызова. Встречная IP PBX не смогла найти в своем плане нумерации записи с нужным номером абонента.

esr-12vf# monitor gigabitethernet 1/0/1 protocol udp port 5060
06:50:50.071360 a8:f9:4b:ad:22:2f > b8:97:5a:e1:81:a4, ethertype IPv4 (0x0800), length 847: (tos 0x0, ttl 64, id 8181, offset 0, flags [none], proto UDP (17), length 833)
    192.0.2.1.5060 > 192.0.2.2.5060: SIP, length: 805
        INVITE sip:5003@192.0.2.2:5060 SIP/2.0
        Via: SIP/2.0/UDP 192.0.2.1:5060;branch=z9hG4bK2c939c73
        Max-Forwards: 70
        From: <sip:003@192.0.2.1>;tag=as06472ac8
        To: <sip:5003@192.0.2.2:5060>
        Contact: <sip:003@192.0.2.1:5060>
        Call-ID: 3d3129a85c317ff27d72a3272d932b6f@192.0.2.1:5060
        CSeq: 102 INVITE
        User-Agent: ESR-12VF
        Date: Wed, 27 Sep 2023 06:50:50 GMT
        Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
        Supported: replaces
        Content-Type: application/sdp
        Content-Length: 269

        v=0
        o=root 60188966 60188966 IN IP4 192.0.2.1
        s=ESR-12VF
        c=IN IP4 192.0.2.1
        t=0 0
        m=audio 12800 RTP/AVP 8 0 101
        a=rtpmap:8 PCMA/8000
        a=rtpmap:0 PCMU/8000
        a=rtpmap:101 telephone-event/8000
        a=fmtp:101 0-16
        a=silenceSupp:off - - - -
        a=ptime:20
        a=sendrecv
06:50:50.073211 b8:97:5a:e1:81:a4 > a8:f9:4b:ad:22:2f, ethertype IPv4 (0x0800), length 500: (tos 0x0, ttl 64, id 28663, offset 0, flags [none], proto UDP (17), length 486)
    192.0.2.2.5060 > 192.0.2.1.5060: SIP, length: 458
        SIP/2.0 404 Not Found
        Via: SIP/2.0/UDP 192.0.2.1:5060;branch=z9hG4bK2c939c73;received=192.0.2.1
        From: <sip:003@192.0.2.1>;tag=as06472ac8
        To: <sip:5003@192.0.2.2:5060>;tag=as5c77958b
        Call-ID: 3d3129a85c317ff27d72a3272d932b6f@192.0.2.1:5060
        CSeq: 102 INVITE
        Server: Asterisk PBX 16.28.0~dfsg-0+deb10u3
        Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
        Supported: replaces, timer
        Content-Length: 0

06:50:50.074025 a8:f9:4b:ad:22:2f > b8:97:5a:e1:81:a4, ethertype IPv4 (0x0800), length 404: (tos 0x0, ttl 64, id 8182, offset 0, flags [none], proto UDP (17), length 390)
    192.0.2.1.5060 > 192.0.2.2.5060: SIP, length: 362
        ACK sip:5003@192.0.2.2:5060 SIP/2.0
        Via: SIP/2.0/UDP 192.0.2.1:5060;branch=z9hG4bK2c939c73
        Max-Forwards: 70
        From: <sip:003@192.0.2.1>;tag=as06472ac8
        To: <sip:5003@192.0.2.2:5060>;tag=as5c77958b
        Contact: <sip:003@192.0.2.1:5060>
        Call-ID: 3d3129a85c317ff27d72a3272d932b6f@192.0.2.1:5060
        CSeq: 102 ACK
        User-Agent: ESR-12VF
        Content-Length: 0 

В случае поступления вызова с телефонной сети общего пользования на порт FXO ESR, вызов необходимо перенаправить на один из внутренних номеров. Для этого настроим услугу "Горячая линия".

hotline ipt
hotline number ipt 003

В итоге получим такую конфигурацию. 

interface gigabitethernet 1/0/1
  ip firewall disable
  ip address 192.0.2.1/24
exit
interface voice-port 1
  sip user phone 003
exit
interface voice-port 4
  sip user phone 9
  caller-id mode off
  hotline ipt
  hotline number ipt 003
  pstn transmit-number
  no pstn transmit-prefix
exit
pbx
  ruleset from_pstn
    rule 1
      pattern '_X.,1,Dial(SIP/003)'
      enable
    exit
    rule 2
      pattern '_X.,2,Hangup()'
      enable
    exit
  exit
  ruleset main_rule
    rule 1
      pattern '_50XX,1,Dial(SIP/trunk_SSW/${EXTEN})'
      enable
    exit
    rule 2
      pattern '_50XX,2,Dial(SIP/9/9${EXTEN})'
      enable
    exit
    rule 3
      pattern '_50XX,3,Hangup()'
      enable
    exit
  exit
  profile fxo_ports
    client friend
    codec allow g711a
    codec allow g711u
    security level invite-port
    ruleset from_pstn
  exit
  profile trunk_SSW
    type external
    client friend
    codec allow g711a
    codec allow g711u
    security level invite-port
    host-address 192.0.2.2
    ruleset from_ssw
  exit
  profile fxs_ports
    client friend
    codec allow g711a
    codec allow g711u
    ruleset main_rule
  exit
  register-server SSW
    ip address 192.0.2.2
    ip port 5060
    profile trunk_SSW
    username 100
    authentication password encrypted CDE65039E5
    enable
  exit
  user 9
    profile fxo_ports
  exit
  user 003
    profile fxs_ports
  exit
  enable
exit 

Следует учитывать что ESR начнет маршрутизировать вызовы через резервный путь не мгновенно после отказа основного пути. Для переключения потребуется некоторое время.