Astérisque: troncs externes à l'état Demande envoyée

Une image familière?

[root@pbx scripts]# asterisk -x "sip show registry"
Host                                    dnsmgr Username       Refresh State                Reg.Time
sipnet.ru:5060                          Y      XXXXXXXXXXX         102 Request Sent           Fri, 20 Mar 2020 09:19:31
87.103.236.26:5060                      N      XXXXXX             105 Request Sent           Fri, 20 Mar 2020 09:20:55
sbc.megafon.ru:5060                     Y      XXXXXXXXXXX@       165 Request Sent           Fri, 20 Mar 2020 09:20:28
login.mtt.ru:5060                       Y      XXXXXXXXXXXXXX       105 Request Sent           Fri, 20 Mar 2020 09:19:50

Une fois qu'elle m'a eu aussi, j'ai écrit un script.

J'ai essayé de rechercher des recettes prêtes à l'emploi, la majorité se résumait à ceci: j'ai reçu un ping des adresses, allumé le débogage et y ai vu exactement ce qui était dit dans la première phrase de la citation "les paquets vont, mais les réponses ne viennent pas." Mais pourquoi? Le point numéro 1 a été exclu élémentaire. Point numéro 2 - aussi, car une connexion de test à partir de la même adresse IP mais d'un hôte interne différent a fonctionné. Le point numéro 4 est absolument "zhost". Mais le numéro 3 est déjà plus proche. Il ne bloque simplement pas, mais pour une raison quelconque, il ne permet pas à l'hôte d'échanger des paquets avec Asterisk. Et cela se produit dans 99% des cas après le point 2, lorsque la session PPPoE est interrompue. La session est ensuite restaurée et l'accès à Internet à partir du LAN est également disponible, mais les sessions UDP sont bloquées. Voici ce que Mikrotik nous dit à travers lequel ces sessions se déroulent:

, .

1) .
2)
3)
4) .
..








[admin@MikroTik] > /ip firewall connection print where dst-address~":5060" and srcnat
Flags: E - expected, S - seen-reply, A - assured, C - confirmed, D - dying, F - fasttrack, s - srcnat, d - dstnat
 #          PR.. SRC-ADDRESS           DST-ADDRESS           TCP-STATE   TIMEOUT     ORIG-RATE REPL-RATE ORIG-PACKETS REPL-PACKETS      ORIG-BYTES
 0  SAC  s  udp  10.X.X.X:5060     80.75.130.83:5060                 59m48s           0bps      0bps        2 172        2 191       1 358 335
 1  SAC  s  udp  10.X.X.X:5060     193.201.229.35:5060               59m47s           0bps      0bps        1 611        1 662         996 786
 2  SAC  s  udp  10.X.X.X:5060     212.53.40.40:5060                 59m44s           0bps      0bps        1 837        1 830       1 114 259
 3  SAC  s  udp  10.X.X.X:5060     87.103.236.26:5060                59m21s           0bps      0bps        2 501        2 509       1 614 239

Il s'agit de l'état des sessions en mode normal lorsque tout fonctionne. En l'absence d'enregistrement, si la mémoire me sert correctement, il n'y a pas de drapeau S - vu-réponse.

Nous essayons de réduire les sessions bloquées avec la commande:

[admin@MikroTik] > ip firewall connection remove [find where dst-address~":5060" and srcnat]

Et voilà, littéralement dans un deuxième troncs sont rétablis, les appels continuent, la vie fleurit de couleurs vives! Nous écrivons donc un script!

Tout d'abord, nous devons contrôler Mikrot sur la base des informations fournies par Asterisk. Par conséquent, le script sera exécuté en cron toutes les 5 minutes sur l'hôte avec Asterisk, et nous gérerons Mikrot via ssh avec un certificat. Ici , tout a été parfaitement peint - comment créer la clé et la lier à un nouvel utilisateur sur le microtia.

Eh bien, le script lui-même:

#!/bin/sh

if /usr/sbin/asterisk -x "sip show registry" | grep -q "Request Sent"; then
    echo "$(date) Resetting UDP connections on Mikrotik" >> /var/log/asterisk/mikrotik
    ssh -l admin-ssh -i /XXXX/.ssh/id_dsa 10.X.X.X 'ip firewall connection remove [find where dst-address~":5060" and srcnat]'
    sleep 2
    asterisk -x "sip reload"
fi

Juste au cas où, 2 secondes après la réinitialisation des sessions bloquées, nous mettons à jour l'enregistrement - pour que cela fonctionne définitivement!

À partir du 4 septembre 2019, le script a fonctionné 273 fois, à en juger par le journal. Vous pouvez calculer combien il m'a fait gagner du temps, ainsi que les gestionnaires et leurs nerfs clients.

PS Une situation similaire se produit sur tous les routeurs que j'ai rencontrés avec Asterisk. Et seul Mikrot peut résoudre le problème sans affecter les autres services. Les autres routeurs doivent être bêtement surchargés.

All Articles