Ki jan yo konekte Zabbix ak asteris soti nan bwat la

Nan atik anvan an "Zabbix - agrandi limit makro" Mwen te di ou kijan pou resevwa yon sesyon otorizasyon epi ranplase li nan yon makro lokal lame. Nan atik sa a mwen pral di w ki jan yo konekte Zabbix ak Asterisk san scripts ekstèn ak lojisyèl.

Lide a "fè zanmi" nan de sistèm sa yo te fèt yon bon bout tan de sa, san yo pa enstale lojisyèl adisyonèl oswa scripts. Yon googling rapid bay anpil solisyon posib, li tout bouyi desann nan lefèt ke Upload scripts yo (nan Pyha, Bash, Python, elatriye) sou sèvè a, epi ou pral kontan. Mwen te vle aplike siveyans "soti nan bwat la" - san scripts ekstèn ak enstale lojisyèl adisyonèl sou sèvè a ak siveyans ak PBX.

Mwen te pase yon total de 4 jou travay ak sa a, men rezilta a te vo li. Travay atravè koòdone AMI a, deteksyon nivo ki ba, deklanche, epi sa ki pi enpòtan, konekte PBX a ak tout lòt paramèt kounye a pran apeprè 15 minit.

Zabbix 4.4 disponib, apeprè 100 moso nan Asterisk vèsyon 13. Gen kèk PBX ki vini ak koòdone entènèt FreePBX la, gen kèk ki gen yon konsole vid, yon pakèt ke trik nouvèl ak entegrasyon atravè yon dialplan.

Resevwa done ki soti nan PBX la

Premye ak prensipal pwen ki bezwen rezoud se jwenn done sou kamarad ak anrejistreman SIP. Pou rezon sa a, PBX a gen entèfas konsole AGI, AMI, ARI ak SSH. Pou rezon evidan, mwen pa t 'konsidere modil adisyonèl.

Premye nou bezwen konnen ki sa agi, ami, ari sa yo ye...

  • AGI - lè l sèvi avèk scripts nan dialplan la. Sitou itilize pou jesyon apèl.
  • AMI - ka bay tout enfòmasyon ki nesesè yo, travay atravè pò 5038, menm jan ak Telnet. kostim nou!
  • ARI - modèn, alamòd, JSON. Gen anpil posiblite, fòma done a se konprann pou Zabbix, men pou mwen pa gen okenn bagay prensipal: ou pa ka kontwole enskripsyon an sip. Yon lòt dezavantaj se ke pou kamarad yo gen sèlman de eta sou entènèt / offline, byenke gen plis eta epi li itil yo pran yo an kont lè dyagnostik.
  • SSH ka fè tout bagay, men pafwa li pa pèmèt akòz "rezon sekirite". Konsiderasyon yo ka diferan, mwen pa pral antre nan yo.

Sepandan, ak tout enpèfeksyon li yo, ARI kouvri 90% nan tout bezwen siveyans.

Zabbix ak Telnet - desepsyon mwen

Mwen konnen AMI byen nan yon sèl fwa mwen aplike swiv pèt nan konvèsasyon ak divizyon pa biwo aleka, jesyon apèl, elatriye. Avèk Telnet, tout bagay trè klè tou: louvri koneksyon an, voye kòmandman yo epi li repons lan. Se sa mwen te fè, men rezilta a te desevwa m.

Telnet Zabbix la pa menm ak Telnet konsole a. LinuxLi yon ti jan pi senp epi li fèt pou otantifikasyon estanda login/modpas. Si lojik otantifikasyon an diferan epi pa gen okenn pè login/modpas ki mande, yon erè rive. Apre mwen fin eseye san siksè pou kontoune egzijans otantifikasyon an, mwen te kòmanse gade kòd sous modil Telnet la.

Mwen reyalize ke jiskaske gen yon login tradisyonèl ak demann modpas, mwen pa pral avanse. Jis pou plezi, mwen retire tout bagay ki gen rapò ak otorizasyon nan kòd la epi reasanble tout bagay. Travay! Men, li pa satisfè kondisyon yo. Ale pi devan...

Ann retounen nan rechèch la

Mwen re-li dokiman ARI a ankò, mwen te fè tès adisyonèl - pa gen okenn anrejistreman sip isit la. Gen fèt, gen konvèsasyon, gen kalson, men pa gen anrejistreman. Nan kèk pwen mwen menm te panse, èske nou vrèman bezwen enskripsyon vulture?

Pa yon konyensidans komik, nan moman sa a yon lòt demann rive soti nan itilizatè a, ak yon pwoblèm ak apèl sortan. Pwoblèm lan se te ke enskripsyon sip la te konjelasyon e li te rezoud pa tou senpleman rdemare modil la.

asterisk -rx "sip reload"

