[2] Nftables – Podstawowe operacje

8 marca 2022 Wyłączono przez Adam [zicherka] Nogły

To są podstawowe operacje Nftables.

[1] Wiele poziomów sieciowych jest podzielonych na rodziny w architekturze nftables, jak poniżej.

Rodzina Opis
ip Ta rodzina przetwarza ruch/pakiety IPv4. Dziedziczenie [iptables] jest ekwiwalentne.
ip6 Ta rodzina przetwarza ruch/pakiety IPv6. Dziedziczenie [ip6tables] jest równoważne.
inet Ta rodzina przetwarza zarówno ruch/pakiety IPv4, jak i IPv6 jako obsługę podwójnego stosu.
arp Ta rodzina przetwarza ruch na poziomie ARP, zanim jakakolwiek obsługa warstwy L3 zostanie wykonana przez jądro. Dziedziczenie [arptables] jest ekwiwalentem.
bridge Ta rodzina przetwarza ruch/pakiety przechodzące przez mosty. Dziedzictwo [ebtables] jest ekwiwalentem.

Jednak nie ma dla niego integracji z nf_conntrack.

netdev Ta rodzina różni się od innych tym, że służy do tworzenia łańcuchów bazowych dołączonych do jednego interfejsu sieciowego. Takie łańcuchy bazowe widzą cały ruch sieciowy na określonym interfejsie, bez założeń dotyczących protokołów L2 lub L3. Nie ma starszych ***tabeli odpowiadających tej rodzinie.

[2] Nie ma domyślnego ustawienia nftables, zacznij od utworzenia tabel, takich jak starsze iptables.

nft add table [rodzina] [nazwa tabeli]
# pokaż reguły (domyślnie brak reguł)
# my jednak w LINK skopiowaliśmy raguły z Firewalld
[root@vlsr01 ~]# nft list ruleset

# dodaj tabelę [firewall01] w rodzinie [inet]
[root@vlsr01 ~]# nft add table inet firewall01

# pokaż tablice w rodzinie [inet]
[root@vlsr01 ~]# nft list tables inet
table inet firewalld
table inet firewall01

# pokaż zestaw reguł
[root@vlsr01 ~]# nft list ruleset
# nie dołączyłem do listingu skopiowanych regul z Firewalld
table inet firewall01 {
}

# aby skasować tabelę wykonaj:
[root@vlsr01 ~]# nft delete table inet firewall01

[3] Następnie dodaj łańcuchy do tabeli.

nft add chain [family] [table name] [chain name] { type [type] hook [hook} priority [priority] \; }

Dostępne [type]y i [hook]s są następujące. Dla [priority], jest to zazwyczaj liczba całkowita, a im mniejsza wartość tym ma wyższy priorytet.

Typ Możliwe do użycia z
filter all [family], [hook]
route [ip], [ip6], [inet] family

[output] hook

nat [ip], [ip6], [inet] family

[input], [output], [prerouting]. [postrouting] hook

 

Hook (punkt zaczepienia) Możliwe do użycia z
input [ip], [ip6], [inet], [apr], [bridge] family

[filter], [nat] type

output [ip], [ip6], [inet], [apr], [bridge] family

[filter], [route], [nat] type

forward [ip], [ip6], [inet], [bridge] family

[filter] type

prerouting [ip], [ip6], [inet], [bridge] family

[filter], [nat] type

postrouting [ip], [ip6], [inet], [bridge] family

[filter], [nat] type

ingress [netdev] family

[filter] type

# typ [filter], punkt zaczepienia (hook) [input], priorytet [0]
# dodaj łańcuch [filter_INPUT] do tabeli [firewall01] w rodzinie [inet]
[root@vlsr01 ~]# nft add chain inet firewall01 filter_INPUT { type filter hook input priority 0 \;}
[root@vlsr01 ~]# nft list ruleset
table inet firewall01 {
        chain filter_INPUT {
                type filter hook input priority filter; policy accept;
        }
}

