Vad är ett Nätverkstrafikflöde?

traffic_wide

nätverkstrafikflöden (flöden) är användbara för att bygga en grovkornig förståelse av trafik i ett datanätverk, vilket ger en bekväm enhet för mätning och/eller behandling av trafik.

flöden kan mätas för att förstå vad värdar pratar i nätverket, med detaljer om adresser, volymer och typer av trafik. Denna syn på nätverket kan vara användbar för felsökning, detektering av säkerhetsincidenter, planering och fakturering

men vad exakt är ett flöde och hur definieras det?

denna fråga låter trivial att svara på, men när vi gräver djupare hittar vi nyanser och hörnfall som gör flöden intressanta och i slutändan svåra att definiera.

Bakgrund

för att verkligen förstå flöden måste vi börja med lite bakgrund.

nätverk började som kretskopplade. När en värd ville kommunicera med en annan värd frågade det nätverket att skapa en krets. Efter att informationsflödet hade avslutats revs kretsen.

flow2

Figur 1-exempel Kretskopplat nätverk

kretskopplade nätverk har sitt arv i telefonnät. De har ett antal nackdelar, inklusive dålig skalbarhet och lågt kapacitetsutnyttjande.

ett alternativ behövdes för att bygga det som i slutändan blev Internet-paketkopplade nätverk. Meddelanden hakas upp i bitar med varierande storlek som adresseras individuellt och skickas som paket över nätverket.

flow3

Figur 2-Exempel Paketkopplat nätverk

den mottagande värden återmonterar nyttolasten från paketen tillbaka till meddelandet. Paket kan också innehålla kontrollinformation, till exempel flödeskontroll och banor behöver inte vara symmetriska.

att definiera flöden i ett kretskopplat nätverk är enkelt eftersom kretsen är ett flöde och följer ett protokoll för att upprätta och avveckla (krets = flöde); men i ett paketkopplat nätverk är saker mindre uppenbara.

Föreställ dig för en sekund att du befinner dig vid observationspunkt A i det kretskopplade nätverket i Figur 1, skulle du se:

flow4

Figur 3-zooma in på Kretskopplat nätverk

två flöden skulle observeras-kretsar mellan värdar 3 & 4 och värdar 5 & 6. Att observera flöden i ett kretskopplat nätverk är relativt enkelt eftersom nätverket är involverat i att ställa in kretsarna, så vet deras tillstånd och slutpunkterna.

Föreställ dig nu att du befinner dig vid observationspunkt A i det paketkopplade nätverket i Figur 2 istället skulle du se:

flow5

Figur 4-zooma in på Paketkopplat nätverk

plötsligt är saker mindre tydliga. Det finns ett paket som kommer in från värd 5 avsedd för värd 6. Förutsatt att vi observerar under en tid ser vi fler paket anländer och avgår. Att observera flöden på ett paketkopplat nätverk tar tid och kräver inspelning och analys av paketinformation.

första (naiva) försöket att definiera ett flöde

med hjälp av vår kunskap om paketkopplade nätverk kan ett första försök att svara ‘Vad är ett flöde’ vara:

ett flöde är en sekvens av paket som bär information mellan två värdar

denna definition ser ut som:

flow6

Figur 5 – första försöket att definiera ett flöde

det finns dock ett problem. Vad händer om det händer mer än en typ av kommunikation mellan värdarna, till exempel har A en SSH-och HTTPS-anslutning till B? Är SSH-och HTTPS-paketen en del av samma flöde? Intuitivt säger Vi nej, de är olika sessioner och till och med helt olika protokoll. Vi kan göra bättre…

andra försök att definiera

vad sägs om att vi använder protokollinformation från pakethuvuden som vanliga egenskaper för att identifiera paket i flöden? Detta kommer att separera olika typer av anslutningar i olika flöden.

en stor del av paket i ett nätverk kommer sannolikt att vara IP layer – 3-protokoll, med TCP eller UDP som layer-4-transportprotokoll. Det är därför rimligt att överväga att använda TCP-och UDP-parametrar som flödestangenter från pakethuvudena.

vi använder 5 parametrar från pakethuvudena; källa IP, destination IP, protokoll, TCP eller UDP källport och TCP eller UDP destinationsport som en ordnad lista, allmänt känd som 5-tuple, som de gemensamma egenskaperna för att kartlägga paketen till flöden.

