ce este un flux de trafic de rețea?

traffic_wide

fluxurile de trafic de rețea (fluxurile) sunt utile pentru construirea unei înțelegeri grosiere a traficului pe o rețea de calculatoare, oferind o unitate convenabilă pentru măsurarea și/sau tratarea traficului.

fluxurile pot fi măsurate pentru a înțelege ce vorbesc gazdele în rețea, cu detalii despre adrese, volume și tipuri de trafic. Această vizualizare a rețelei poate fi utilă pentru depanarea, detectarea incidentelor de securitate, planificarea și facturarea

dar ce este exact un flux și cum este definit?

această întrebare sună banal pentru a răspunde, cu toate acestea, atunci când săpăm mai adânc, găsim nuanțe și cazuri de colț care fac fluxurile interesante și, în cele din urmă, dificil de definit.

Background

pentru a înțelege cu adevărat fluxurile, trebuie să începem cu un fundal.

rețelele au început ca circuite comutate. Atunci când o gazdă a vrut să comunice cu o altă gazdă a cerut rețelei înființat un circuit. După terminarea fluxului de informații, circuitul a fost rupt.

flow2

Figura 1-Exemplu rețea comutată cu Circuit

rețelele comutate cu Circuit își au moștenirea în rețelele de telefonie. Acestea au o serie de dezavantaje, inclusiv scalabilitatea slabă și utilizarea redusă a capacității.

a fost nevoie de o alternativă pentru a construi ceea ce a devenit în cele din urmă rețelele cu comutare de pachete de internet. Mesajele sunt tăiate în bucăți de dimensiuni variabile, care sunt adresate individual și trimise ca pachete în întreaga rețea.

flow3

Figura 2 – Exemplu de rețea cu comutare de pachete

gazda receptoare reasamblează sarcina utilă din pachete înapoi în mesaj. Notă: pachetele pot conține, de asemenea, informații de control, cum ar fi controlul fluxului și căile nu trebuie să fie simetrice.

definirea fluxurilor într-o rețea cu comutare de circuite este ușoară, deoarece circuitul este un flux și urmează un protocol de stabilire și dezafectare (circuit = flux); cu toate acestea, într-o rețea cu comutare de pachete lucrurile sunt mai puțin evidente.

Imaginați-vă pentru o secundă că vă aflați la punctul de observație A în rețeaua comutată de circuit din Figura 1, veți vedea:

flow4

Figura 3-mărirea rețelei comutate în Circuit

se vor observa două fluxuri – circuite între gazdele 3 & 4 și gazdele 5 & 6. Observarea fluxurilor într-o rețea cu comutare de circuite este relativ ușoară, deoarece rețeaua este implicată în configurarea circuitelor, deci cunoaște starea lor și punctele finale.

Imaginați-vă acum că vă aflați la punctul de observație A în rețeaua comutată de pachete din Figura 2 în schimb, veți vedea:

flow5

Figura 4-măriți rețeaua comutată de pachete

dintr-o dată lucrurile sunt mai puțin clare. Există un pachet care vine de la gazda 5 destinat gazdei 6. Presupunând că vom observa pentru o perioadă de timp vom vedea mai multe pachete sosesc și pleacă. Observarea fluxurilor pe o rețea cu comutare de pachete necesită timp și necesită înregistrarea și analizarea informațiilor despre pachete.

prima încercare (naivă) de a defini un flux

folosind cunoștințele noastre despre rețelele cu comutare de pachete, o primă încercare de a răspunde ‘Ce este un flux’ ar putea fi:

un flux este o secvență de pachete care transportă informații între două gazde

această definiție arată ca:

flow6

Figura 5 – prima încercare de a defini un flux

există totuși o problemă. Ce se întâmplă dacă există mai multe tipuri de comunicare între gazde, de exemplu A are o conexiune SSH și HTTPS la B? Pachetele SSH și HTTPS fac parte din același flux? Intuitiv spunem nu, sunt sesiuni diferite și chiar protocoale complet diferite. Putem face mai bine…

a doua încercare de a defini

ce-ar fi să folosim informațiile de protocol din anteturile pachetelor ca proprietăți comune pentru a identifica pachetele în fluxuri? Aceasta va separa diferite tipuri de conexiuni în fluxuri diferite.

o mare parte din pachetele dintr-o rețea sunt susceptibile de a fi protocolul IP layer-3, cu TCP sau UDP ca protocol de transport layer-4. Prin urmare, este rezonabil să se ia în considerare utilizarea parametrilor TCP și UDP ca chei de flux din anteturile pachetelor.

vom folosi 5 parametri din anteturile pachetelor; IP sursă, IP destinație, protocol, port sursă TCP sau UDP și port destinație TCP sau UDP ca listă ordonată, cunoscută în mod obișnuit sub numele de 5-tuple, ca proprietăți comune pentru maparea pachetelor la fluxuri.

flow7

Figura 6-exemplul 5-tuplu

iată încercarea 2:

un flux este o secvență de pachete care transportă informații între două gazde, unde pachetele au proprietăți comune:

  • toate pachetele din flux au același 5-tuplu

scenariul nostru arată acum astfel:

flow8

Figura 7-a doua încercare de a defini un flux

Perfect spui. Viața e bună. Avem o definiție pentru un flux, nimic mai mult de văzut aici … dar stai, ce zici de direcția pachetelor?

a treia încercare – bidirecțională

un 5-tuplu este unidirecțional (unidirecțional). În mod implicit, se va potrivi doar pachetelor care călătoresc într-o singură direcție, deoarece pachetele în direcție inversă au transpus adrese IP și numere de port și, astfel, un hash diferit de 5 tupluri.

există motive întemeiate pentru a considera fluxurile ca bidirecționale, spre deosebire de unidirecționale, inclusiv capacitatea de a determina comportamentul clientului/serverului și de a calcula timpii de călătorie dus-întors, precum și îmbunătățirea detectării incidentelor de securitate, cum ar fi scanarea.

luați în considerare o conexiune TCP simplă în Figura 8 în care pachetele sări înainte și înapoi între gazda a & B:

flow9

figura 8 – diagrama scării unui flux TCP simplu

vedem o strângere de mână clasică TCP cu 3 căi (SYN, SYN+ACK, ACK) urmată de schimbul de date. Analiza fluxului unidirecțional la un punct de observație din rețea ar vedea două fluxuri separate, unul pe direcție, conform figurii 9:

flow10

Figura 9-scări unidirecționale pentru fluxul TCP simplu

problema cu măsurarea fluxului unidirecțional este că pierdem ocazia de a capta câteva metadate importante despre flux. Sigur, fiecare flux unidirecțional poate stoca metadate direcționale pentru octeți și pachete în acea direcție. Aceasta poate include sincronizarea între pachete (a se vedea punctele etichetate în Figura 9). Dar pierdem ocazia de a aduna metadate care necesită măsurarea parametrilor de trafic în ambele direcții.

luați în considerare observarea bidirecțională în Figura 10:

flow11a

Figura 10-scara observațiilor bidirecționale pentru fluxul TCP simplu

acum putem observa și măsura strângerea de mână TCP cu 3 căi (punctele F1, B1, F2) și să analizăm alte valori, cum ar fi timpii de răspuns.

pentru fluxurile bidirecționale, avem nevoie de două 5-tupluri, al doilea dintre care inversează ordinea tuplelor atât a adreselor IP, cât și a numerelor de port. Mai jos este un exemplu de flux SSH înainte și înapoi 5-tupluri:

flow12

Figura 11-inversarea unui 5-tuplu

corect, nu a fost prea dificil. Dar așteptați, se ascunde un mic detaliu care necesită o atenție suplimentară. Cum știm care este direcția înainte a fluxului? Determinăm direcția pe baza primului pachet observat, care se presupune că se deplasează în direcția client-server, dar acest lucru nu va fi 100% fiabil, deoarece pachetele ar putea fi nefuncționale și/sau observarea ar putea începe parțial printr-un flux. Vom folosi această metodă, dar trebuie să ne amintim când ne uităm la rezultate că nu este perfectă.

o metodă alternativă este inspectarea câmpurilor Protocolului de transport. În TCP, de exemplu, prezența doar a steagului SYN este un indicator rezonabil că pachetul este primul din flux.

definiția noastră pentru un flux este acum:

un flux este o secvență de pachete care transportă informații între două gazde în care pachetele au proprietăți comune:

  • toate pachetele din flux au același 5-tuplu sau 5-tuplu transpus

a patra încercare-inclusiv traficul IP non-TCP

până în acest moment am presupus că protocolul de transport este TCP. Ce zici de alte protocoale de transport IP?

UDP este alegerea evidentă pentru al doilea cel mai comun protocol de transport, în special odată cu creșterea traficului în timp real peste UDP, precum și a noilor protocoale, cum ar fi QUIC. UDP se potrivește cu ușurință în același model, deoarece are numere de port sursă și destinație, conform exemplului QUIC de mai jos:

flow13

Figura 12-inversarea unui UDP 5-tuple (la fel ca TCP)

Stream control Transmission Protocol (SCTP) este un alt protocol de transport care utilizează numere de port și funcționează astfel cu un 5-tuple.

dar cum rămâne cu alte protocoale, IPsec de exemplu?

IPsec ESP (Encapsulating Security Payload) este un protocol care nu include numere de port sursă/destinație, deci trebuie să revenim la un 3-tuplu, deoarece înțelegerea sarcinii utile a protocolului este puțin probabil să fie practică.

flow14

Figura 13 – bidirecțional 3-tuplu

definiția noastră pentru un flux este acum:

un flux este o secvență de pachete care transportă informații între două gazde în care pachetele au proprietăți comune:

  • pentru protocoalele de transport cu numere de port (adică TCP / UDP/SCTP):

toate pachetele din flux au același 5-tuplu sau 5-tuplu transpus

altceva:

toate pachetele din flux au același 3-tuplu sau 3-tuplu transpus

există totuși un alt factor de luat în considerare – timpul.

a cincea încercare – expirarea fluxului

un flux există doar pentru o anumită perioadă de timp. Este posibil ca același 5-tuplu (sau 3-tuplu) să poată fi reutilizat într-un moment diferit, pentru un flux diferit, între aceleași gazde.

luați în considerare două gazde în care una inițiază multe conexiuni TCP noi la cealaltă. Fiecare nouă conexiune TCP primește un nou port sursă, în general incrementat cu 1 din alocarea anterioară. IANA alocă intervalul 49152 la 65535 pentru aceste porturi efemere, oferind 16384 porturi. De-a lungul timpului, portul sursă TCP va trece prin interval și portul sursă original va fi reutilizat, iar acest flux va avea același 5-tuplu ca fluxul original. Aceasta prezintă o problemă, deoarece nu este același flux!

pentru a rezolva acest lucru avem nevoie de fluxuri care urmează să fie expirat în cazul în care nu pachete sunt văzute pentru mai mult de o anumită perioadă de timp. Iată-ne din nou:

un flux este o secvență de pachete care transportă informații între două gazde în care pachetele au proprietăți comune:

  • pentru protocoalele de transport cu numere de port (adică TCP/UDP / SCTP):

toate pachetele din flux împărtășesc același 5-tuplu sau transpus 5-tuplu

altceva:

toate pachetele din flux împărtășesc același 3-tuplu sau transpus 3-tuplu

  • toate timpii între pachete sunt mai mici decât valoarea timeout de expirare a fluxului arbitrar

a șasea încercare-parametri arbitrari

uneori este posibil să doriți parametri diferiți pentru a identifica fluxurile sau acestea vă pot fi forțate de tipul de hardware/software din rețea.

într-un router Cisco, de exemplu, fluxurile sunt identificate printr-un 7-Tuple care adaugă tip de serviciu (ToS) și sub-interfață de intrare la standardul 5-Tuple. Pot exista, de asemenea, situații în care câmpurile layer-2, cum ar fi adresa MAC sursă sau destinație, pot avea sens ca chei de flux (deși rețineți că acestea sunt semnificative doar local).

există alți parametri care ar putea fi utilizați ca proprietăți comune pentru identificarea fluxului; în cele din urmă, operatorul trebuie să decidă și capacitățile echipamentului. Pe baza acestui fapt, perfecționăm în continuare definiția:

un flux este o secvență de pachete care transportă informații între două gazde în care pachetele au proprietăți comune:

  • pentru protocoalele de transport cu numere de port (adică TCP / UDP/SCTP):

toate pachetele din fluxul împărtășesc aceeași 5-tuple sau transpuse 5-tuple

else:

toate pachetele din fluxul împărtășesc aceeași 3-tuple sau transpuse 3-tuple

  • toate timpii inter-pachete sunt mai mici decât arbitrare flux expirare valoare timeout
  • poate utiliza orice parametri arbitrare ca chei de flux, inclusiv ToS, interfață etc.

înfășurându-le pe toate

am arătat că producerea unei singure definiții atotcuprinzătoare a fluxului este o problemă dificilă. Definiția fluxului este specifică implementării, dependentă de cerințele utilizatorilor, precum și de capacitățile echipamentelor de rețea care măsoară fluxurile.

în partea 2 a acestui post pe blog vom intra în considerații suplimentare pentru fluxuri, cum ar fi etichetele de flux IPv6, fragmentarea (problema IPv4 și IPv6..), criptare, pachete non-IP și modul în care fluxurile sunt măsurate și utilizate în alte sisteme, cum ar fi SDN.

vedea: https://www.eecs.yorku.ca/course_archive/2015-16/W/3214/CSE3214_01_PacketCircuitSwitching_2016_posted_part2.pdf

pentru unele lucrări conexe, a se vedea: https://www.researchgate.net/profile/Brian_Trammell/publication/245587221_Bidirectional_Flow_Measurement_IPFIX_and_Security_Analysis/links/0f3175331dd3b49103000000/Bidirectional-Flow-Measurement-IPFIX-and-Security-Analysis.pdf și https://is.muni.cz/th/hilnn/cse2009.pdf

pentru RFC relevante, a se vedea: https://tools.ietf.org/html/rfc5103

pentru mai multe informații despre standardizarea QUIC, a se vedea: https://datatracker.ietf.org/wg/quic/about/

vezi: https://www.cisco.com/en/US/tech/tk812/technologies_white_paper09186a008022bde8.shtml

Leave a Reply