Nakon godinu dana razvoja
Nivo kernela pruža samo generički interfejs nezavisan od protokola koji obezbeđuje osnovne funkcije za izdvajanje podataka iz paketa, izvođenje operacija sa podacima i kontrolu toka.
Sama logika filtriranja i rukovaoci specifični za protokol se kompajliraju u bajtkod u korisničkom prostoru, nakon čega se ovaj bajt kod učitava u kernel pomoću Netlink interfejsa i izvršava u posebnoj virtuelnoj mašini koja podseća na BPF (Berkeley Packet Filters). Ovaj pristup vam omogućava da značajno smanjite veličinu koda za filtriranje koji radi na nivou kernela i premestite sve funkcije raščlanjivanja pravila i logike za rad sa protokolima u korisnički prostor.
Glavne inovacije:
- Podrška za IPsec, omogućavajući podudaranje adresa tunela na osnovu paketa, ID-a IPsec zahtjeva i SPI (Indeks sigurnosnih parametara) oznake. Na primjer,
... ipsec u ip saddr 192.168.1.0/24
... ipsec u spi 1-65536Također je moguće provjeriti da li ruta prolazi kroz IPsec tunel. Na primjer, da blokirate promet ne putem IPSec-a:
… izlaz filtera rt ipsec nedostaje kap
- Podrška za IGMP (Internet Group Management Protocol). Na primjer, možete koristiti pravilo da odbacite dolazne zahtjeve za članstvo u IGMP grupi
nft add pravilo netdev foo bar igmp tip članstvo-upit brojač ispuštanje
- Mogućnost korištenja varijabli za definiranje prijelaznih lanaca (skok / prelazak). Na primjer:
definiraj odredište = ber
dodaj pravilo ip foo bar skok $dest - Podrška za maske za identifikaciju operativnih sistema (OS Fingerprint) na osnovu TTL vrijednosti u zaglavlju. Na primjer, da označite pakete na osnovu OS pošiljatelja, možete koristiti naredbu:
... meta oznaka set osf ttl preskoči mapu imena { "Linux" : 0x1,
"Windows": 0x2,
"MacOS": 0x3,
"nepoznato" : 0x0 }
... osf ttl preskoči verziju "Linux:4.20" - Mogućnost podudaranja ARP adrese pošiljaoca i IPv4 adrese ciljnog sistema. Na primjer, da povećate brojač ARP paketa poslatih sa adrese 192.168.2.1, možete koristiti sljedeće pravilo:
stolni arp x {
lanac y {
tip filter kuka ulazni prioritetni filter; prihvatiti politiku;
arp saddr ip 192.168.2.1 brojač paketa 1 bajt 46
}
} - Podrška za transparentno prosljeđivanje zahtjeva preko proxyja (tproxy). Na primjer, za preusmjeravanje poziva na port 80 na proxy port 8080:
tablica ip x {
lanac y {
tip filter kuka prioritet prerouting -150; prihvatiti politiku;
tcp dport 80 tproxy na :8080
}
} - Podrška za označavanje utičnica sa mogućnošću daljeg dobijanja postavljene oznake preko setsockopt() u SO_MARK modu. Na primjer:
tablica inet x {
lanac y {
tip filter kuka prioritet prerouting -150; prihvatiti politiku;
tcp dport 8080 oznaka postavlja oznaku utičnice
}
} - Podrška za određivanje prioritetnih tekstualnih imena za lance. Na primjer:
nft add chain ip x raw { type filter hook prerouting priority raw; }
nft add chain ip x filter { type filter hook prerouting priority filter; }
nft add chain ip x filter_later { type filter hook prerouting prioritetni filter + 10; } - Podrška za SELinux oznake (Secmark). Na primjer, da definirate oznaku "sshtag" u SELinux kontekstu, možete pokrenuti:
nft dodaj secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"
I onda koristite ovu oznaku u pravilima:
nft dodaj pravilo inet filter ulaz tcp dport 22 meta secmark set “sshtag”
nft add map inet filter secmapping { type inet_service : secmark; }
nft add element inet filter secmapping { 22 : "sshtag" }
nft add pravilo inet filter input meta secmark set tcp dport map @secmapping - Mogućnost specificiranja portova dodijeljenih protokolima u tekstualnom obliku, kako su definirani u datoteci /etc/services. Na primjer:
nft dodaj pravilo xy tcp dport "ssh"
nft lista pravila set -l
tabela x {
lanac y {
...
tcp dport "ssh"
}
} - Mogućnost provjere tipa mrežnog interfejsa. Na primjer:
dodaj pravilo inet raw prerouting meta iifkind "vrf" prihvati
- Poboljšana podrška za dinamičko ažuriranje sadržaja skupova eksplicitnim specificiranjem “dinamičke” zastavice. Na primjer, da ažurirate skup "s" za dodavanje izvorne adrese i resetiranje unosa ako nema paketa 30 sekundi:
dodati tabelu x
add set xs { type ipv4_addr; veličina 128; timeout 30s; zastave dinamičke; }
dodaj lanac xy { tip filter kuka prioritet unosa 0; }
dodaj pravilo xy update @s { ip saddr } - Mogućnost postavljanja posebnog uvjeta vremenskog ograničenja. Na primjer, da poništite zadano vremensko ograničenje za pakete koji pristižu na port 8888, možete odrediti:
tabela ip filter {
ct timeout agresivno-tcp {
protokol tcp;
l3proto ip;
politika = {utvrđeno: 100, zatvori_čekaj: 4, zatvori: 4}
}
lančani izlaz {
...
tcp dport 8888 ct timeout set "aggressive-tcp"
}
} - NAT podrška za inet porodicu:
tablica inet nat {
...
ip6 tata mrtav::2::1 dnat do mrtav:2::99
} - Poboljšano prijavljivanje grešaka u kucanju:
nft add test filter filtera
Greška: nema takve datoteke ili direktorija; da li ste mislili tabela "filter" u porodičnom IP-u?
dodajte test filtera lanca
^^^^^^ - Mogućnost specificiranja imena interfejsa u setovima:
set sc {
upišite inet_service . ifname
elementi = { "ssh" . "eth0" }
} - Ažurirana sintaksa pravila protoka:
nft dodaj tabelu x
nft add flowtable x ft { hook ingress priority 0; uređaji = { eth0, wlan0 }; }
...
nft dodaj pravilo x naprijed ip protokol { tcp, udp } tok dodaj @ft - Poboljšana podrška za JSON.
izvor: opennet.ru