Chapter 29 datalink access
This presentation is the property of its rightful owner.
Sponsored Links
1 / 24

Chapter 29 Datalink Access PowerPoint PPT Presentation


  • 104 Views
  • Uploaded on
  • Presentation posted in: General

Chapter 29 Datalink Access. Tietoliikennetekniikan jatko-opintokurssi 2 Leo Rela. Datalink access. Nykyisissä käyttöjärjestelmissä ohjelmat pääsevat jo datalink-kerrokselle.

Download Presentation

Chapter 29 Datalink Access

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Chapter 29 datalink access

Chapter 29Datalink Access

Tietoliikennetekniikan jatko-opintokurssi 2

Leo Rela


Datalink access

Datalink access

  • Nykyisissä käyttöjärjestelmissä ohjelmat pääsevat jo datalink-kerrokselle.

  • Yhdistettynä interfacen promiscuous mode -tilaan, tämä mahdollistaa esim. tcpdump:n ja reverse arp:n toiminnan normaaleina ohjelmina.


Datalink access1

Datalink access

  • Kirjassa esiteltiin kolme tapaa, joilla ohjelmat pääsevät datalink –kerrokselle:

    • BSD Packet Filter (BPF)

    • SVR4 Datalink Provider Interface (DLPI)

    • Linux SOCK_PACKET (vanha) ja PF_PACKET (uusi)


Bsd packet filter bpf

BSD Packet Filter (BPF)

  • 4.4BSD ja moni BSD-pohjainen tukee.

  • Kernelissä ajuri kutsuu BPF:ää aina kun paketti on lähetetty tai vastaanotettu.

  • BPF:ää kutsutaan pakettia lähettäessä mahdollisimman myöhään ja vastaanottaessa mahdollisimman aikaisin jotta aikaleimat pysyisivät tarkkoina.

  • Ohjelmat antavat BPF:lle suodattimen (filter), jotta kernel voi kopioida ohjelmalle user spaceen vain halutut paketit.


Bsd packet filter bpf1

BSD Packet Filter (BPF)