flow7

Figur 6-exempel 5-tupel

här går försök 2:

ett flöde är en sekvens av paket som bär information mellan två värdar, där paket har gemensamma egenskaper:

  • alla paket i flödet delar samma 5-tupel

vårt scenario ser nu ut så här:

flow8

Figur 7-sekunders försök att definiera ett flöde

perfekt du säger. Livet är bra. Vi har en definition för ett flöde, inget mer att se här … men hänga på, hur är det med paketets riktning?

tredje försöket-dubbelriktad

en 5-tupel är enkelriktad (enkelriktad). Som standard matchar det bara paket som reser i en riktning, eftersom paket i omvänd riktning har transponerat IP-adresser och portnummer, och därmed en annan 5-tuple-hash.

det finns goda skäl att betrakta flöden som Dubbelriktade i motsats till enkelriktade, inklusive förmåga att bestämma klient/serverbeteende och beräkna tur-och returtider samt förbättra detektering av säkerhetsincidenter som skanning.

Tänk på en enkel TCP-anslutning i Figur 8 där paket studsar fram och tillbaka mellan värd a & B:

flow9

figur 8-Stegdiagram över ett enkelt TCP-flöde

vi ser ett klassiskt TCP 3-vägs handslag (SYN, SYN+ACK, ACK) följt av utbyte av data. Enkelriktad flödesanalys vid en observationspunkt i nätverket skulle se två separata flöden, en per riktning, enligt Figur 9:

flow10

Figur 9-enkelriktade stegar för enkelt TCP-flöde

problemet med enkelriktad flödesmätning är att vi missar möjligheten att fånga några viktiga metadata om flödet. Visst, varje enkelriktat flöde kan lagra riktningsmetadata för byte och paket i den riktningen. Detta kan inkludera inter-packet timing (se märkta punkter i Figur 9). Men vi missar möjligheten att samla metadata som kräver mätning av trafikparametrar i båda riktningarna.

överväga dubbelriktad observation i Figur 10:

flow11a

Figur 10-stege av Dubbelriktade observationer för enkelt TCP-flöde

vi kan nu observera och mäta TCP 3-vägs handskakning (punkterna F1, B1, F2) och titta på andra mätvärden som svarstider.

för Dubbelriktade flöden behöver vi två 5-tuplar, varav den andra vänder tupelordningen för både IP-adresserna och portnumren. Nedan är ett exempel på SSH flöde framåt och bakåt 5-tuples:

flow12

Figur 11-att vända en 5-tupel

rätt, det var inte för svårt. Men vänta, en liten detalj lurar som kräver ytterligare uppmärksamhet. Hur vet vi vad som är flödesriktningen framåt? Vi bestämmer riktningen baserat på det första observerade paketet, vilket antas resa i klienten till serverns riktning, men det kommer inte att vara 100% pålitligt eftersom paket kan vara i ordning och/eller observationen kan börja delvis genom ett flöde. Vi kommer att använda med den här metoden, men måste komma ihåg när vi tittar på resultat att det inte är perfekt.

en alternativ metod är att inspektera transportprotokollfält. I TCP till exempel är närvaron av bara SYN-flaggan en rimlig indikator på att paketet är det första i flödet.

vår definition för ett flöde är nu:

ett flöde är en sekvens av paket som bär information mellan två värdar där paket har gemensamma egenskaper:

  • alla paket i flödet delar samma 5-tupel eller transponerade 5-tupel

fjärde försöket-inklusive icke-TCP IP-trafik

fram till denna punkt har vi antagit att transportprotokollet är TCP. Vad sägs om andra IP – transportprotokoll?

UDP är det självklara valet för näst vanligaste transportprotokoll, särskilt med ökningen av realtidstrafik över UDP samt nya protokoll som QUIC. UDP passar lätt in i samma modell som den har käll-och destinationsportnummer, enligt QUIC-exemplet nedan:

flow13

Figur 12-reversering av en UDP 5-tupel (samma som TCP)

Stream Control Transmission Protocol (SCTP) är ett annat transportprotokoll som använder portnummer och därmed fungerar med en 5-tupel.

men hur är det med andra protokoll, till exempel IPsec?

