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

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

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

Установка nftables

В 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

Управление 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\"

Дополнительная информация: