Одиночная машина
Сотрите текущий набор правил:
sudo nft flush ruleset
Добавьте таблицу:
sudo nft add table inet filter
Добавьте базовые цепочки input, forward и output. Политика для входящих и пересылаемых пакетов должна быть drop. Политика для исходящих пакетов — accept.
sudo nft add chain inet filter input '{ type filter hook input priority 0 ; policy drop ; }'
sudo nft add chain inet filter forward '{ type filter hook forward priority 0 ; policy drop ; }'
sudo nft add chain inet filter output '{ type filter hook output priority 0 ; policy accept ; }'
Добавьте две обычные цепочки, которые будут обрабатывать пакеты протоколов TCP и UDP:
sudo nft add chain inet filter tcp_chain
sudo nft add chain inet filter udp_chain
Разрешите related и established трафик:
sudo nft add rule inet filter input ct state related,established accept
Разрешите трафик на петлевой интерфейс:
sudo nft add rule inet filter input iif lo accept
Заблокируйте invalid трафик:
sudo nft add rule inet filter input ct state invalid drop
Разрешите пакеты ICMP и IGMP:
sudo nft add rule inet filter input meta l4proto ipv6-icmp icmpv6 type '{ destination-unreachable, packet-too-big, time-exceeded, parameter-problem, mld-listener-query, mld-listener-report, mld-listener-reduction, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, ind-neighbor-solicit, ind-neighbor-advert, mld2-listener-report }' accept
sudo nft add rule inet filter input meta l4proto icmp icmp type '{ destination-unreachable, router-solicitation, router-advertisement, time-exceeded, parameter-problem }' accept
sudo nft add rule inet filter input ip protocol igmp accept
Новый UDP-трафик будет передаваться цепочке my_udp_chain:
sudo nft add rule inet filter input meta l4proto udp ct state new jump udp_chain
Новый TCP-трафик будет передаваться цепочке my_tcp_chain:
sudo nft add rule inet filter input 'meta l4proto tcp tcp flags & (fin|syn|rst|ack) == syn ct state new jump tcp_chain'
Заблокировать весь трафик, который не обрабатывается другими правилами:
sudo nft add rule inet filter input meta l4proto udp reject
sudo nft add rule inet filter input meta l4proto tcp reject with tcp reset
sudo nft add rule inet filter input counter reject with icmpx type port-unreachable
В этом месте необходимо выбрать, какие порты будут оставаться открытыми для входящих соединений, обрабатываемых цепочками my_tcp_chain и my_udp_chain. Например, открыть соединения для веб-сервера:
sudo nft add rule inet filter tcp_chain tcp dport 80 accept
Разрешить HTTPS-соединения для веб-сервера на порте 443:
sudo nft add rule inet my_table my_tcp_chain tcp dport 443 accept
Разрешить SSH-трафик на порт 22:
sudo nft add rule inet my_table my_tcp_chain tcp dport 22 accept
Ограничить частоту запросов на SSH до 5 в минуту:
sudo nft add rule inet filter input tcp dport 22 limit rate 5/minute accept
Ограничивает частоту срабатывания правила, например, для защиты от DoS атак:
sudo nft add rule inet filter input limit rate 10/second accept
Определяет протокол (например, TCP, UDP, ICMP) для фильтрации:
sudo nft add rule inet filter input ip protocol icmp accept
Разрешить входящие DNS-запросы:
sudo nft add rule inet filter tcp_chain tcp dport 53 accept
sudo nft add rule inet filter udp_chain udp dport 53 accept
После редактирования конфигурации сохраните файл и загрузите его:
sudo nft -f /etc/nftables.conf
sudo systemctl enable nftables