Li ta bon pou jwenn aksè AMI sou entènèt la: sa ta rezoud tout pwoblèm yo, mwen te panse. Mwen kòmanse fouye nan direksyon sa a, epi literalman premye liy rechèch la mennen nan dokiman ofisyèl Asterisk la, ki di ke gen yon opsyon pou travay mwen. entènèt aktive nan dosye /etc/asterisk/manager.conf, ki bezwen mete sou WI, nan seksyon an [jeneral]

Apre sa, atravè yon demann regilye entènèt nan fòm lan http://ats:8089/mxml?action=SIPshowregistry nou jwenn tout enfòmasyon ki nesesè yo.

Lè w ap itilize koòdone FreePBX la, ou pa kapab aktive opsyon sa a atravè entènèt la, ou bezwen pèmèt li atravè konsole a lè w fè chanjman nan dosye manager.conf la. FreePBX pa efase li lè chanjman konfigirasyon yo fèt atravè entènèt la.

Mwen te travay ak divès kalite entegrasyon Asterisk pou yon tan long, men mwen pa janm wè karakteristik sa a mansyone nenpòt kote. Mwen te etone ke pèsonn pa dekri metòd sa a pou kominike avèk PBX la. Li te menm itil espesyalman pou chèche enfòmasyon sou sijè sa a: pa gen pratikman anyen oswa li te itilize pou travay konplètman diferan.

WEB AMI - ki kalite bèt?

Ajoute yon opsyon entènèt aktive pou ranpli manadjè.conf bay aksè konplè a jesyon ATS atravè entènèt la. Tout kòmandman ki disponib atravè yon AMI regilye yo kounye a sou entènèt la, ou ka koute evènman nan PBX a atravè yon priz. Prensip operasyon an pa diferan de konsole AMI a. Apre aktive opsyon sa a, ou ka kontakte PBX a nan adrès sa yo:

https://ats:8089/manager — yon paj wèb ak yon koòdone senp pou tès ak manyèlman voye demann. Tout repons yo fòmate nan HTML lizib. Pa trè apwopriye pou siveyans.
https://ats:8089/rawman — pwodiksyon tèks sèlman, fòma menm jan ak konsole AMI
https://ats:8089/mxml - pwodiksyon tèks sèlman, nan fòma XML. kostim nou!

Ki jan yo konekte Zabbix ak asteris soti nan bwat la

Lè sa a, mwen te panse: "Sa a se solisyon an! Koulye a, tout bagay pral pare! Easy-peezy lemon squeezey,” men li te twò bonè pou rejwi. Pou jwenn enfòmasyon nou bezwen an, li ase pou itilize yon demann GET ak aksyon ki nesesè yo aksyon, ki an repons a retounen xml ak yon lis tout anrejistreman ak estati yo. Tout bagay sa yo bon, men ou bezwen otorizasyon pou w sonje sesyon an nan bonbon an. Lè w teste nan navigatè a, ou pa panse sou pwosesis sa a.

Pwosesis otorizasyon

Premye nou adrese adrès la http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, an repons, sèvè a voye nou yon bonbon ak sesyon otorizasyon an. Men sa yon demann HTTP sanble:

https://ats:8089/mxml?action=login&username=zabbix&secret=zabbix

Host: ats:8089
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1

Repons:

GET: HTTP/1.1 200 OK
Server: Asterisk/13.29.2
Date: Thu, 18 Jun 2020 17:41:19 GMT
Cache-Control: no-cache, no-store
Content-type: text/xml
Set-Cookie: mansession_id="6f5de42c"; Version=1; Max-Age=600
Pragma: SuppressEvents
Content-Length: 146

<ajax-response>
<response type="object" id="unknown">
<generic response="Success" message="Authentication accepted"/>
</response>
</ajax-response>

Pou travay la ou bezwen mansession_id="6f5de42c", sa vle di bonbon otorizasyon li menm.
Kontni ou jis bezwen tcheke pou repons lan "Otantifikasyon aksepte" Apre sa, pou tout apèl nan sèvè PBX a, nou pral bezwen ajoute yon bonbon otorizasyon nan demann lan.

https://ats:8089/mxml?action=SIPpeers

Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"

Li kijan pou jwenn yon bonbon otorizasyon epi sèvi ak li nan lòt demann isit la: "Zabbix - agrandi limit makro

Pou kreye eleman swiv nan Zabbix mwen pral itilize deteksyon oto.

Deteksyon oto

Pou detekte otomatikman anrejistreman yo epi swiv eta kanmarad yo, ou bezwen kontakte adrès sa a: https://ats:8089/mxml?action=SIPshowregistry oswa https://ats:8089/mxml?action=SIPpeers

Kòm repons, PBX a retounen nou yon repons XML:

