TSDucki kasutamine IP(TS)-voogude jÀlgimiseks

Praegu on olemas valmis (patenditud) lahendused IP(TS)-voogude jĂ€lgimiseks, nĂ€iteks VB ja iQ, need pakuvad ĂŒsna laia funktsioonide valikut ja sellised lahendused on tavaliselt suurte operaatorite kĂ€sutuses, kes tegelevad TV-teenustega. Selles artiklis kĂ€sitletakse avatud lĂ€htekoodiga projektil pĂ”hinevat lahendust TSDuck, mis on mĂ”eldud IP(TS)-voogude minimaalseteks jĂ€lgimiseks CC (continuity counter) ja bitikiiruselt. Üks vĂ”imalik rakendusala on pakettide vĂ”i voogude kadumise kontrollimine renditud L2-kanali kaudu (mida ei saa normaalselt jĂ€lgida, nĂ€iteks kaotuse arvestite lugemise kaudu jĂ€rjekordades).

TSDuckist lĂŒhidalt

TSDuck on avatud lĂ€htekoodiga (2-Clause BSD litsents) tarkvara (konsol utiliitide komplekt ja raamatukogu oma utiliitide vĂ”i pluginite arendamiseks) TS-voogude manipuleerimiseks. Sisendina suudab see töötada IP (multicast/unicast), http, hls, dvb-tuunerite, dektec dvb-asi demodulaatoriga, sisaldab sisseehitatud TS-voo generaatorit ja faili lugemist. VĂ€ljundina saab see salvestada faili, IP (multicast/unicast), hls, dektec dvb-asi ja HiDes modulaatoritesse, mĂ€ngijatesse (mplayer, vlc, xine) ja drop. Sisse- ja vĂ€ljundide vahel saab kasutada erinevaid liiklustöötlejaid, nĂ€iteks PID-de ĂŒmberkaardistamine, krĂŒptimine/dekrĂŒptimine, CC-loendurite analĂŒĂŒs, bitikiirusetabeli arvutamine ja teised tĂŒĂŒpilised TS-voogude toimingud.

Selles artiklis kasutatakse sisendina IP-vooge (multicast), kasutades bitrate_monitor (nimest on selge, mis see on) ja continuity (CC-loendurite analĂŒĂŒs) töötlejat. Probleemideta saab IP multicast vahetada mĂ”ne muu TSDucki toetatud sisendiviisi vastu.

On olemas ametlikud komplektid/paketid TSDuck enamikule kaasaegsetele opsĂŒsteemidele. Debianile neid ei ole, kuid Debian 8 ja Debian 10 jaoks Ă”nnestus need probleemideta kokku panna.

Kasutatakse TSDuck versiooni 3.19-1520, opsĂŒsteemina on Linux (lahenduse ettevalmistamiseks kasutati debian 10, tĂ”eliseks kasutamiseks — CentOS 7)

TSDucki ja opsĂŒsteemi ettevalmistamine

Enne kui hakkate jĂ€lgima reaalseid vooge, veenduge, et TSDuck töötab korralikult ning et vĂ”rgukaardi vĂ”i operatsioonisĂŒsteemi (soketi) tasemel ei esine katkestusi. See on vajalik, et hiljem ei peaks arutama, kus katkestused toimusid — kas vĂ”rgus vĂ”i "serveri sees". Katkestusi vĂ”rgu tasemel saab kontrollida kĂ€suga ethtool -S ethX, hÀÀlestust teostatakse sama ethtooliga (tavaliselt tuleb suurendada RX-puhvrit (-G) ja mĂ”nikord keelata mĂ”ned offload'id (-K)). Ühe ĂŒldise soovitusena vĂ”iks soovitada kasutada analĂŒĂŒsitava liikluse vastuvĂ”tmiseks eraldi porti, kui see on vĂ”imalik, see minimeerib valehĂ€ireid, mis vĂ”ivad tekkida, kui katkestus toimub analĂŒsaatori pordis teiste liikluse tĂ”ttu. Kui sellist vĂ”imalust ei ole (kasutatakse miniarvutit/NUC-d ĂŒhe pordiga), siis on vĂ€ga soovitatav seadistada analĂŒĂŒsitava liikluse prioriteet muudele seadmel, kuhu analĂŒsaator on ĂŒhendatud. Virtuaalsete keskkondade osas tuleb olla ettevaatlik ja osata leida katkestusi, alustades fĂŒĂŒsilisest pordist ja lĂ”petades rakendusega virtuaalmajas.

Voogude genereerimine ja vastuvÔtt hosti sees

Esimese sammuna TSDuck'i ettevalmistamisel genereerime ja vĂ”tame vastu liiklust ĂŒhe hosti sees, kasutades netns.

Valmistame keskkonna ette:

ip netns add P #loome netns P, kus toimub liikluse analĂŒĂŒs
ip link add type veth #loome veth-paar - veth0 jÀÀb vaikimisi netns-i (sellele liidesele genereeritakse liiklus)
ip link set dev veth1 netns P #veth1 - paigutame netns P-sse (sellel liidesele toimub liikluse vastuvÔtt)
ip netns exec P ifconfig veth1 192.0.2.1/30 up #tÔstame IP veth1-le, pole oluline, mis see on
ip netns exec P ip ro add default via 192.0.2.2 #seame vaikimisi marsruudi netns P sees
sysctl net.ipv6.conf.veth0.disable_ipv6=1 #lĂŒlitame IPv6 vĂ€lja veth0-l - see tehakse, et TX loendisse ei satuks kĂ”rvaline mĂŒra
ifconfig veth0 up #tÔstame liidese veth0
ip route add 239.0.0.1 dev veth0 #loome marsruudi, et OS suunaks liikluse 239.0.0.1 suunas veth0-le

Keskkond on valmis. KĂ€ivitame liikluse analĂŒsaatori:

ip netns exec P tsp --realtime -t 
 -I ip 239.0.0.1:1234 
 -P continuity 
 -P bitrate_monitor -p 1 -t 1 
 -O drop

kus „-p 1 -t 1” tĂ€hendab, et bitikiirus arvutatakse iga sekundi tagant ja bitikiirusest teave kuvatakse iga sekundi tagant
KĂ€ivitame liikluse generaatori kiirusel 10 Mbit/s:

tsp -I craft 
 -P regulate -b 10000000 
 -O ip -p 7 -e --local-port 6000 239.0.0.1:1234

kus «-p 7 -e» tÀhendab, et tuleb pakkida 7 TS-paketti 1 IP-paketiks ja teha seda range seadistusega (-e), st alati oodata viimase protsessori kÀest 7 TS-paketti enne IP-paketi saatmist.

AnalĂŒsaator hakkab kuvama oodatud teateid:

* 2020/01/03 14:55:44 - bitrate_monitor: 2020/01/03 14:55:44, TS bitrate: 9,970,016 bits/s
* 2020/01/03 14:55:45 - bitrate_monitor: 2020/01/03 14:55:45, TS bitrate: 10,022,656 bits/s
* 2020/01/03 14:55:46 - bitrate_monitor: 2020/01/03 14:55:46, TS bitrate: 9,980,544 bits/s

NĂŒĂŒd lisame veidi katkestusi:

ip netns exec P iptables -I INPUT -d 239.0.0.1 -m statistic --mode random --probability 0.001 -j DROP

ja ilmnevad sellised teated:

* 2020/01/03 14:57:11 - continuity: paket indeks: 80,745, PID: 0x0000, 7 paketti puuduvad
* 2020/01/03 14:57:11 - continuity: paket indeks: 83,342, PID: 0x0000, 7 paketti puuduvad 

mis on oodatud. LĂŒlitame katkestuste kaotamise vĂ€lja (ip netns exec P iptables -F) ja proovime suurendada generaatori bitrate'i 100 Mbit/s. AnalĂŒsaator teatab hulgaliselt CC- vigu ja umbes 75 Mbit/s asemel 100. Proovime vĂ€lja selgitada, kas sĂŒĂŒdi on generaator vĂ”i on probleem mujal, selleks kĂ€ivitame fikseeritud arvu paketid (700000 TS-paketti = 100000 IP-paketti):

# ifconfig veth0 | grep TX
       TX packets 151825460  bytes 205725459268 (191.5 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# tsp -I craft -c 700000 -P regulate -b 100000000 -P count -O ip -p 7 -e --local-port 6000 239.0.0.1:1234
* count: PID    0 (0x0000):    700,000 packets
# ifconfig veth0 | grep TX
        TX packets 151925460  bytes 205861259268 (191.7 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Nagu nĂ€ha, on genereeritud tĂ€pselt 100000 IP-paketti (151925460-151825460). Seega uurime, mis toimub analĂŒsaatoriga, selleks vĂ”rreldes RX loenduri vÀÀrtusega veth1-l, mis on tĂ€pselt vĂ”rdne TX loenduri vÀÀrtusega veth0-l, ja seejĂ€rel vaatame, mis toimub soketitasemel:

# ip netns exec P cat /proc/net/udp                                                                                                           
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops             
  133: 010000EF:04D2 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 72338 2 00000000e0a441df 24355 

Siin on nÀhtav kadude arv = 24355. TS-pakettides on see 170485 ehk 24,36% 700000-st, seega nÀeme, et need 25% kadunud bittide voogus on kadud UDP-soketis. Kadud UDP-soketis tekivad tavaliselt mÀlu puuduse tÔttu, vaatame, kui suur on vaikimisi soketi puhver ja maksimaalne soketi puhver:

# sysctl net.core.rmem_default
net.core.rmem_default = 212992
# sysctl net.core.rmem_max
net.core.rmem_max = 212992

Seega, kui rakendused ei kĂŒsi puhvri suurust selgelt, luuakse soketid puhvri suurusega 208 Kb, kuid kui kĂŒsitakse rohkem, siis ei saada ikkagi soovitud suurust. Kuna tsp jaoks IP-sisendi puhul on vĂ”imalik mÀÀrata puhvri suurus (—buffer-size), siis ei puuduta vaikimisi soketi suurust, vaid mÀÀrame vaid maksimaalse soketi puhvri suuruse ja mÀÀrame puhvri suuruse selgelt tsp argumentide kaudu:

sysctl net.core.rmem_max=8388608
ip netns exec P tsp --realtime -t -I ip 239.0.0.1:1234 -b 8388608 -P continuity -P bitrate_monitor -p 1 -t 1 -O drop

Sellise soketi puhvri hÀÀlestamisega on nĂŒĂŒd raporteeritud bittide voog umbes 100 Mbit/s, CC-vigu ei esine.

TSP rakenduse poolt CPU kasutamine. Ühe i5-4260U CPU @ 1,40 GHz tuuma puhul 10 Mbit/s voogude analĂŒĂŒsimiseks kulub 3-4% CPU, 100 Mbit/s — 25%, 200 Mbit/s — 46%. Pakettide kaotusprotsendi mÀÀramisel CPU koormus praktiliselt ei suurene (aga vĂ”ib vĂ€heneda).

TĂ”husamal riistvaral on probleemideta suudetud genereerida ja analĂŒĂŒsida vooge ĂŒle 1 Gbit/s.

Testimine reaalsel vÔrgukaardil

PĂ€rast testimist veth-paaril tuleb vĂ”tta kaks hosti vĂ”i ĂŒhe hosti kaks porti, ĂŒhendada portidega omavahel, ĂŒhel kĂ€ivitada generaator, teisel analĂŒsaator. Siin ei juhtunud ĂŒllatusi, kuid tegelikult sĂ”ltub see kĂ”ik riistvarast — mida nĂ”rgem, seda huvitavam see siin on.

Saadud andmete kasutamine monitooringusĂŒsteemis (Zabbix)

TSP-l ei ole mingit masinloetavat API-d nagu SNMP vĂ”i sarnast. CC-sĂ”numeid tuleb koondada vĂ€hemalt 1 sekundi kaupa (kui pakettide kaotusprotsent on kĂ”rge, vĂ”ivad neid olla sadades, tuhandes vĂ”i kĂŒmnetes tuhandetes sekundis, sĂ”ltuvalt bitimÀÀrast).

Seega, et sÀilitada nii teavet kui ka joonistada graafikud CC-vigadest ja bitimÀÀrast ning teha mÔningaid avariid, vÔivad jÀrgmised variandid olla:

  1. Parse ja koguda (CC jÀrgi) tsp vÀljundit, st muuta see vajaliku vormi.
  2. TĂ€iendada ise tsp ja/vĂ”i protsessoripluginaid bitrate_monitor ja continuity, et tulemus oleks masinloetaval kujul, mis sobib monitooringusĂŒsteemile.
  3. Kirjutada oma rakendus tsduck raamatukogu peal.

Ilmselgelt on töömahtude aspektist variant 1 kÔige lihtsam, eriti arvestades, et ise tsduck on kirjutatud madala taseme (kaasaegsete mÔÔdikute jÀrgi) keeles (C++).

Lihtne parser+agregaatori prototĂŒĂŒp bashis nĂ€itas, et 10Mbit/s voolul ja 50% pakettide kadumise (halvim variant) korral tarbis bashiprotsess 3-4 korda rohkem CPU-d kui tsp protsess ise. Selline arengu variant on vastuvĂ”etamatu. Siin on osa sellest prototĂŒĂŒbist.

Bashi nuudlid

#!/usr/bin/env bash

missingPackets=0
ccErrorSeconds=0
regexMissPackets='^* (.+) - continuity:.*missing ([0-9]+) packets$'
missingPacketsTime=""

ip netns exec P tsp --realtime -t -I ip -b 8388608 "239.0.0.1:1234" -O drop -P bitrate_monitor -p 1 -t 1  -P continuity 2>&1 | 
while read i
do
    #line example:* 2019/12/28 23:41:14 - continuity: packet index: 6,078, PID: 0x0100, missing 5 packets
    #line example 2: * 2019/12/28 23:55:11 - bitrate_monitor: 2019/12/28 23:55:11, TS bitrate: 4,272,864 bits/s
    if [[ "$i" == *continuity:* ]] 
    then
        if [[ "$i" =~ $regexMissPackets ]]
        then
            missingPacketsTimeNew="${BASH_REMATCH[1]}" #timestamp (seconds)
            if [[ "$missingPacketsTime" != "$missingPacketsTimeNew" ]] #new second with CC error
            then
                ((ccErrorSeconds += 1))
            fi
            missingPacketsTime=$missingPacketsTimeNew
            packets=${BASH_REMATCH[2]} #TS missing packets
            ((missingPackets += packets))
        fi
    elif [[ "$i" == *bitrate_monitor:* ]]
    then
        : #...
    fi
done

Lisaks sellele, et see töötab ebanormaalselt aeglaselt, puuduvad bash'is normaalsed lĂ”imed, bash tööd on iseseisvad protsessid ja tuli iga sekundi jooksul salvestada vÀÀrtus missingPackets kĂŒlgefektina (saades iga sekundi jooksul bittide kiirusest teateid). LĂ”puks jĂ€eti bash rahule ja otsustati kirjutada golang’is wrapper (parser + agregaat). CPU tarbimine sarnase koodi puhul golang’is on 4-5 korda vĂ€iksem kui tsp protsessi puhul. Wrapperi kiirus golang’i kasutamise tĂ”ttu paraneb ligikaudu 16 korda ja ĂŒldiselt on tulemus vastuvĂ”etav (CPU ĂŒlejÀÀk kĂ”ige halvemal juhul 25%). Algne fail golang'is asub siit.

Wrapperi kÀivitamine

Wrapperi kĂ€ivitamiseks on loodud lihtne teenusemall systemd jaoks (siit). Eeldatakse, et wrapper on kompileeritud binaarfailiks (go build tsduck-stat.go), mis on paigutatud /opt/tsduck-stat/. Eeldatakse, et kasutatakse golang’i, mis toetab monotonic kellale (>=1.9).

Teenuse eksemplari loomiseks tuleb kÀivitada kÀsk systemctl enable tsduck-stat@239.0.0.1:1234, seejÀrel algatada kasutades systemctl start tsduck-stat@239.0.0.1:1234.

Discovery Zabbixist

Kuna zabbix peab suunatud teenuste avastamiseks looma gruppide nimekirja generaator (discovery.sh), Zabbixi avastamiseks vajalikus formaadis, eeldatakse, et see on seal samas — /opt/tsduck-stat. Avasta Zabbix-agentiga seotud kĂ€ivitamiseks tuleb lisada .conf-fail zabbix-agendi konfigureerimise kausta, et lisada user-parameeter.

Zabbixi mall

Loetud mall (tsduck_stat_template.xml) sisaldab automaatavastamise reeglit, andmeelementide, diagrammide ja signaalide prototĂŒĂŒpe.

LĂŒhike kontrollnimekiri (juhuks kui keegi soovib kasutada)

  1. Veendu, et tsp ei kukuta pakette 'ideaalses' keskkonnas (generaator ja analĂŒsaator on otse ĂŒhendatud), kui kukkumisi on, vaata p.2 vĂ”i artikli teksti selle kohta.
  2. Tee maksimum soketi puhvri hÀÀlestamine (net.core.rmem_max=8388608).
  3. Kompileeri tsduck-stat.go (go build tsduck-stat.go).
  4. Aseta teenuse mall /lib/systemd/system.
  5. KÀivita teenused systemctl abil, kontrolli, et loendurid hakkavad ilmuma (grep «» /dev/shm/tsduck-stat/*). Teenuste arv peab vastama multicasti voogude arvule. Siin vÔib olla vajalik luua marsruut multicasti gruppi, vÔib-olla deaktiveerida rp_filter vÔi luua marsruut source ip jaoks.
  6. KĂ€ivita discovery.sh, veendu, et see genereerib json.
  7. Sisesta zabbix-agendi konfiguratsioon, taaskÀivita zabbix-agent.
  8. Laadi mall fail zabbix, rakenda see hostile, kus toimub jÀlgimine ja on installitud zabbix-agent, oota umbes 5 minutit, vaata, et uued andmeelemendid, graafikud ja triggarid on ilmunud.

Tulemus

TSDucki kasutamine IP(TS)-voogude jÀlgimiseks

Pakettide kaotuse tuvastamiseks on see peaaegu piisav, parem on kui mitte mingit jÀlgimist.

TĂ”epoolest, CC-"kaotused" vĂ”ivad tekkida videofragmente ĂŒhendades (kui ma Ă”igesti tean, nii tehakse sisestusi kohalikes telejaamades Venemaal, st CC-arvesti ei arvestata), seda tuleb meeles pidada. Proprietaarsetes lahendustes on see probleem osaliselt mööda hiilimiseks SCTE-35 mĂ€rkide tuvastamine (kui need lisatakse voogedastuse generaatoriga).

Transpordi kvaliteedi jĂ€lgimise seisukohalt puudub jitter (IAT) jĂ€lgimine, kuna TV-seadmed (olgu need modulaatorid vĂ”i lĂ”ppseadmed) vajavad seda parameetrit ning jitbufferit ei saa alati lĂ”pmatuseni suurendada. Jitter vĂ”ib muutuda, kui ĂŒlekandel kasutatakse suurte puhverdatud seadmeid ja QoS ei ole sarnase reaalajas liikluse edastamiseks seadistatud vĂ”i pole piisavalt hĂ€sti seadistatud.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster