raw(7) Miscellaneous Information Manual raw(7) NUME raw - socluri Linux IPv4 raw (brute) SINOPSIS #include #include raw_socket = socket(AF_INET, SOCK_RAW, int protocol); DESCRIERE Soclurile brute permit implementarea noilor protocoale IPv4 in spaiul utilizatorului. Un soclu brut primete sau trimite diagrama de date bruta, fara a include antetele nivelului/stratului de legatura(conexiune). Stratul IPv4 genereaza un antet IP atunci cand trimite un pachet, cu excepia cazului in care opiunea de soclu IP_HDRINCL este activata pe soclu. Atunci cand aceasta este activata, pachetul trebuie sa conina un antet IP. Pentru recepie, antetul IP este intotdeauna inclus in pachet. Pentru a crea un soclu brut, un proces trebuie sa aiba capacitatea CAP_NET_RAW in spaiul de nume al utilizatorului care guverneaza spaiul sau de nume de reea. Toate pachetele sau erorile care corespund numarului protocol specificat pentru soclul brut sunt transmise catre acest soclu. Pentru o lista a protocoalelor permise, consultai lista IANA de numere de protocol atribuite la i getprotobyname(3). Un protocol IPPROTO_RAW implica activarea IP_HDRINCL i poate trimite orice protocol IP care este specificat in antetul transmis. Primirea tuturor protocoalelor IP prin IPPROTO_RAW nu este posibila utilizand socluri brute. +------------------------------------------------------------------+ |Campurile antetului IP modificate la trimiterea prin IP_HDRINCL | +--------------------------------+---------------------------------+ |IP Checksum | Intotdeauna completat | +--------------------------------+---------------------------------+ |Source Address | Completat cand este zero | +--------------------------------+---------------------------------+ |Packet ID | Completat cand este zero | +--------------------------------+---------------------------------+ |Lungimea totala | Intotdeauna completat | +--------------------------------+---------------------------------+ Daca IP_HDRINCL este specificat i antetul IP are o adresa de destinaie diferita de zero, atunci adresa de destinaie a soclului este utilizata pentru direcionarea pachetului. Atunci cand se specifica MSG_DONTROUTE, adresa de destinaie trebuie sa se refere la o interfaa locala, altfel se efectueaza oricum o cautare in tabela de direcionare, dar rutele gateway (prin poarta de acces) sunt ignorate. Daca IP_HDRINCL nu este activat, atunci opiunile antetului IP pot fi activate pe socluri brute cu setsockopt(2); consultai ip(7) pentru mai multe informaii. Incepand cu Linux 2.2, toate campurile i opiunile antetului IP pot fi configurate utilizand opiunile soclului IP. Aceasta inseamna ca soclurile brute sunt de obicei necesare doar pentru protocoalele noi sau pentru protocoalele fara interfaa utilizator (cum ar fi ICMP). Atunci cand se primete un pachet, acesta este transmis tuturor soclurilor brute care au fost asociate protocolului sau inainte de a fi transmis altor gestionari de protocol (de exemplu, modulele de protocol ale nucleului). Formatul adreselor Pentru trimiterea i primirea de diagrame de date (sendto(2), recvfrom(2) i altele similare), soclurile brute utilizeaza structura de adrese standard sockaddr_in definita in ip(7). Campul sin_port ar putea fi utilizat pentru a specifica numarul protocolului IP, dar este ignorat pentru trimitere in Linux 2.2 i ulterior i ar trebui sa fie intotdeauna stabilit la 0 (a se vedea seciunea ERORI). Pentru pachetele primite, sin_port este setat la zero. Opiuni de soclu Opiunile soclului brut pot fi stabilite cu setsockopt(2) i citite cu getsockopt(2) prin trecerea fanionului familiei IPPROTO_RAW. ICMP_FILTER Activeaza un filtru special pentru socluri brute asociate protocolului IPPROTO_ICMP. Valoarea are un bit activat pentru fiecare tip de mesaj ICMP care ar trebui sa fie filtrat. Valoarea implicita este de a nu filtra niciun mesaj ICMP. In plus, sunt acceptate toate opiunile de soclu ip(7) IPPROTO_IP valabile pentru socluri de diagrame de date. Gestionarea erorilor Erorile provenite din reea sunt transmise utilizatorului numai atunci cand soclul este conectat sau fanionul IP_RECVERR este activat. Pentru soclurile conectate, numai EMSGSIZE i EPROTO sunt transmise pentru compatibilitate. Cu IP_RECVERR, toate erorile de reea sunt salvate in coada de erori. ERORI-IEIRE EACCES Utilizatorul a incercat sa trimita la o adresa de difuzare fara a avea fanionul de difuzare activat pe soclu. EFAULT A fost furnizata o adresa de memorie nevalida. EINVAL Argument nevalid. EMSGSIZE Pachet prea mare. Fie Descoperirea MTU a rutei este activata (fanionul de soclu IP_MTU_DISCOVER), fie dimensiunea pachetului depaete dimensiunea maxima permisa a pachetului IPv4 de 64 ko. EOPNOTSUPP Un fanion nevalid a fost pasat unui apel de soclu (cum ar fi MSG_OOB). EPERM Utilizatorul nu are permisiunea de a deschide socluri brute. Numai procesele cu un ID utilizator efectiv de 0 sau atributul CAP_NET_RAW pot face acest lucru. EPROTO A sosit o eroare ICMP care raporteaza o problema de parametru. VERSIUNI IP_RECVERR i ICMP_FILTER sunt introduse nou in Linux 2.2. Acestea sunt extensii Linux i nu ar trebui sa fie utilizate in programe portabile. Linux 2.0 a activat o anumita compatibilitate bug-to-bug cu BSD in codul de soclu brut atunci cand opiunea de soclu SO_BSDCOMPAT a fost activata; incepand cu Linux 2.2, aceasta opiune nu mai are acest efect. NOTE In mod implicit, soclurile brute descopera ruta MTU (Maximum Transmission Unit). Aceasta inseamna ca nucleul va ine evidena MTU catre o anumita adresa IP inta i va returna EMSGSIZE atunci cand scrierea unui pachet brut o depaete. Atunci cand se intampla acest lucru, aplicaia ar trebui sa reduca dimensiunea pachetului. Descoperirea MTU a rutei poate fi, de asemenea, dezactivata utilizand opiunea de soclu IP_MTU_DISCOVER sau fiierul /proc/sys/net/ipv4/ip_no_pmtu_disc, consultai ip(7) pentru detalii. Atunci cand sunt dezactivate, soclurile brute vor fragmenta pachetele de ieire care depaesc MTU-ul interfeei. Cu toate acestea, dezactivarea nu este recomandata din motive de performana i fiabilitate. Un soclu brut poate fi legat la o anumita adresa locala utilizand apelul bind(2). Daca nu este legata, sunt primite toate pachetele cu protocolul IP specificat. In plus, un soclu brut poate fi legat la un anumit dispozitiv de reea utilizand SO_BINDTODEVICE; consultai socket(7). Un soclu IPPROTO_RAW este numai de trimitere. Daca dorii cu adevarat sa primii toate pachetele IP, utilizai un soclu packet(7) cu protocolul ETH_P_IP. Reinei ca soclurile de pachete nu reasambleaza fragmentele IP, spre deosebire de soclurile brute. Daca dorii sa primii toate pachetele ICMP pentru un soclu de diagrame de date, este adesea mai bine sa utilizai IP_RECVERR pe acel soclu; consultai ip(7). Soclurile brute pot atinge toate protocoalele IP in Linux, chiar i protocoale precum ICMP sau TCP, care au un modul de protocol in nucleu. In acest caz, pachetele sunt transmise atat modulului din nucleu, cat i soclului (soclurilor) brut(e). Nu ar trebui sa va bazai pe acest lucru in programele portabile, multe alte implementari de soclu BSD au limitari aici. Linux nu modifica niciodata antetele transmise de utilizator (cu excepia completarii unor campuri cu zero, aa cum este descris pentru IP_HDRINCL). Acest lucru difera de multe alte implementari ale soclurilor brute. Soclurile brute sunt, in general, destul de neportabile i ar trebui evitate in programele destinate sa fie portabile. Trimiterea pe socluri brute ar trebui sa preia protocolul IP din sin_port; aceasta capacitate a fost pierduta in Linux 2.2. Soluia este de a utiliza IP_HDRINCL. ERORI Extensiile proxy transparente nu sunt descrise. Atunci cand opiunea IP_HDRINCL este activata, diagramele de date nu vor fi fragmentate i sunt limitate la MTU-ul interfeei. Definirea protocolului IP pentru trimitere in sin_port s-a pierdut in Linux 2.2. Protocolul la care a fost asociat soclul sau care a fost specificat in apelul iniial socket(2) este intotdeauna utilizat. CONSULTAI I recvmsg(2), sendmsg(2), capabilities(7), ip(7), socket(7) RFC 1191 pentru descoperirea MTU a rutei. RFC 791 i fiierul de antet pentru protocolul IP. TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.12 2 mai 2024 raw(7)