<ajax-response>
<response type="object" id="unknown">
<generic response="Success" eventlist="start" message="Registrations will follow"/>
</response>
...
<response type="object" id="unknown">
<generic event="RegistryEntry" host="login.mtt.ru" port="5060" username="111111" domain="login.mtt.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
<response type="object" id="unknown">
<generic event="RegistryEntry" host="voip.uiscom.ru" port="5060" username="222222" domain="voip.uiscom.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
<response type="object" id="unknown">
<generic event="RegistryEntry" host="voip.uiscom.ru" port="5060" username="333333" domain="voip.uiscom.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
...
</ajax-response>

Gen anpil fatra nan repons lan, kidonk nan preprocessing nou filtre li pa modèl XPath: //repons/jenerik[@host]
Lè sa a, plezi a kòmanse. Pou travay ak deteksyon ak dinamik kreye eleman, repons lan dwe nan fòma JSON. XML pa sipòte pou deteksyon oto.

Pou konvèti XML an JSON, mwen te oblije jwe yon ti kras ak ranplasman oto, pou ki mwen te fè yon script nan JS.

Ki jan yo konekte Zabbix ak asteris soti nan bwat la

Yon pwen enteresan: nan repons ATS la, tout paramèt yo antoure pa yon sèl quotes, epi apre yo fin aplike modèl la. //repons/jenerik[@host] yo ranplase pa doub.

Pou kreye eleman, nou itilize varyab ki soti nan repons XML (kounye a JSON).

Ki jan yo konekte Zabbix ak asteris soti nan bwat la

SIP Rejis

Pou anrejistreman sip nou itilize twa varyab: non itilizatè, lame, pò. Mwen te kontan ak non eleman an 111111@login.mtt.ru:5060, Mwen pa jwenn okenn sitiyasyon kote ou bezwen sèvi ak tout senk varyab.

Eleman prensipal la ki resevwa enfòmasyon sou tout anrejistreman yo, Asterisk - AMI SIPshowregistry. Yon fwa yon minit li fè yon demann GET https://ats:8089/mxml?action=SIPshowregistry, apre yo fin done repons XML yo pase bay tout eleman depandan pou analiz. Pou chak enskripsyon mwen kreye yon eleman ki depann sou li. Sa a se pratik paske nou resevwa enfòmasyon ajou nan yon sèl demann, epi yo pa pou chak demann separeman. Aplikasyon sa a gen yon dezavantaj enpòtan - chaj la sou processeur a.

Lè tès jiska 100 eleman depandan, mwen pa t 'avi chay la, men ak eleman 1700, sa a te bay yon chaj aparan 15 dezyèm sou processeur a. Kenbe sa a nan tèt ou si ou gen yon gwo kantite eleman depandan.

Kòm yon opsyon pou "gaye" chaj la oswa mete diferan frekans biwo vòt pou yon eleman, ou ka deplase lojik pwosesis la nan chak eleman separeman.

Mwen pa estoke enfòmasyon yo resevwa nan eleman prensipal la. Premyèman, mwen pa wè nesesite pou sa a, epi dezyèmman, si repons lan se plis pase 64K, Lè sa a, Zabbix koupe li.

Depi nou itilize yon repons XML konplè pou eleman depandan an, nou bezwen jwenn valè eleman sa a nan pre-pwosesis. Atravè XPath li fè tankou sa a:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ eta)
Pou estati anrejistreman, mwen pa t 'sèvi ak estati tèks, men konvèti yo nan fòm nimerik lè l sèvi avèk JavaScript:

switch(value) {
  case 'Registered':
    return 1;
  case 'Unregistered':
    return 0;
  default:
    return -1;
}

SIP Kanmarad

Pa analoji ak anrejistreman SIP, gen yon eleman prensipal nan Asterisk - AMI SIPshowregistry, ki depandan yo ajoute.

Sa kreye de eleman depandan:

  • Estati kanmarad sou fòm tèks
  • Tan repons aparèy la - si estati a OK, Lè sa a, tan repons aparèy la ekri, otreman "-1"

Chemen nan eleman nan tèt li se yon ti kras pi senp XPath:

string(//response/generic[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)

Pou dezyèm eleman mwen te itilize JavaScript pou separe tan repons soti nan estati kanmarad la, paske yo estoke ansanm:

if(value.substring(0,2) == 'OK'){
	return value.match(/(d+)/gm);
}
else {
	return -1;
}

Konklizyon

Yon solisyon ki soti nan bwat ka konplèks epi yo pa klè imedyatman. Ogmante fleksibilite ak portabilite ant diferan sistèm yo

Ala bon sa bon ak fasil entegrasyon tout moun! Modèl ak enstriksyon pou mete kanpe GitHub.

Sous: www.habr.com

Achte hosting serye pou sit ki gen pwoteksyon DDoS, sèvè VPS VDS 🔥 Achte yon hébergement sit entènèt serye ak pwoteksyon DDoS, sèvè VPS VDS | ProHoster