nftables vs. iptables

Sok disztribúció a következő verzióban már nftables-t fog használni iptables helyett.
Az átállásnak több módja van. Debian Buster-ben az iptables-nft fog az iptables-re mutatni (alternatives), ami azt jelenti, hogy amikor az iptables parancsokat kiadod, akkor valójában azok nft ruleokká konvertálódnak.
Lásd: https://wiki.nftables.org/wiki-nftables/index.php/Moving_from_iptables_…

Mindaddig nincs is baj ezzel,amíg csak olyan matchereket használsz amik léteznek iptables-ben és nftables-ben is. Azonban például az iptables-ben létező ipsec policy matchnek a Debian Buster által szállított 4.19-es kernelben nincs 100%-os megfelelője.

Azt, hogy az iptables valójában melyik backend-et használja egyszerű megnézni:


root@debianbuster:~# iptables --version
iptables v1.8.2 (nf_tables)

vs.


root@debianbuster:~# iptables-legacy --version
iptables v1.8.2 (legacy)

Itt egy megjegyzés: amikor ezt a két parancsot egymás után kiadja az ember a kernelbe betöltődnek a régi iptables és nftables modulok is. És ez a kettő egymástól függetlenül konfigurálható, ami aztán értelemszerűen elég erősen lábonlövés jellegű.

És akkor egy olyan iptables szabály aminek nem létezik nftables-ben megfelelője a 4.19-es kernelben.


iptables -t mangle -A POSTROUTING -d 5.6.7.8/32 -m policy --dir out --pol none -j DROP

Ez elvileg eldob minden csomagot az 5.6.7.8 felé , de csak ha nem ipsec tunnelben közlekedik.

És ez lesz belőle:


root@debianbuster:~# nft list chain mangle POSTROUTING
table ip mangle {
chain POSTROUTING {
type filter hook postrouting priority -150; policy accept;
counter packets 0 bytes 0 accept
ip daddr 5.6.7.8 counter packets 0 bytes 0 drop
}
}

Ebből az látszik, hogy eldobja az 5.6.7.8 felé menő csomagokat mindenféle módosító (meta) nélkül.

Egyszóval figyeljünk frissítésnél a szabályrendszerünkre.

Hozzászólások

A legszebb, hogy ha iptables-el (az nf_tables backendet használóval nyilván) megnézed, ott az látszik, hogy minden ok.


root@debianbuster:~# iptables -L POSTROUTING -n -v -t mangle
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 0.0.0.0/0 5.6.7.8 policy match dir out pol none
# Warning: iptables-legacy tables present, use iptables-legacy to see them

Mondjuk legalább van egy figyelmeztetés, hogy a legacy iptables is használatban van. :)

Ami ugye másik alrendszer tehát annak a POSTROUTING-jában nincs is semmi.


root@debianbuster:~# iptables-legacy -L POSTROUTING -n -v -t mangle
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

De legalább le van írva hogy:

Beware of using both the nft and the legacy tools at the same time. That means using both x_tables and nf_tables kernel subsystems at the same time, and could lead to unexpected results.

Ez szimpla absztrakció.

Kétféle módon lehet implementálni.

Vagy iszonyat lassú lesz (relatíve) és viszonylag jól konvertálódnak az utasítások. Lásd Java.
Vagy elfogadható sebességű lesz (mint ez, mert itt nem lehet lassú) de folyton konverziós likakra fut.

Az van, hogy amikor a kernel váltani fog, akkor át kell írni a teljes iptablest. Nem lehet megúszni a munkát :(

Ilyenkor lehet azokra a több éves iptables gyöngyszemekre akadni, amikor vakarjuk a fejünket, hogy ez mire jó? semmire. Kitörlöm... utána kiderül, hogy semmi sem megy :)

"Ilyenkor lehet azokra a több éves iptables gyöngyszemekre akadni, amikor vakarjuk a fejünket, hogy ez mire jó?" - én erre (is) használom a szabályokban a kommenteket valahogy így:

-m comment --comment "f0stal1cska app-nak kell 20150203 Zeller"

Ha összetartozó rule-ok vannak, azoknál azonos a komment, hogy arra lehessen keresni úgy az aktív szabálybázisban, mint a betöltésre szolgáló listafájlban. A firewalld esetében dettó, csak ott mondjuk az xml-be kerül a magyarázat.

Tudom, hogy ez olyan, mint egy hasmenés, amire nincs Imodium, de én még visszatartom, amíg tudom.
Nekem akkor tolják az nftables-t, ha már lesz majd rá ipset. Kadlecsik Józsi rulez! Talán megírja előbb-utóbb az nftables-es ipset-et is, bár efelől sajnos vannak kétségeim.

"Jegyezze fel a vádhoz - utasította Metcalf őrnagy a tizedest, aki tudott gyorsírni. - Tiszteletlenül beszélt a feljebbvalójával, amikor nem pofázott közbe."

