Настройка nftables в Debian 10 Buster. Переход с iptables

Настройка nftables в Debian 10 Buster. Переход с iptables

В Debian 10 Buster по умолчанию реализован новый механизм управления брандмауэром Linux Netfilter, который представлен в виде фреймворка nftables. Следовательно, Nftables может рассматриваться, как современная, более продвинутая и безусловно функциональная замена таким инструментам, как iptablesip6tablesarptables и ebtables. Итак, в данной статье рассматривается настройка nftables в Debian 10.

Установка nftables в Debian 10

Разумеется в Debian 10 Buster по прежнему работает утилита iptables, но на самом деле она работает через фреймворк nftables в режиме совместимости. При этом синтаксис управления iptables сохранился, но как видим уже ссылается на iptables-nft.

nftables debian 10

Чтобы отказаться от режима совместимости и синтаксиса iptables, возможно использовать инструмент nft для nftables. Для этого его необходимо установить:

apt-get install nftables

После установки посмотрим конфигурацию nftables по умолчанию:

cat /etc/nftables.conf

nftables Debian 10

Как видно, создана таблица с именем “filter” семейства inet, для использования правил IPv4/IPv6. В этой таблице созданы три цепочки с хуками netfilter типа inputforwardoutput. Правила в этих цепочках отсутствуют.

Далее, необходимо настроить служба и автоматический старт:

systemctl enable nftables
systemctl start nftables
systemctl status nftables

nftables Debian 10

Установка и запуск завершены. Следовательно можно перейти к управлению правилами nftables.

Управления правилами nftables в Debian 10

Прежде всего, управление nftables осуществляется с помощью утилиты nft. Посмотреть текущий набор правил:

nft list ruleset

Более того, очистить правила nftables в цепочке INPUT таблицы filter выполняется командой:

nft flush chain inet filter input

Подобным образом можно полностью очистить правила nftables:

nft flush ruleset

При старте системы правила загружаются из файла /etc/nftables.conf. Поэтому чтобы активные правила попали в стартовую конфигурацию, их необходимо сохранить в файл одной из следующих команд:

echo '#!/usr/sbin/nft -f' > /etc/nftables.conf
echo 'flush ruleset' >> /etc/nftables.conf
nft list ruleset >> /etc/nftables.conf

Далее, для загрузки в активную конфигурацию правил из файла, необходимо выполнить команду:

nft -f /etc/nftables.conf

Nftables обрабатывает пакеты на основании правил (Rules), которые сгруппированы в цепочки (Chains). Между тем, цепочки в свою очередь хранятся в таблицах (Tables). Формирование правил осуществляются при помощи следующего синтаксиса:

nft add rule [<family>] <table> <chain> <matches> <statements>
nft insert rule [<family>] <table> <chain> [position <position>] <matches> <statements>
nft replace rule [<family>] <table> <chain> [handle <handle>] <matches> <statements>
nft delete rule [<family>] <table> <chain> [handle <handle>]

Где:

  • family – определяет семейство одним из типов: ip, ip6, arp, bridge, inet, netdev. Описание: #Nftables_families;
  • table – указывает на имя таблицы соответствующего семейства <family>;
  • chain – определяет имя цепочки в соответствующей таблице <table>;
  • position – номер правила в цепочке <chain>, перед которым будет вставлено добавляемое правило;
  • handle – номер правила в цепочке <chain>, которое будет заменено/удалено;
  • matches – правило фильтрации пакетов в форматах, описанных в #Matches;
  • statements – действие, предпринимаемое с пакетами, подпадающими под правило <matches>. Допускаемые варианты:#Statements

Примеры правил nftables

К примеру, рассмотрим, как настроить nftables для работы с Asterisk. Прежде всего, отредактируем файл /etc/nftables.conf:

#!/usr/sbin/nft -f

flush ruleset

include "/etc/nftables/defines.nft"