# aby skasować łańcuch wykonaj
[root@vlsr01 ~]# nft delete chain inet firewall01 filter_INPUT

[root@vlsr01 ~]# nft list ruleset
table inet firewall01 {
}

[4] Po dodaniu tabel i łańcuchów ustal dla nich reguły.

[root@vlsr01 ~]# nft list ruleset
table inet firewall01 {
        chain filter_INPUT {
                type filter hook input priority filter; policy accept;
        }
}

# na przykład dodaj regułę zezwalającą na pakiety, których stan połączenia jest [powiązany (related), nawiązany (estabilished)]
[root@vlsr01 ~]# nft add rule inet firewall01 filter_INPUT ct state related,established accept
[root@vlsr01 ~]# nft list table inet firewall01
table inet firewall01 {
        chain filter_INPUT {
                type filter hook input priority filter; policy accept;
                ct state established,related accept
        }
}

# na przykład dodaj regułę zezwalającą na ruch pakietom na interfejs pętli zwrotnej
[root@vlsr01 ~]# nft add rule inet firewall01 filter_INPUT iif lo accept
[root@vlsr01 ~]# nft list table inet firewall01
table inet firewall01 {
        chain filter_INPUT {
                type filter hook input priority filter; policy accept;
                ct state established,related accept
                iif "lo" accept
        }
}

# na przykład dodaj regułę odrzucania pakietów z wyjątkiem dozwolonych pakietów powyżej
[root@vlsr01 ~]# nft add rule inet firewall01 filter_INPUT drop
[root@vlsr01 ~]# nft -a list table inet firewall01
table inet firewall01 { # handle 49
        chain filter_INPUT { # handle 2
                type filter hook input priority filter; policy accept;
                ct state established,related accept # handle 3
                iif "lo" accept # handle 4
                drop # handle 5
        }
}

# na przykład dodaj regułę obok wiersza [uchwyt 3 (handle 3)], aby zezwolić na pakiety do portu 22 ze stanem połączenia [nowy, nieśledzony (new, untracked)]
[root@vlsr01 ~]# nft add rule inet firewall01 filter_INPUT handle 3 tcp dport 22 ct state { new,untracked } accept
[root@vlsr01 ~]# nft -a list table inet firewall01
table inet firewall01 { # handle 49
        chain filter_INPUT { # handle 2
                type filter hook input priority filter; policy accept;
                ct state established,related accept # handle 3
                tcp dport 22 ct state { new, untracked } accept # handle 7
                iif "lo" accept # handle 4
                drop # handle 5
        }
}

# na przykład dodaj regułę obok wiersza [uchwyt 7 (handle 7)], aby zezwolić na pakiety, których metadane to [icmp,ipv6-icmp]
[root@vlsr01 ~]# nft add rule inet firewall01 filter_INPUT handle 7 meta l4proto { icmp,ipv6-icmp } accept
[root@vlsr01 ~]# nft -a list table inet firewall01
table inet firewall01 { # handle 49
        chain filter_INPUT { # handle 2
                type filter hook input priority filter; policy accept;
                ct state established,related accept # handle 3
                tcp dport 22 ct state { new, untracked } accept # handle 7
                meta l4proto { icmp, ipv6-icmp } accept # handle 9
                iif "lo" accept # handle 4
                drop # handle 5
        }
}

# aby usunąć regułę, podaj [uchwyt (uchwyt)] numer linii, którą chcesz usunąć, i uruchom poniższe polecenie
[root@vlsr01 ~]# nft delete rule inet firewall01 filter_INPUT handle 7
[root@vlsr01 ~]# nft -a list table inet firewall01
table inet firewall01 { # handle 49
        chain filter_INPUT { # handle 2
                type filter hook input priority filter; policy accept;
                ct state established,related accept # handle 3
                meta l4proto { icmp, ipv6-icmp } accept # handle 9
                iif "lo" accept # handle 4
                drop # handle 5
        }
}