IPsec ESP (Encapsulating Security Payload) är ett protokoll som inte innehåller käll-/destinationsportnummer, så vi måste falla tillbaka till en 3-tupel eftersom det är osannolikt att det är praktiskt att förstå nyttolasten för protokollet.

flow14

figur 13-dubbelriktad 3-tupel

vår definition för ett flöde är nu:

ett flöde är en sekvens av paket som bär information mellan två värdar där paket har gemensamma egenskaper:

  • för transportprotokoll med portnummer (dvs. TCP / UDP / SCTP):

alla paket i flödet delar samma 5-tupel eller transponerade 5-tupel

annars:

alla paket i flödet delar samma 3-tupel eller transponerade 3-tupel

det finns dock ännu en faktor att tänka på – tid.

femte försöket-Flödesutgång

ett flöde existerar endast under en viss tid. Det är möjligt att samma 5-tupel (eller 3-tupel) kan återanvändas vid en annan tidpunkt, för ett annat flöde, mellan samma värdar.

Tänk på två värdar där en initierar många nya TCP-anslutningar till den andra. Varje ny TCP-anslutning får en ny källport, i allmänhet inkrementerad med 1 från föregående tilldelning. IANA fördelar intervallet 49152 till 65535 för dessa flyktiga portar, vilket ger 16384 portar. Med tiden kommer TCP-Källporten att rulla genom intervallet och den ursprungliga Källporten återanvändas, och detta flöde kommer att ha samma 5-tupel som det ursprungliga flödet. Detta utgör ett problem, eftersom det inte är samma flöde!

för att lösa detta behöver vi flöden som löper ut där inga paket ses under mer än en viss tid. Här går vi igen:

ett flöde är en sekvens av paket som bär information mellan två värdar där paket har gemensamma egenskaper:

  • för transportprotokoll med portnummer (dvs TCP/UDP/SCTP):

alla paket i flödet delar samma 5-tupel eller transponerade 5-tupel

annat:

alla paket i flödet delar samma 3-tupel eller transponerade 3-tupel

  • alla interpakettider är mindre än godtyckligt flödesutgångstidsvärde

sjätte försöket-godtyckliga parametrar

ibland kanske du vill ha olika parametrar för att identifiera flöden, eller dessa kan tvingas på dig av typen av hårdvara/programvara i nätverket.

i en Cisco-router identifieras flöden av en 7-tupel som lägger till Typ av tjänst (ToS) och inmatningsundergränssnitt till standard 5-tupel. Det kan också finnas situationer där layer-2-fält, till exempel käll-eller destinations-MAC-adress, kan vara meningsfulla som flödestangenter (även om de bara är lokalt signifikanta).

det finns andra parametrar som kan användas som gemensamma egenskaper för flödesidentifiering; det är i slutändan upp till operatören att bestämma och utrustningens kapacitet. Baserat på detta förfinar vi definitionen ytterligare:

ett flöde är en sekvens av paket som bär information mellan två värdar där paket har gemensamma egenskaper:

  • för transportprotokoll med portnummer (dvs. TCP / UDP / SCTP):

alla paket i flödet delar samma 5-tupel eller transponerade 5-tupel

annars:

alla paket i flödet delar samma 3-tupel eller transponerade 3-tupel

  • alla inter-pakettider är mindre än godtyckligt flöde utgången timeout värde
  • kan använda godtyckliga parametrar som flödestangenter, inklusive ToS, gränssnitt etc.

förpackning av allt

vi har visat att det är ett svårt problem att producera en enda allomfattande flödesdefinition. Flödesdefinitionen är implementeringsspecifik, beroende av användarkrav samt kapaciteten hos nätverksutrustning som mäter flödena.

i del 2 i detta blogginlägg kommer vi att gå in på ytterligare överväganden för flöden som IPv6-flödesetiketter, fragmentering (IPv4 och IPv6-problem..), kryptering, icke-IP-paket och hur flöden mäts och används i andra system som SDN.

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

för vissa relaterade artiklar, se: 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 och https://is.muni.cz/th/hilnn/cse2009.pdf

för relevant RFC, se: https://tools.ietf.org/html/rfc5103

för mer information om standardisering av QUIC, se: https://datatracker.ietf.org/wg/quic/about/

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

Leave a Reply