Nftables

Матеріал з Wiki Welard
Перейти до навігації Перейти до пошуку

nft DDoS Protection for VPS

1: Drop invalid packets

table ip filter {
  chain prerouting {
    type filter hook prerouting priority 0; policy accept;
    # Це правило видаляє пакети, що мають некоректний стан з'єднання, що визначається модулем `conntrack` як `INVALID`. Такі пакети можуть бути ознакою атаки або помилки в мережі.
    ct state invalid drop comment "Drop invalid packets"
  }
}

2: Drop TCP packets that are new and are not SYN

table ip filter {
  chain prerouting {
    type filter hook prerouting priority 0; policy accept;
    # Це правило видаляє нові TCP пакети, які не мають прапора SYN. Це допомагає захиститися від певних типів атак, таких як спуфінг TCP з'єднань.
    tcp flags & (syn | ack | fin | rst) != syn ct state new drop comment "Drop TCP packets that are new and are not SYN"
  }
}

3: Drop SYN packets with suspicious MSS value

table ip filter {
  chain prerouting {
    type filter hook prerouting priority 0; policy accept;
    # Це правило видаляє нові SYN пакети з підозрілим значенням MSS (Maximum Segment Size). Це захист від деяких видів атак, які використовують некоректні MSS значення.
    tcp flags syn ct state new tcp option maxseg size != 536-65535 drop comment "Drop SYN packets with suspicious MSS value"
  }
}

4: Block packets with bogus TCP flags

table ip filter {
  chain prerouting {
    type filter hook prerouting priority 0; policy accept;
    # Цей набір правил видаляє TCP пакети з некоректними або підозрілими комбінаціями прапорів, що допомагає захиститися від різних типів атак.
    tcp flags fin,syn,rst,psh,ack,urg == 0x00 drop comment "Block packets with bogus TCP flags"
    tcp flags fin,syn == fin,syn drop
    tcp flags syn,rst == syn,rst drop
    tcp flags syn,fin == syn,fin drop
    tcp flags fin,rst == fin,rst drop
    tcp flags fin,ack == fin drop
    tcp flags ack,urg == urg drop
    tcp flags ack,fin == fin drop
    tcp flags ack,psh == psh drop
    tcp flags all == all drop
    tcp flags all == 0x00 drop
    tcp flags all == fin,psh,urg drop
    tcp flags all == syn,fin,psh,urg drop
    tcp flags all == syn,rst,ack,fin,urg drop
  }
}

5: Block spoofed packets

table ip filter {
  chain prerouting {
    type filter hook prerouting priority 0; policy accept;
    # Цей набір правил видаляє пакети з підробленими IP-адресами, які не повинні з'являтися в Інтернеті. Це допомагає захиститися від IP-спуфінгу.
    ip saddr 224.0.0.0/3 drop comment "Block spoofed packets"
    ip saddr 169.254.0.0/16 drop
    ip saddr 172.16.0.0/12 drop
    ip saddr 192.0.2.0/24 drop
    ip saddr 192.168.0.0/16 drop
    ip saddr 10.0.0.0/8 drop
    ip saddr 0.0.0.0/8 drop
    ip saddr 240.0.0.0/5 drop
    ip saddr 127.0.0.0/8 ip daddr != 127.0.0.0/8 drop
  }
}

6: Drop ICMP (you usually don't need this protocol)

table ip filter {
  chain prerouting {
    type filter hook prerouting priority 0; policy accept;
    # Це правило видаляє всі ICMP пакети. Хоча це може допомогти зменшити поверхню атаки, варто бути обережним, оскільки ICMP використовується для важливих мережевих функцій, таких як діагностика.
    ip protocol icmp drop comment "Drop ICMP"
  }
}

7: Drop fragments in all chains

table ip filter {
  chain prerouting {
    type filter hook prerouting priority 0; policy accept;
    # Це правило видаляє фрагментовані пакети. Фрагментація іноді використовується в атаках для обходу фільтрації пакетів.
    ip frag-off & 0x1fff != 0 drop comment "Drop fragments in all chains"
  }
}

8: Limit connections per source IP

table ip filter {
  chain input {
    type filter hook input priority 0; policy accept;
    # Це правило обмежує кількість з'єднань з однієї IP-адреси до 111. Це допомагає захиститися від DoS-атак.
    ip protocol tcp ct count over 111 reject with tcp reset comment "Limit connections per source IP"
  }
}

9: Limit RST packets

table ip filter {
  chain input {
    type filter hook input priority 0; policy accept;
    # Ці правила обмежують кількість RST пакетів, що можуть бути відправлені за секунду. Це захищає від RST-флуду, який може розривати TCP-з'єднання.
    limit rate 2/second burst 2 tcp flags rst accept comment "Limit RST packets"
    tcp flags rst drop
  }
}

10: Limit new TCP connections per second per source IP

table ip filter {
  chain input {
    type filter hook input priority 0; policy accept;
    # Ці правила обмежують кількість нових TCP-з'єднань, які можуть бути встановлені за секунду з однієї IP-адреси. Це допомагає захиститися від спроб перевантаження сервера новими з'єднаннями.
    limit rate 60/second burst 20 tcp flags syn ct state new accept comment "Limit new TCP connections per second per source IP"
    tcp flags syn ct state new drop
  }
}

11: Use SYNPROXY on all ports (disables connection limiting rule)

table ip filter {
  chain raw_prerouting {
    type filter hook prerouting priority -300; policy accept;
    # Ці правила використовують SYNPROXY для захисту від SYN-флуду. SYNPROXY обробляє SYN-запити перед передачею їх на сервер.
    tcp flags syn ct state new synproxy
  }
  chain input {
    type filter hook input priority 0; policy accept;
    # Це правило видаляє пакети, що мають некоректний стан з'єднання, що визначається модулем `conntrack` як `INVALID`. Такі пакети можуть бути ознакою атаки або помилки в мережі.
    ct state invalid drop comment "Drop invalid packets"
  }
}

SSH brute-force protection

table ip filter {
  chain input {
    type filter hook input priority 0; policy accept;
    # Ці правила захищають від грубої сили атаки на SSH, обмежуючи кількість нових з'єднань до 10 за 60 секунд.
    tcp dport ssh ct state new recent name ssh_brute force set
    tcp dport ssh ct state new recent name ssh_brute force update seconds 60 hitcount 10 drop comment "SSH brute-force protection"
  }
}

Protection against port scanning

table ip filter {
  chain port_scanning {
    type filter hook input priority 0; policy accept;
    # Ці правила захищають від сканування портів, обмежуючи кількість RST пакетів.
    tcp flags rst limit rate 1/second burst 2 return comment "Protection against port scanning"
    drop
  }
  chain input {
    type filter hook input priority 0; policy accept;
    jump port_scanning
  }
}