Puncte:3

Filtru de sarcină utilă Linux TCP

drapel ve

Folosesc nftables, dar nu are nimic asemănător șirului iptables sau potrivirii u32, așa că nu a putut aduna în mod fiabil compensarea sarcinii utile. Dacă nu prin încărcăturile utile brute ale nftables, cum aș putea analiza eficient sarcina utilă TCP, fără blocaje în spațiul utilizatorului? (nfqueue nu este un răspuns din motive de performanță)

Există tehnici pentru a face o astfel de filtrare la nivel de kernel? Chiar și marcarea pachetelor potrivite este suficient pentru mine - restul lucrurilor ar putea fi făcute cu ușurință la firewall.

Puncte:0
drapel cl
A.B

Există deja un cod de kernel disponibil care poate gestiona potrivirea arbitrară a șirurilor, încă în contextul nucleului în timpul căii pachetului, de ce să nu-l reutilizați? iptables nu merge nicăieri. Ce ar putea pot fi dispare într-o zi este API-ul kernelului moștenit pentru iptables, plecând numai iptables-nft în jur, încă capabil de a utiliza xtables module precum cel şir Meci modul. Folosind iptables-legacy sau iptables-nft de-a lungul nftables va avea același rezultat mai jos.

Este posibil să folosiți mărci pentru a transmite mesaje în jurul diferitelor subsisteme de rețea în calea pachetelor, inclusiv de la nftables la iptables și apoi înapoi de la iptables la nftables.

Acest Prioritate în cârlig tabelul poate ajuta:

nftables Familii Cârlige tipice nft Cuvânt cheie Valoare Prioritate internă Netfilter Descriere
[...]
inet, ip, ip6 toate calandru -150 NF_IP_PRI_MANGLE Operațiunea Mangle
inet, ip, ip6 prerutare dstnat -100 NF_IP_PRI_NAT_DST Destinație NAT
inet, ip, ip6, arp, netdev toate filtru 0 NF_IP_PRI_FILTER Operație de filtrare, tabelul de filtrare
[...]

Trebuie doar să se înregistreze nftables de două ori pentru fiecare iptables' lanț încorporat să fie implicat: o dată cu o prioritate chiar înainte iptables', o dată cu prioritate imediat după iptables'. De exemplu cu un lanț de filtru/OUTPUT cu iptables prioritatea 0, se poate folosi -5 și 5 în jurul ei. Mai multe detalii în aceste Două Unix/Linux SE Q/A unde am dat răspunsuri.


Exemplu artificial (adaptat dintr-un exemplu din iptables-extensions(8)) amestecare nftables și iptables, unde sistemul ar trebui să renunțe la solicitările DNS inițiate local pentru adresa DNS specifică www.netfilter.org, prezentat în ordinea priorității cârligului (avertisment: numai UDP, funcționează numai fără prezența oricărei opțiuni/anteturi IPv4 sau IPv6 în pachetul de ieșire din cauza intervalului fix, dar intervalul poate fi relaxat pentru a se adapta pentru aceasta):

nft adauga tabel inet mytable
nft add chain inet mytable outputbefore '{ tip filter hook priority output -5; acceptarea politicii; }'
nft add regula inet mytable outputbefore udp dport 53 meta mark set 1

iptables -I OUTPUT -m mark --mark 1 -m șir --algo bm --de la 40 --la 57 --hex-string '|03|www|09|netfilter|03|org|00|' -j MARK --set-mark 2
ip6tables -I OUTPUT -m mark --mark 1 -m string --algo bm --de la 60 --la 77 --hex-string '|03|www|09|netfilter|03|org|00|' -j MARK --set-mark 2

nft add chain inet mytable outputafter '{ tip filter hook priority output 5; acceptarea politicii; }'
nft adăugați regula inet mytable outputdupă meta mark 2 drop

Scopul aici este de a avea iptables mânuiți numai partea de care nu poate fi manipulată nftables și faceți doar munca minimă: emiteți o valoare de returnare printr-un semn, lăsând înapoi nftables responsabil de soarta pachetului:

  • nftables setează marca pachetului la 1 la „întreaba” iptables pentru a efectua unele lucrări
  • iptables (sau ip6tables) efectuează o potrivire de șir numai dacă „a primit” nota 1, pentru a preveni utilizarea procesorului și „răspunde” 2 dacă șirul s-a potrivit în acest caz
  • nftables elimină pachetul numai dacă „a primit” un marcaj cu valoarea 2 (ștergând astfel fișierul iptables regulile dezactivează și efectul)

Note:

  • Avertisment

    Mecanismul de comunicare între nftables și iptables este prin mărci de pachete (sau ar putea fi, de asemenea, prin contratrack connmarks). Deși este posibil să scrieți și să citiți din doar câțiva biți ai mărcii (prin folosirea măștii opționale de pe marcaj și operații adecvate pe biți), fiecare utilizator de mărci trebuie să respecte o convenție de alocare pentru proprietatea biților din marcă. Fără aceasta, uneltele vor interfera unele cu altele atunci când manipulează semnele. De exemplu firewalld folosește semne pentru gestionarea redirecționărilor în reguli, astfel încât acest exemplu ar putea să nu fie compatibil cu firewalld, chiar dacă folosește propriile tabele atunci când folosește nftables backend.

  • Unele cazuri ușoare pot fi folosite sarcini utile brute

    Acest exemplu specific de mai sus, cu fix compensații, ar fi putut fi implementate cu nftables. Este atunci când există un offset arbitrar pentru a găsi datele (cel mai bine folosit cu iptables' şir potrivire) sau o metodă complexă de a calcula un astfel de offset (cel mai bine folosit cu iptables' u32 meci) că nftables nu poate fi folosit.

    Iată echivalentul care înlocuiește toate regulile de mai sus cu o singură regulă folosind încărcături utile brute. Sintaxa permite doar 128 de biți, dar aici sunt necesari 19x8=152 de biți, așa că trebuie împărțit în două încărcături utile brute (128 de biți + 24 de biți). printf, xxd și a tăia sunt de asemenea folosite pentru ajutor:

    nft adauga tabel inet mytable
    nft add chain inet mytable output '{ tip filter hook priority output 0; acceptarea politicii; }'
    nft add inet mytable output udp dport 53 \
        @th,160,128 0x$(printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p | cut -c-32) \
        @th,288,24 0x$(printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p | cut -c33-) \
        cădere brusca
    

    Cu ieșirea de printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p fiind:

      03777777096e657466696c746572036f726700
    

    pentru a obține cele două sarcini utile brute:

    0x03777777096e657466696c746572036f
                                    0x726700
    
  • alte metode sunt probabil disponibile

    • iptables poate apela un obiect eBPF (oricum doar nucleele recente permit buclelor (finite) să încerce să implementeze cu ușurință niște algoritmi), nftables lipsește această caracteristică. Deci este din nou cu un semn și iptables.

    • un astfel de obiect eBPF ar putea fi folosit cu XDP sau tc dar s-ar putea să fie prea devreme în calea pachetului (de exemplu: nu este disponibil un NAT cu stare) și necesită programare reală mai degrabă decât administrare. Oricum, este din nou comunicare printr-un marcaj dacă trebuie să se ocupe de decizii nftables.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.