Akkor kell még olvasnom. Jó lenne hozzá egy konverter. Legutóbb, mikor néztem még nem álltam készen a váltásra.

"Jegyezze fel a vádhoz - utasította Metcalf őrnagy a tizedest, aki tudott gyorsírni. - Tiszteletlenül beszélt a feljebbvalójával, amikor nem pofázott közbe."

Igen, nyáron megjelenő Debian Buster is már az nftables-t fogja alapértelmezettnek tekinteni: https://wiki.debian.org/nftables#Current_status

Egyébként az ifconfig és route, továbbá a vconfig, brctl parancsok is lassan-lassan átadják a helyüket az "ip" parancsnak. Egyre gyakrabban futok bele olyan telepítésbe, ahol nincs már alapból ifconfig.
( ip link add link eth0 name eth0.20 type vlan id 20 )

Aztán most jól újratanulhatjuk az új parancsoknál a szintaktikákat.

Igen, úgy kellett volna kérdeznem, hogy "Mióta is deprecated...?", de semmi gond, egyrészt te is utánaolvastál, másrészt meg aki ide téved, az is megkapja ezt az információt.
Egyébként én is vegyesen használom, van, amiben az ip, és van, amiben a "régi" parancs (ifconfig, route és társaik ugye...) áll jobban kézre. Jellemzően CentOS vonalon mozgok, úgyhogy ha onnan végleg kikukázzák a régi parancsokat, akkor átállok fullban az ip parancsra.

Ja, csak míg az ip parancs érdekelt, a systemd-világ kissé hidegen hagy. (Én ugye sok éve "megjósoltam" egy előadásban, hogy a systemd a kutyát se érdekli, de a világ nem hallgatott rám.)