table inet filter {
            chain input {
                                    type filter hook input priority 0; policy accept;
                                    ct state invalid counter drop comment "INVALID PACKET DROP"
                                    
# Разрешаем любой трафик от нас
                                    ct state {related,established} counter accept comment "RELATED CONNECTIONC ACCEPT"

                                    # Разрешаем любой трафик с localhost
                                    iif lo accept comment "LOOPBACK ACCEPT"
                                    iif != lo ip daddr 127.0.0.1/8 counter drop comment "DROP CONNECTIONC TO LOOPBACK NOT COMING FROM LOOPBACK"
                                    iif != lo ip6 daddr ::1/128 counter drop comment "DROP CONNECTIONC TO LOOPBACK NOT COMING FROM LOOPBACK"
                                    
                                    # Запрещаем ping floods
                                    ip protocol icmp icmp type echo-request limit rate over 10/second burst 4 packets  drop
                                    ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
                                    
                                    # Разрешаем ICMP & IGMP
                                    ip6 nexthdr icmpv6 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
                                    ip protocol icmp icmp type { destination-unreachable, router-solicitation, router-advertisement, time-exceeded, parameter-problem } accept
                                    ip protocol igmp accept
                                    
                                    # Избегаем brute force на SSH
                                    tcp dport ssh ct state new limit rate 15/minute accept
                                    
                                    # Сохраняем данные в лог
                                    log
                                    
                                    ct state new tcp flags & (fin|syn|rst|ack) != syn counter drop
                                    ct state invalid,new tcp flags & (syn|ack) == syn|ack counter reject with tcp reset

                                    # Создадим цепочку VOIP_ACCESS, для которой разрешим указанные порты и доступ к ним
                                    ct state new tcp dport 22 counter jump VOIP_ACCESS
                                    ct state new tcp dport 53 counter jump VOIP_ACCESS
                                    ct state new tcp dport 123 counter jump VOIP_ACCESS
                                    ct state new tcp dport 80,443 counter jump VOIP_ACCESS
                                    ct state new tcp dport 3306 counter jump VOIP_ACCESS
                                    ct state new udp dport 5060 counter jump VOIP_ACCESS
                                    
                                    # Блокируем недействительные подключения
                                    limit rate 5/minute burst 5 packets counter log prefix "DROPPED: " level debug
                                    tcp flags & (fin|syn|rst|ack) == syn limit rate 1/second burst 5 packets counter accept
                                    tcp flags & (fin|syn|rst|ack) == syn counter drop

            }
            chain forward {
                                    type filter hook forward priority 0; policy drop;
                                    counter log
    }
            chain output {
                                    type filter hook output priority 0; policy accept;
                                    counter comment "COUNT ACCEPTED PACKETS"
    }
                                    # Цепочка VOIP_ACCESS, в которой разрешаем с каких IP или CIDR разрешен доступ до портов в цепочке INPUT
            chain VTC_ACCESS {
                                    ip saddr 192.168.0.0/16 accept
                                    ip saddr 10.150.80.0/24 accept
                                    limit rate 2/minute burst 5 packets counter log prefix "DROPPED: " level debug
                                    counter drop
            }
}
# Таблица, в которую fail2ban будет добавлять заблокированные IP адреса
table inet fail2ban {
                        chain input {
                                    type filter hook input priority 100;
                        }

}

Далее загрузим правила в активную конфигурацию:

nft list ruleset >> /etc/nftables.conf

Переход с iptables на nftables в Debian 10

Кроме того, для конвертации правил из iptables в nftables существует дополнительная утилита iptables-translate, также позволяющая переписать правила в nftables.

Например, выполнение команды:

iptables-translate -A INPUT -s 192.168.1.0/24 -i eth0 -p tcp -m state --state NEW -m tcp --dport 22 -m comment --comment "Allow to SSH-server" -j ACCEPT

Как следствие, создаст правило для nftables:

nft add rule ip filter INPUT iifname "eth0" ip saddr 192.168.1.0/24 ct state new  tcp dport 22 counter accept comment \"Allow to SSH-server\"

Настройка nftables в Debian 10 (Buster) окончена. В заключении, дополнительная информация по nftables в Debian 10:


Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.