Пасля года распрацоўкі
На ўзроўні ядра падаецца толькі агульны інтэрфейс, які не залежыць ад канкрэтнага пратакола і які прадстаўляе базавыя функцыі вымання дадзеных з пакетаў, выкананні аперацый з дадзенымі і кіраванні струменем.
Непасрэдна логіка фільтрацыі і спецыфічныя для пратаколаў апрацоўшчыкі кампілююцца ў байткод у прасторы карыстача, пасля чаго дадзены байткод загружаецца ў ядро пры дапамозе інтэрфейсу Netlink і выконваецца ў адмысловай віртуальнай машыне, якая нагадвае BPF (Berkeley Packet Filters). Падобны падыход дазваляе значна скараціць памер кода фільтрацыі, які працуе на ўзроўні ядра і вынесці ўсе функцыі разбору правіл і логікі працы з пратаколамі ў прастору карыстача.
Асноўныя навіны:
- Падтрымка IPsec, якая дазваляе выконваць супастаўленне адрасоў тунэляў у прывязцы да пакета, ідэнтыфікатару запыту IPsec і тэгу SPI (Security Parameter Index). Напрыклад,
… ipsec in ip saddr 192.168.1.0/24
… ipsec in spi 1-65536Таксама магчыма праверка праходжання маршруту праз тунэль IPsec. Напрыклад, для блакавання трафіку не праз IPSec:
… filter output rt ipsec missing drop
- Падтрымка пратакола IGMP (Internet Group Management Protocol). Напрыклад, для адкідвання ўваходных IGMP-запытаў прыналежнасці да групы можна выкарыстоўваць правіла
nft add rule netdev foo bar igmp typ membership-query counter drop
- Магчымасць выкарыстання зменных для вызначэння ланцужкоў пераходу (jump/goto). Напрыклад:
define dest = ber
add rule ip foo bar jump $dest - Падтрымка масак для ідэнтыфікацыі аперацыйных сістэм (OS Fingerprint) на аснове значэнняў TTL у загалоўку. Напрыклад, для пазнакі пакетаў у залежнасці ад АС адпраўніка можна выкарыстоўваць каманду:
… meta mark set osf ttl skip name map { "Linux": 0x1,
"Windows": 0x2,
MacOS : 0x3,
"unknown" : 0x0 }
… osf ttl skip version "Linux:4.20" - Магчымасць супастаўлення ARP-адрасы адпраўніка і IPv4-адрасы мэтавай сістэмы. Напрыклад, для павелічэння лічыльніка ARP-пакетаў, адпраўленых з адраса 192.168.2.1 можна выкарыстоўваць правіла:
table arp x {
chain y {
type filter hook input priority filter; policy accept;
arp saddr ip 192.168.2.1 counter packets 1 bytes 46
}
} - Падтрымка празрыстага пракіду запытаў праз проксі (tproxy). Напрыклад, для перанакіравання зваротаў да 80 порта на порт проксі 8080:
table ip x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 80 tproxy to :8080
}
} - Падтрымка пазнакі сокетаў з магчымасцю далейшага атрымання ўсталяванай пазнакі праз setsockopt() у рэжыме SO_MARK. Напрыклад:
table inet x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 8080 mark set socket mark
}
} - Падтрымка ўказання тэкставых найменняў прыярытэтаў для ланцужкоў. Напрыклад:
nft add chain ip x raw { filter hook typ 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 priority filter + 10; } - Падтрымка пазнак SELinux (Secmark). Напрыклад, для вызначэння пазнакі "sshtag" у прывязцы да кантэксту SELinux можна запусціць:
nft add secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"
А затым выкарыстоўваць гэтую пазнаку ў правілах:
nft add rule inet filter input 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 rule inet filter input meta secmark set tcp dport map @secmapping - Магчымасць указання замацаваных за пратаколамі партоў у тэкставым выглядзе, як яны вызначаны ў файле /etc/services. Напрыклад:
nft add rule xy tcp dport "ssh"
nft list ruleset -l
table x {
chain y {
...
tcp dport "ssh"
}
} - Магчымасць праверкі тыпу сеткавага інтэрфейсу. Напрыклад:
add rule inet raw prerouting meta iifkind "vrf" accept
- Палепшана падтрымка дынамічнага абнаўлення змесціва набораў (sets) праз відавочнае ўказанне сцяга "dynamic". Напрыклад, для абнаўлення набору "s" з даданнем зыходнага адраса і скідам запісу ў выпадку адсутнасці пакетаў на працягу 30 секунд:
add table x
add set xs { type ipv4_addr; size 128; timeout 30s; flags dynamic; }
add chain xy { type filter hook input priority 0; }
add rule xy update @s { ip saddr } - Магчымасць задання асобнай умовы наступлення таймаўту. Напрыклад, для пераазначэння таймаўту па змаўчанні для пактаў, якія прыйшлі на порт 8888 можна паказаць:
table ip filter {
ct timeout agressive-tcp {
protocol tcp;
l3proto ip;
policy = {established: 100, close_wait: 4, close: 4}
}
выхад ланцужка {
...
tcp dport 8888 ct timeout set "agressive-tcp"
}
} - Падтрымка NAT для сямейства inet:
табліца inet nat {
...
ip6 daddr dead::2::1 dnat to dead:2::99
} - Палепшаныя сродкі вываду інфармацыі пра памылкі з-за памылак друку:
nft add chain filtre test
Error: Няма such file або directory; did you mean table 'filter' in family ip?
add chain filtre test
^^^^^^ - Магчымасць указання імёнаў інтэрфейсаў у наборах (sets):
set sc {
type inet_service. ifname
elements = {«ssh». "eth0"}
} - Абноўлены сінтаксіс правілаў flowtable:
nft add table x
nft add flowtable x ft {hook ingress priority 0; devices = { eth0, wlan0 }; }
...
nft add шлях x forward ip protocol {tcp, udp} flow add @ft - Палепшана падтрымка JSON.
Крыніца: opennet.ru