Baza wiedzy

Rozsądna podstawa nftables

Reguły z domyślnym odrzucaniem, które pozwalają na to, czego instancja naprawdę potrzebuje, ograniczają prędkość SSH i nie zamykają cię na zewnątrz, dopóki je piszesz.

Jeden firewall, nie dwa

Debian 13 dostarcza nftables z /etc/nftables.conf i usługą, która go wczytuje. AlmaLinux 10 dostarcza firewalld na bazie nftables, a jego usługa czyta to, co zawiera /etc/sysconfig/nftables.conf. Wybierz jeden. Uruchamianie firewalld obok ręcznie napisanego zestawu reguł daje zestaw reguł, którego żaden z was nie napisał.

systemctl disable --now firewalld     # AlmaLinux, if going manual
systemctl enable --now nftables

Zestaw reguł

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
  set ssh_flood {
    type ipv4_addr
    flags dynamic, timeout
    timeout 1h
  }

  chain input {
    type filter hook input priority filter; policy drop;

    ct state established,related accept
    ct state invalid drop
    iif lo accept

    ip protocol icmp icmp type { echo-request, destination-unreachable, time-exceeded } accept
    ip6 nexthdr ipv6-icmp accept

    tcp dport 22 ct state new add @ssh_flood { ip saddr limit rate over 6/minute } drop
    tcp dport 22 accept
    tcp dport { 80, 443 } accept
    udp dport 443 accept

    counter comment "dropped by policy"
  }

  chain forward {
    type filter hook forward priority filter; policy drop;
  }

  chain output {
    type filter hook output priority filter; policy accept;
  }
}

Części, które ludzie mylą:

  • ICMPv6 jest akceptowany w całości celowo. Odkrywanie sąsiadów i pakiet-za-duży mieszkają tam, a ręczne filtrowanie ich psuje IPv6 w sposób, który objawia się jako błąd aplikacji przez półtora dnia.
  • Zestaw ssh_flood dodaje każdy adres przekraczający sześć nowych połączeń na minutę na listę z limitem czasu jednej godziny. Bez parsera logów, bez crona, bez drugiego demona.
  • Dla IPv6 zduplikuj zestaw z type ipv6_addr i regułę z ip6 saddr. Zestawy są jednorodzinne.
  • udp dport 443 jest tam dla QUIC. Usuń go, jeśli go nie obsługujesz.

Załaduj to bez zamykania się na zewnątrz

systemd-run --on-active=120 nft flush ruleset
nft -f /etc/nftables.conf

Pierwsze polecenie planuje jednostkę tymczasową, która czyści zestaw reguł za dwie minuty i wypisuje jej nazwę. Otwórz nową sesję. Jeśli działa, zatrzymaj timer:

systemctl stop run-u1234.timer

Jeśli nie działa, poczekaj, a maszyna sama cię wpuści z powrotem. Pusty zestaw reguł oznacza brak filtrowania, więc dokończ robotę, zamiast zostawiać go na noc.

Sprawdź, co faktycznie robi

nft list ruleset
nft -a list chain inet filter input
nft list set inet filter ssh_flood

-a wypisuje uchwyty, co jest sposobem na usunięcie pojedynczej reguły bez przepisywania pliku:

nft delete rule inet filter input handle 12

Liczniki odpowiadają na pytanie, którego nikt nie zadaje: reguła siedząca na zero po tygodniu jest albo błędna, albo niepotrzebna, a oba przypadki warto znać.

Śledzenie

Gdy pakiet odmawia zachowania się zgodnie z zestawem reguł:

nft add rule inet filter input tcp dport 8443 meta nftrace set 1
nft monitor trace

Usuń regułę śledzenia po użyciu. Jest tania, a nie darmowa.

Do czego firewall hosta nie służy

Filtruje politykę, nie powodzie. Ataki wolumetryczne są odrzucane na brzegu na długo przed dotarciem do twojego portu, a reguła na instancji tylko marnowałaby twój procesor na pakiety, którymi już zajęto się. Szczegóły na ochronie DDoS.

Utrwal to

nft list ruleset > /etc/nftables.conf
systemctl restart nftables

Umieść shebang i linię flush ruleset z powrotem na górze wyeksportowanego pliku. Bez nich następne wczytanie dołączy do działającego zestawu reguł zamiast go zastąpić, a każda twoja reguła pojawi się dwukrotnie.

Gotowi, gdy jesteś

Wybierz miasto. Wybierz rozmiar. Płać kryptowalutą.

Bez formularzy o tym, kim jesteś, bez czekania na akceptację człowieka, bez telefonu w celu weryfikacji. Faktura zostaje uregulowana, a dane logowania trafiają do Twojej skrzynki.