Esimerkki-filteri:

  • tcp and port 80 and tcp[13:1] & 0x7 != 0

  • (vain tcp segmentit joissa src/dst port 80, SYN, FIN tai RST lippu).

  • Lippujen luku: tcp[13:1] viittaa tcp headerin tavuun 1 kohdasta 13.

  • Filtereitä voidaan luoda BPF:n omalla konekielellä tai kääntää sellaisiksi asciista (kuten ylempi esimerkki)


  • Bsd packet filter bpf2

    BSD Packet Filter (BPF)

    • BPF vähentää overheadia:

      • filteröinti tapahtuu kernelissä

      • vain osa paketista välitetään ohjelmalle (snaplen)

      • data välitetään ohjelmalle puskuroituna, vajaa puskuri voidaan lähettää ohjelmalle kun timeout -arvo ylittyy.

      • esim RARP:lla timeout 0 jotta se voi lähettää vastauksen heti kun saa pyynnön.

      • toisaalta puskurin käyttö vähentää tehtävien systeemikutsujen määrää.


    Bsd packet filter bpf3

    BSD Packet Filter (BPF)

    • BPF:ään voidaan lukea ja kirjoittaa. Kirjoittamista tarvitaan vain kun halutaan tehdä paketteja jotka eivät ole IP-datagrammeja.

    • BPF:ää käytetään avaamalla /dev/bpf0, jos tulee error EBUSY niin yritetään /dev/bpf1 jne.

    • ioctl:ää käytetään devicen konfigurointiin, esim. timeoutit ja puskurin asetus. Myös promiscous mode asetetaan tässä.


    Svr4 datalink provider interface dlpi

    SVR4 Datalink Provider Interface (DLPI)

    • SVR4:ssä.

    • Voidaan käyttää:

      • Luetaan yhdestä devicestä, haluttu interface määrätään (DL_ATTACH_REQ)

      • Luetaan inteface-kohtaisesta devicestä.

    • Luettavaan streamiin liittyy kaksi moduulia:

      • pfmod (filtering) ja bufmod (puskurointi).

      • Molemmat toimivat saman tapaisesti kun BPF:n kohdalla, eli kernelissä.


    Svr4 datalink provider interface dlpi1

    SVR4 Datalink Provider Interface (DLPI)

    • Filteröinnin hoitava pseudokone pfmod filterissä on boolean puu.

    • BPF:n filter on suunnattu asyklinen graafi.

    • Kirjan lähteen mukaan jälkimmäinen on 3..20 kertaa nopeampi.

    • BPF:ssä filteröintipäätös tehdään ennenkö paketi kopioidaan, joissain DLPI toteutuksissa paketti saatetaan kopioida pfmod:lle jonka filteröinti hylkää sen.


    Linux sock packet vanha ja pf packet uusi

    Linux SOCK_PACKET (vanha) ja PF_PACKET (uusi)

    • Molemmissa vaaditaan oikeudet luoda raw socket (lähinnä root).

    • Uusissa toteutuksissa luodaan PF_PACKET -socket ja tyypiksi joko SOCK_DGRAM ("cooked" packets ilman linkkikerroksen headereita) tai SOCK_RAW täydelliselle linkkikerroksen lukemiselle.


    Linux sock packet vanha ja pf packet uusi1

    Linux SOCK_PACKET (vanha) ja PF_PACKET (uusi)

    • Esim kaikki framet linkkikerrokselta saadaan sockeilta:

      • fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

    • Jos halutaan esim vain IPv4 framet niin ETH_P_IP. Tämä voidaan asettaa myös esim ETH_P_ARP tai ETH_P_IPV4.

    • Jos datalink tukee promiscuous moodia (esim ethernetin tapauksessa) niin se on asetettava.


    Linux sock packet vanha ja pf packet uusi2

    Linux SOCK_PACKET (vanha) ja PF_PACKET (uusi)

    • Kirjassa on listattu tämän eroja BPF:ään ja DLPI:hin:

      • Linuxissa ei kernel bufferia ja kernel filterin on vain uusimmissa toteutuksissa. Receive buf löytyy, mutta se voi käsitellä vain yhtä framea kerrallaan - luetan siis frame kerrallaan. Tämä lisää overheadia.

      • SOCK_PACKET (vanha) ei voi filteröidä interfacen/devicen perusteella, esim. jos ETH_P_IP tapauksessa saadaan kaikki paketit interfaceiltä, ppp:ltä, slipiltä jne. Recvfrom fktiolta saadaan kuitenkin sa_data jäsenenä devicen nimi, ja ohjelma voi itse käsitellä vain tietyt devicet.


    Libpcap packet capture library

    libpcap Packet Capture Library

    • Tarjoaa toteutusriippumattoman apin alempien kerrosten lukemiselle, eli lähinnä linkkikerrokselle.

    • Tuki löytyy

      • BPF: BSD-kerneleille

      • DLPI: HP-UX ja Solaris 2.x:lle,

      • NIT:lle (SunOS 4.1.x)

      • Linuxille (SOCK_PACKET ja PF_PACKET)


    Libnet packet creation and injection library

    libnet - Packet Creation and Injection Library

    • Provides an interface to craft and inject arbitrary packets into the network.

    • Tukee sekä raw socket että datalink.

    • Helpottaa IP, UDP ja TCP -otsikoiden käsittelyä.


    Udp checksum field

    UDP Checksum Field

    Luvun esimerkkiohjelma tekee dns-kyselyn (udp) ja lukee vastauksen käyttämällä libpcap:ia. Tarkoitus on tarkastaa, käyttääkö nimipalvelin udp tarkastussummaa.

    IPv4:ssä tarkastussumma on valinnainen ja nykyiset käyttöjärjestelmät käyttävät sitä oletuksena, mutta vanhemmat, esim SunOS 4.1 ei. Nimipalvelimissa tarkastusta pitäis käyttää, koska korruptoituneet datagrammit voivat korruptoida nimipalvelimen tietokannan.

    UDP tarkistussummaa ei voida saada selville normaalisti UDP socketista lukemalla tai raw socketista, vaan luetaan datagrammit linkkikerrokselta.


    Udp checksum field1

    UDP Checksum Field

    Kuvissa 29.6-8 on pääohjelma.

    Parametrit:

    -lpaikallinen (source) osoite datagrammille

    -iinterface johon dns:n vastaus tulisi

    Source-osoite halutaan tietää, koska ohjelmassa luodaan itse IP ja UDP headerit.

    Ohjelma toteutetaan kolmessa funktiossa:

    open_output(); // open output, either raw socket or libnet

    open_pcal();// open packet capture device

    test_udp();// suorittaa itse DNS-testin


    Udp checksum field2

    UDP Checksum Field

    Ohjelma suorittaa setuidin, koska raw socketin teko vaatii rootin oikeuksia. Lisäksi pääohjelmassa luodaan signal handlerit käyttäjän tekemää keskeyttämistä varten (TERM, INT, HUP).

    open_pcap –funktion:

    Jos käyttäjä ei antanut interfacea, ohjelma valitsee alimman ei-loopback –interfacen. Tämän jälkeen avataan device (pcap_open_live), jossa parametrina annetaan interface, snaplen, promiscuous mode, timout ja osoitin virheilmoarrayhyn.

    pcap_compile ottaa filter stringin ja kääntää sen filterin konekieleksi. Asetettu filteri päästää läpi vain halutut, eli DNS-vastaukset. pcap_setfilter lataa tehdyn filterin capture deviceen.


    Udp checksum field3

    UDP Checksum Field

    Tämän jälkeen pääohjelma kutsuu test_udp.

    test_udp asettaa signal handlerin SIGALRM:lle timeoutia varten, eli kun ei olla saatu vastausta DNS:ltä vielä - ”ikinä”. Ensimmäisen timeoutin jälkeen suoritetaan DNS-kysely vielä max. 2 kertaa, timeout-arvoa tuplatessa: 3, 6 ja 12 s.

    Itse kysely lähetetään send_dns_query –funktiolla.


    Udp checksum field4

    UDP Checksum Field

    send_dns_query –funktio (kuva 29.12) rakentaa UDP datagrammin. Datagrammissa oleva DNS-kysely kysyy nimen a.root-servers.net osoitteita.

    open_output funktio (kuva 29.13) luo raw-socketin ja asettaa sockoptiot:

    rawfd = Socket(dest->sa_family, SOCK_RAW, 0)

    Setsockopt(rawfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));

    Sockoptioissa asetetaan IP_HDRINCL joka mahdollistaa oman IP –headerin teon.


    Udp checksum field5

    UDP Checksum Field

    Kun raw-socket on luotu, udp_write –funktiolla rakennetaan lopulliset UDP ja IP headerit ja kirjoitetaan IP daragrammi luotuun raw-socketiin.

    udp_write on kuvassa 29.14.

    Funktiossa täytetään struct udpiphdr *ui ja struct ip *ip kun koko socketiin kirjoitettava data on char *buf.

    Riveillä 32-45 luodaan UDP checksum –arvo, joka luodaan UDP headerista ja datasta. Myös IP headerista otetaan kenttiä mukaan, jotta voidaan varmistua että datagram lähettiin oikeaan paikkaan.

    Riveillä 46-59 asetetaan IP headeriin arvot. Tämä pitää tehdä, koska sock opt IP_HDRINCL –asetettiin luotuun socketiin.

    Funktio käyttää lopussa Sendto –funktiota joka kirjoittaa luotuun socketiin luodun IP-datagrammin datan (char *buf)


    Udp checksum field6

    UDP Checksum Field

    udp_read -funktio (kuva 29.15)

    Funktiossa on ikilooppi joka saa next_pcap –funktiolla pointerin kohtaan josta seuraava saatu IP datagrammi voidaan lukea.

    Koska datalink –tason header voi devicestä riippuen olla erilainen (lähinnä eri kokoinen), kutsutaan valintarakenteessa udp_check –funktio sen mukaisesti, mikä on devicen tyyppi. esim 10 ja 100 M ethernetille pcap_datalink antaa DLT_EN10MB.


    Udp checksum field7

    UDP Checksum Field

    udp_check –funktio (kuva 29.19) tarkistaa UDP-headerin alkaen annetusta IP datagrammiin osoittavasta pointterista.

    Jos kaikki arvot ok, palautetaan osoitin struct udpiphdr *ui. Ajo palaa takaisinpäin aina test_udp –funktioon asti, jossa katsotaan structissa ui_sum –jäsenen arvoa. Jos 0 niin UDP checksummia ei ole, muutoin päällä. Käyttäjälle kerrotaan checksummin mahdollisesti olemisesta ja palataan pääohjelmaan jossa ohjelma lopetetaan.


    Udp checksum field ja libnet

    UDP Checksum Field ja libnet

    Kirjassa esiteltiin äskeinen ohjelma niin, että käytetään libnet –kirjastoa. Libnetiä käytettäessä kirjassa esiteltiin uusi libnetiä käyttävä send_dns_query –funktio joka tekee DNS queryn sisältävän datagrammin ja lähettää sen. Libnetiä käyttävä send_dns_query ei kutsu udp_write –funktiota, joka kutsui taas useampaa ohjelmaan kuuluvaa funktiota. Libnetiä käyttäessä kirjoitettavaa koodia on vähemmän.


    Yhteenveto

    Yhteenveto

    Raw –socketeja käytettäessä voidaan lukea ja kirjoittaa IP –datagrammeja joita kernel ei ymmärrä.

    Datalink –kerroksella toimiessa voidaan lukea ja kirjoittaa minkälaisia kerroksen frameja tahansa – ei siis pelkästään IP datagrammeja.

    Eri käyttöjärjestelmissä datalink –kerroksen käyttö voi olla hyvinkin erilaista, mutta esim. libpcap –kirjastoa käytettäessä ei erikoista tarvitse välittää.


  • Login