De amúgy igen, a könyveket aktualizálni kellene és hiba is van bennük néhány :-(

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

nemreg futolag rhel8 beta-t feldobtam virtualis gepbe, hogy belekukkantsak mikre kellhet keszulni, ugye mar rhel7-ben is firewalld volt a default es ezaltal az ajanlott, ez a resz nem valtozott csak rhel8-ban az is mar az nftables-t hivogatja. Aminek okan ha megszokasbol iptables paranccsal nezzuk meg a szabalyokat azt latjuk nincs semmi betoltve:


[root@rhel8beta ~]# iptables -nvL
Chain INPUT (policy ACCEPT 127 packets, 9965 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 76 packets, 8321 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@rhel8beta ~]# 
[root@rhel8beta ~]# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@rhel8beta ~]# 
[root@rhel8beta ~]# iptables -nvL -t mangle
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Pedig ha megnezzuk nft-vel vagy firewalld-cmd -vel akkor latszik hogy letrehozott a firewalld sajat szabalyokat tablakkal, chainekkel stb. amik ra vannak kotve a input, output stb. reszekre csak eltero prioritassal:


[root@rhel8beta ~]# firewall-cmd --state
running
[root@rhel8beta ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

[root@rhel8beta ~]# nft list tables
table ip filter
table ip6 filter
table bridge filter
table ip security
table ip raw
table ip mangle
table ip nat
table ip6 security
table ip6 raw
table ip6 mangle
table ip6 nat
table bridge nat
table inet firewalld
table ip firewalld
table ip6 firewalld

Amibol ha csak inet firewalld-t megnezzuk:


[root@rhel8beta ~]# nft list table inet firewalld
table inet firewalld {
        chain raw_PREROUTING {
                type filter hook prerouting priority -290; policy accept;
                icmpv6 type { nd-router-advert, nd-neighbor-solicit } accept
                meta nfproto ipv6 fib saddr . iif oif missing drop
                jump raw_PREROUTING_ZONES_SOURCE
                jump raw_PREROUTING_ZONES
        }

        chain raw_PREROUTING_ZONES_SOURCE {
        }

        chain raw_PREROUTING_ZONES {
                iifname "enp0s3" goto raw_PRE_public
                goto raw_PRE_public
        }

        chain mangle_PREROUTING {
                type filter hook prerouting priority -140; policy accept;
                jump mangle_PREROUTING_ZONES_SOURCE
                jump mangle_PREROUTING_ZONES
        }

        chain mangle_PREROUTING_ZONES_SOURCE {
        }

        chain mangle_PREROUTING_ZONES {
                iifname "enp0s3" goto mangle_PRE_public
                goto mangle_PRE_public
        }

        chain filter_INPUT {
                type filter hook input priority 10; policy accept;
                ct state established,related accept
                iifname "lo" accept
                jump filter_INPUT_ZONES_SOURCE
                jump filter_INPUT_ZONES
                ct state invalid drop
                reject with icmpx type admin-prohibited
        }

        chain filter_FORWARD {
                type filter hook forward priority 10; policy accept;
                ct state established,related accept
                iifname "lo" accept
                jump filter_FORWARD_IN_ZONES_SOURCE
                jump filter_FORWARD_IN_ZONES
                jump filter_FORWARD_OUT_ZONES_SOURCE
                jump filter_FORWARD_OUT_ZONES
                ct state invalid drop
                reject with icmpx type admin-prohibited
        }

        chain filter_INPUT_ZONES_SOURCE {
        }

        chain filter_INPUT_ZONES {
                iifname "enp0s3" goto filter_IN_public
                goto filter_IN_public
        }

        chain filter_FORWARD_IN_ZONES_SOURCE {
        }

        chain filter_FORWARD_IN_ZONES {
                iifname "enp0s3" goto filter_FWDI_public
                goto filter_FWDI_public
        }

        chain filter_FORWARD_OUT_ZONES_SOURCE {
        }

        chain filter_FORWARD_OUT_ZONES {
                oifname "enp0s3" goto filter_FWDO_public
                goto filter_FWDO_public
        }

        chain raw_PRE_public {
                jump raw_PRE_public_log
                jump raw_PRE_public_deny
                jump raw_PRE_public_allow
        }

        chain raw_PRE_public_log {
        }

        chain raw_PRE_public_deny {
        }

        chain raw_PRE_public_allow {
        }

        chain filter_IN_public {
                jump filter_IN_public_log
                jump filter_IN_public_deny
                jump filter_IN_public_allow
                meta l4proto { icmp, ipv6-icmp } accept
        }

        chain filter_IN_public_log {
        }

        chain filter_IN_public_deny {
        }

        chain filter_IN_public_allow {
                tcp dport ssh ct state new,untracked accept
                ip6 daddr fe80::/64 udp dport dhcpv6-client ct state new,untracked accept
                tcp dport 9090 ct state new,untracked accept
        }

        chain filter_FWDI_public {
                jump filter_FWDI_public_log
                jump filter_FWDI_public_deny
                jump filter_FWDI_public_allow
                meta l4proto { icmp, ipv6-icmp } accept
        }

        chain filter_FWDI_public_log {
        }

        chain filter_FWDI_public_deny {
        }

        chain filter_FWDI_public_allow {
        }

        chain mangle_PRE_public {
                jump mangle_PRE_public_log
                jump mangle_PRE_public_deny
                jump mangle_PRE_public_allow
        }

        chain mangle_PRE_public_log {
        }

        chain mangle_PRE_public_deny {
        }

        chain mangle_PRE_public_allow {
        }

        chain filter_FWDO_public {
                jump filter_FWDO_public_log
                jump filter_FWDO_public_deny
                jump filter_FWDO_public_allow
        }

        chain filter_FWDO_public_log {
        }

        chain filter_FWDO_public_deny {
        }

        chain filter_FWDO_public_allow {
        }
}

Verziok egyebkent:
[root@rhel8beta ~]# iptables --version
iptables v1.8.0 (nf_tables)
[root@rhel8beta ~]# nft --version
nftables v0.9.0 (Fearless Fosdick)
[root@rhel8beta ~]# uname -a
Linux rhel8beta.localdomain 4.18.0-32.el8.x86_64 #1 SMP Sat Oct 27 19:26:37 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Ha pl iptables-save-el le akarjuk menteni, esetleg valami regebbi scriptunkben az van akkor is erhet meglepetes, mert nem kepes ra, ellenben a vegen egy komment ott legalabb mar jelzi hogy nem tud mit kezdeni a firewalld tablaval, hasznalj nft-t:


[root@rhel8beta ~]# iptables-save 
# Generated by xtables-save v1.8.0 on Sat Apr 20 20:03:32 2019
*filter
:INPUT ACCEPT [1925:115709]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [993:278937]
COMMIT
# Completed on Sat Apr 20 20:03:32 2019
# Generated by xtables-save v1.8.0 on Sat Apr 20 20:03:32 2019
*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Sat Apr 20 20:03:32 2019
# Generated by xtables-save v1.8.0 on Sat Apr 20 20:03:32 2019
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Sat Apr 20 20:03:32 2019
# Generated by xtables-save v1.8.0 on Sat Apr 20 20:03:32 2019
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Sat Apr 20 20:03:32 2019
# Generated by xtables-save v1.8.0 on Sat Apr 20 20:03:32 2019
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Sat Apr 20 20:03:32 2019
# Table `firewalld' is incompatible, use 'nft' tool.

nekem most sikerult beleszaladni centos8-on. ssh megy http nem, nezem iptables ures, wtf??? aztan kiderult hogy firewalld + nft...

amugy az ifconfig/ip valtasnal is lehet ilyet latni, pl. ha nem adsz nevet az ip aliasnak ip paranccsal letrehozva akkor az ifconfig nem fogja mutatni...