Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so2:laboratoare:lab10 [2018/05/01 18:38]
anda.nicolae [Structura sk_buff]
so2:laboratoare:lab10 [2019/05/06 10:20] (current)
liza_elena.babu [Structura socket]
Line 30: Line 30:
 ===== Noțiuni teoretice ===== ===== Noțiuni teoretice =====
  
-Dezvoltarea Internet-ului a dus la creșterea exponențială a aplicațiilor de rețea și, drept  consecință,​ la creșterea cerințelor de viteza și productivitate a subsistemului de rețea (networking) al unui sistem de operare. Subsistemul de networking nu este o componentă esențială a nucleului unui sistem de operare (kernel-ul ​de Linux poate fi compilat fără suport de rețea). Este, însă, destul de puțin probabil pentru un sistem de calcul (sau chiar un dispozitiv embedded) să conțină un sistem de operare fără suport de rețea, datorită nevoii de conectivitate. Atât sistemele Linux (Unix), cât și Windows folosesc [[http://​en.wikipedia.org/​wiki/​TCP/​IP_model|stiva TCP/IP]]. Nucleul acestora va conține implementate protocoalele până la nivelul transport inclusiv, urmând ca protocoalele de nivel aplicație să fie implementate în user-space (HTTP, FTP, SSH, etc.).+Dezvoltarea Internet-ului a dus la creșterea exponențială a aplicațiilor de rețea și, drept  consecință,​ la creșterea cerințelor de viteza și productivitate a subsistemului de rețea (networking) al unui sistem de operare. Subsistemul de networking nu este o componentă esențială a nucleului unui sistem de operare (kernel-ul Linux poate fi compilat fără suport de rețea). Este, însă, destul de puțin probabil pentru un sistem de calcul (sau chiar un dispozitiv embedded) să conțină un sistem de operare fără suport de rețea, datorită nevoii de conectivitate. Atât sistemele Linux (Unix), cât și Windows folosesc [[http://​en.wikipedia.org/​wiki/​TCP/​IP_model|stiva TCP/IP]]. Nucleul acestora va conține implementate protocoalele până la nivelul transport inclusiv, urmând ca protocoalele de nivel aplicație să fie implementate în user-space (HTTP, FTP, SSH, etc.).
  
 ==== Networking în user-space ==== ==== Networking în user-space ====
Line 258: Line 258:
  int (*getname) ​  ​(struct socket *sock,  int (*getname) ​  ​(struct socket *sock,
        struct sockaddr *addr,        struct sockaddr *addr,
-       ​int *sockaddr_len, ​int peer);+       int peer);
  //...  //...
 </​code>​ </​code>​
Line 271: Line 271:
 </​code>​ </​code>​
  
-Se va realiza astfel instanțierea pointerilor de funcții cu apeluri specifice tipului de protocol asociat socket-ului. Apelurile [[https://​elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L2512|sock_register]] și [https://​elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L2545|sock_unregister]] sunt folosite pentru completarea vectorului [[https://​elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L158|net_families]].+Se va realiza astfel instanțierea pointerilor de funcții cu apeluri specifice tipului de protocol asociat socket-ului. Apelurile [[https://​elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L2512|sock_register]] și [[https://​elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L2545|sock_unregister]] sunt folosite pentru completarea vectorului [[https://​elixir.bootlin.com/​linux/​v4.15/​source/​net/​socket.c#​L158|net_families]].
  
 Pentru restul operațiilor cu socketi (în afară de creare, închidere și transmitere/​recepție mesaj, prezentate mai sus, în secțiunea [[#​Operații asupra structurii socket|Operații asupra structurii socket]]), se vor apela funcțiile date de pointerii din această structură. Spre exemplu, pentru operația ''​bind'',​ care asociază unui socket un port pe mașina locală, vom avea următoarea secvență de cod: Pentru restul operațiilor cu socketi (în afară de creare, închidere și transmitere/​recepție mesaj, prezentate mai sus, în secțiunea [[#​Operații asupra structurii socket|Operații asupra structurii socket]]), se vor apela funcțiile date de pointerii din această structură. Spre exemplu, pentru operația ''​bind'',​ care asociază unui socket un port pe mașina locală, vom avea următoarea secvență de cod:
Line 364: Line 364:
 Structura [[https://​elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​skbuff.h#​L585|struct sk_buff]] (//socket buffer//) descrie un pachet de rețea. Câmpurile structurii conțin informații atât despre antetele și conținutul pachetelor cât și protocoalele utilizate, dispozitivul de rețea utilizat, pointeri către celelalte structuri ''​struct sk_buff''​. O descriere sumară a conținutului structurii este prezentată mai jos: Structura [[https://​elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​skbuff.h#​L585|struct sk_buff]] (//socket buffer//) descrie un pachet de rețea. Câmpurile structurii conțin informații atât despre antetele și conținutul pachetelor cât și protocoalele utilizate, dispozitivul de rețea utilizat, pointeri către celelalte structuri ''​struct sk_buff''​. O descriere sumară a conținutului structurii este prezentată mai jos:
 <code c> <code c>
-struct sk_buff { 
 struct sk_buff { struct sk_buff {
  union {  union {
Line 549: Line 548:
  
 Pentru conversie există urmatoarele macrodefiniții:​ Pentru conversie există urmatoarele macrodefiniții:​
-  * ''​u16 ''​[[http://lxr.free-electrons.com/​source/​include/​linux/​byteorder/​generic.h?v=4.9#L140|htons]]''​(u16 x)''​+  * ''​u16 ''​[[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​byteorder/​generic.h#​L141|htons]]''​(u16 x)''​
     * convertește un întreg pe 16 biți din host byte-order în network byte-order (//host to network short//)     * convertește un întreg pe 16 biți din host byte-order în network byte-order (//host to network short//)
-  * ''​u32 ''​[[http://lxr.free-electrons.com/​source/​include/​linux/​byteorder/​generic.h?v=4.9#L138|htonl]]''​(u32 x)''​+  * ''​u32 ''​[[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​byteorder/​generic.h#​L139|htonl]]''​(u32 x)''​
     * convertește un întreg pe 32 de biți din host byte-order în network byte-order (//host to network long//)     * convertește un întreg pe 32 de biți din host byte-order în network byte-order (//host to network long//)
-  * ''​u16 ''​[[http://lxr.free-electrons.com/​source/​include/​linux/​byteorder/​generic.h?v=4.9#​L141|ntohs]]''​(u16 x)''​+  * ''​u16 ''​[[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​byteorder/​generic.h#​L141|ntohs]]''​(u16 x)''​
     * convertește un întreg pe 16 biți din network byte-order în host byte-order (//network to host short//)     * convertește un întreg pe 16 biți din network byte-order în host byte-order (//network to host short//)
-  * ''​u32 ''​[[http://lxr.free-electrons.com/​source/​include/​linux/​byteorder/​generic.h?v=4.9#​L139|ntohl]]''​(u32 x)''​+  * ''​u32 ''​[[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​byteorder/​generic.h#​L139|ntohl]]''​(u32 x)''​
     * convertește un întreg pe 32 de biți din network byte-order în host byte-order (//network to host long//)     * convertește un întreg pe 32 de biți din network byte-order în host byte-order (//network to host long//)
  
Line 564: Line 563:
 În kernel-ul Linux, captura de pachete folosind netfilter se realizează prin atașarea unor hook-uri. Hook-urile pot fi precizate în diferite locații din traseul urmat de un pachet de rețea în kernel, în funcție de necesitate. O organigramă cu traseul urmat de un pachet și zonele posibile de plasare a unui hook găsiți [[http://​linux-ip.net/​nf/​nfk-traversal.png|aici]]. În kernel-ul Linux, captura de pachete folosind netfilter se realizează prin atașarea unor hook-uri. Hook-urile pot fi precizate în diferite locații din traseul urmat de un pachet de rețea în kernel, în funcție de necesitate. O organigramă cu traseul urmat de un pachet și zonele posibile de plasare a unui hook găsiți [[http://​linux-ip.net/​nf/​nfk-traversal.png|aici]].
  
-Header-ul inclus atunci când se folosește netfilter este [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9|linux/​netfilter.h]].+Header-ul inclus atunci când se folosește netfilter este [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h|linux/​netfilter.h]].
  
-Un hook se definește prin intermediul structurii [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9#L65|struct nf_hook_ops]]:​ <code c>+Un hook se definește prin intermediul structurii [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h#​L64|struct nf_hook_ops]]:​ <code c>
 struct nf_hook_ops { struct nf_hook_ops {
- struct list_head ​       list; 
- 
  /* User fills in from here down. */  /* User fills in from here down. */
  nf_hookfn ​              ​*hook;​  nf_hookfn ​              ​*hook;​
Line 581: Line 578:
 </​code>​ </​code>​
  
-În cadrul structurii [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9#L65|struct nf_hook_ops]],​ ''​pf''​ este tipul pachetului ([[http://lxr.free-electrons.com/​source/​include/​linux/​socket.h?v=4.9#L212|PF_INET]], etc.). ''​priority''​ este prioritatea;​ prioritățile sunt definite în [[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​netfilter_ipv4.h?v=4.9|uapi/​linux/​netfilter_ipv4.h]]:<​code c>+În cadrul structurii [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h#​L64|struct nf_hook_ops]],​ ''​pf''​ este tipul pachetului ([[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​socket.h#​L217|PF_INET]], etc.). ''​priority''​ este prioritatea;​ prioritățile sunt definite în [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​netfilter_ipv4.h|uapi/​linux/​netfilter_ipv4.h]]:<​code c>
 enum nf_ip_hook_priorities { enum nf_ip_hook_priorities {
  NF_IP_PRI_FIRST = INT_MIN,  NF_IP_PRI_FIRST = INT_MIN,
Line 602: Line 599:
 ''​net_device''​ reprezintă dispozitivul (interfața de rețea) pe care se dorește realizată captura. ''​net_device''​ reprezintă dispozitivul (interfața de rețea) pe care se dorește realizată captura.
  
-În momentul în care un pachet este capturat, modul de prelucrare este definit de câmpurile ''​hooknum''​ și ''​hook''​. ''​hooknum''​ este tipul de hook utilizat; pentru IP, tipurile de hook-uri sunt definite în [[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​netfilter.h?v=4.9|linux/​netfilter.h]]:<​code c>+În momentul în care un pachet este capturat, modul de prelucrare este definit de câmpurile ''​hooknum''​ și ''​hook''​. ''​hooknum''​ este tipul de hook utilizat; pentru IP, tipurile de hook-uri sunt definite în [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​netfilter.h|linux/​netfilter.h]]:<​code c>
 enum nf_inet_hooks { enum nf_inet_hooks {
  NF_INET_PRE_ROUTING,​  NF_INET_PRE_ROUTING,​
Line 613: Line 610:
 </​code>​ </​code>​
  
-''​hook''​ este handler-ul apelat in momentul capturării unui pachet de rețea (pachet transmis în forma unei structuri ''​struct sk_buff''​). Câmpul ''​priv''​ reprezintă o informație privată transmisă handler-ului. Prototipul handler-ului de captură este definit de tipul [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9#L62|nf_hookfn]]:​ <code c>+''​hook''​ este handler-ul apelat in momentul capturării unui pachet de rețea (pachet transmis în forma unei structuri ''​struct sk_buff''​). Câmpul ''​priv''​ reprezintă o informație privată transmisă handler-ului. Prototipul handler-ului de captură este definit de tipul [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h#​L61|nf_hookfn]]:​ <code c>
 struct nf_hook_state { struct nf_hook_state {
  unsigned int hook;  unsigned int hook;
- int thresh; 
  u_int8_t pf;  u_int8_t pf;
  struct net_device *in;  struct net_device *in;
Line 622: Line 618:
  struct sock *sk;  struct sock *sk;
  struct net *net;  struct net *net;
- struct nf_hook_entry __rcu *hook_entries;​ 
  int (*okfn)(struct net *, struct sock *, struct sk_buff *);  int (*okfn)(struct net *, struct sock *, struct sk_buff *);
 }; };
Line 632: Line 627:
 </​code>​ </​code>​
  
-În cazul funcției de captură de tipul [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9#L62|nf_hookfn]],​ câmpul ''​priv''​ reprezintă informația privată cu care a fost inițializată structura de tipul [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9#L65|struct nf_hook_ops]]. ''​skb''​ este pointer la pachet-ul de rețea capturat; pe baza informațiilor din ''​skb''​ se iau deciziile de filtrare a pachetului. Parametrul ''​state''​ al funcției reprezintă informațiile de stare legate de captura pachetului, incluzând interfața de intrare, interfața de ieșire, prioritatea,​ numărul hook-ului. Prioritatea și numărul hook-ului sunt utile pentru a permite ca aceeași funcție să fie apelată de mai multe hook-uri.+În cazul funcției de captură de tipul [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h#​L61|nf_hookfn]],​ câmpul ''​priv''​ reprezintă informația privată cu care a fost inițializată structura de tipul [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h#​L64|struct nf_hook_ops]]. ''​skb''​ este pointer la pachet-ul de rețea capturat; pe baza informațiilor din ''​skb''​ se iau deciziile de filtrare a pachetului. Parametrul ''​state''​ al funcției reprezintă informațiile de stare legate de captura pachetului, incluzând interfața de intrare, interfața de ieșire, prioritatea,​ numărul hook-ului. Prioritatea și numărul hook-ului sunt utile pentru a permite ca aceeași funcție să fie apelată de mai multe hook-uri.
  
-Un handler de captură poate întoarce una din [[http://lxr.free-electrons.com/​source/​include/​uapi/​linux/​netfilter.h?v=4.9#​L10|constantele NF_*]]: <code c>+Un handler de captură poate întoarce una din [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​uapi/​linux/​netfilter.h#​L10|constantele NF_*]]: <code c>
 /* Responses from hook functions. */ /* Responses from hook functions. */
 #define NF_DROP 0 #define NF_DROP 0
Line 647: Line 642:
 ''​NF_DROP''​ este folosit pentru a filtra (ignora) un pachet, iar ''​NF_ACCEPT''​ este folosit pentru a accepta un pachet și a-l transmite mai departe. ''​NF_DROP''​ este folosit pentru a filtra (ignora) un pachet, iar ''​NF_ACCEPT''​ este folosit pentru a accepta un pachet și a-l transmite mai departe.
  
-Înregistrarea/​deînregistrarea unui hook se realizează cu ajutorul funcțiilor definite în [[http://lxr.free-electrons.com/​source/​include/​linux/​netfilter.h?v=4.9|linux/​netfilter.h]]:​ <code c>+Înregistrarea/​deînregistrarea unui hook se realizează cu ajutorul funcțiilor definite în [[https://elixir.bootlin.com/​linux/​v4.15/​source/​include/​linux/​netfilter.h|linux/​netfilter.h]]:​ <code c>
 /* Function to register/​unregister hook points. */ /* Function to register/​unregister hook points. */
 int nf_register_net_hook(struct net *net, const struct nf_hook_ops *ops); int nf_register_net_hook(struct net *net, const struct nf_hook_ops *ops);
so2/laboratoare/lab10.1525189090.txt.gz · Last modified: 2018/05/01 18:38 by anda.nicolae
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0