Страница 1 из 1

Базовая настройка брандмауэра Debian GNU/Linux 10 Buster с помощью nftables

Добавлено: 16 янв 2022, 22:57
xor

Источник:https://blog.it-kb.ru/2019/07/25/debian ... -nftables/

Базовая настройка брандмауэра Debian GNU/Linux 10 Buster с помощью nftables

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

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

nftable-01.png

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

# apt-get install nftables

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

# cat /etc/nftables.conf

nftable-02.png
nftable-02.png (10.94 КБ) 861 просмотр

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

Настраиваем автоматический запуск службы, отвечающей за активацию правил nftables, затем запускаем эту службу:

# systemctl enable nftables
# systemctl start nftables
# systemctl status nftables

nftable-03.png

Теперь можно переходить к управлению правилами nftables.

Управление правилами nftables
Управление правилами nftables будем выполнять с помощью утилиты nft.

Посмотреть текущий набор активных правил можно командой:
# nft list ruleset

Очистить правила в цепочке "input" таблицы "filter" можно так:
# nft flush chain inet filter input

Полностью очистить набор активных правил можно командой:
# nft flush ruleset

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

Если нужно, чтобы текущие активные правила nftables попали в стартовую конфигурацию nftables, то достаточно выгрузить их командами типа:
# echo '#!/usr/sbin/nft -f' > /etc/nftables.conf
# echo 'flush ruleset' >> /etc/nftables.conf
# nft list ruleset >> /etc/nftables.conf

То есть внутри конфигурационного файла nftables.conf в первой строке присутствует ссылка на исполняемый файл nft, во второй строке – команда полной очистки текущей конфигурации nftables, а затем идут настроенные нами правила.

Чтобы загрузить в активную конфигурацию nftables набор правил из файла можно выполнить команду типа:
# nft -f /etc/nftables.conf

По аналогии с ранее рассматриваемым iptables, 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 с помощью nft.

Простые примеры правил nftables

Разрешаем ping (сообщения типа echo-request по протоколу ICMP):
# nft add rule filter input icmp type echo-request accept

Разрешаем все пакеты для уже установленных соединений с использованием механизма connection tracking:
# nft add rule filter input ct state established accept

Разрешаем доступ из подсети 192.168.1.0/24 и IP 192.168.0.10 по SSH:
# nft add rule ip filter input ip saddr {192.168.1.0/24, 192.168.0.10} tcp dport 22 accept

Вместо IP в правилах возможно использование доменного имени:
# nft add rule ip filter output ip daddr example.org accept

Запрещаем доступ к 80-му порту:
# nft add rule ip filter input tcp dport 80 drop

Удаляем правило с определённым номером в цепочке "output" таблицы "filter":
# nft delete rule filter output handle 9

Как конвертировать правила iptables

Базовую информацию о конвертации правил можно найти в документе: Moving from iptables to nftables. Можно использовать дополнительные утилиты, такие как iptables-translate и ip6tables-translate, для того чтобы транслировать правила из привычного синтаксиса iptables в новый формат nftables.

Например, команда вида:
# iptables-translate -A INPUT -s 10.1.1.0/24 -i eth0 -p tcp -m state --state NEW -m tcp --dport 22 -m comment --comment "Allow access to SSH-server" -j ACCEPT

вернёт нам указанное в формате iptables правило, транслированное в формат nftables:
nft add rule ip filter INPUT iifname "eth0" ip saddr 10.1.1.0/24 ct state new tcp dport 22 counter accept comment \"Allow access to SSH-server\"

nftable-04.png
nftable-04.png (10.48 КБ) 861 просмотр

Простейший вариант настройки правил nftables

Рассмотрим простейший пример настройки брандмауэра для среднестатистического Linux-сервера в локальной сети предприятия. В рассматриваемом примере настраивается доступ к серверу по протоколу IPv4, а доступ по протоколу IPv6 полностью блокируется. По IPv4 разрешаются входящие подключения по протоколу SSH из сети администраторов (10.1.5.0/24), а также Ping и подключения к веб-серверу из всей сети предприятия (10.1.0.0/13).

Набор команд для наполнения правилами nftables в этом случае может выглядеть примерно следующим образом:
# nft flush ruleset
# nft add table ip FIREWALLIPv4
# nft add chain ip FIREWALLIPv4 INCOMING { type filter hook input priority 0 \; policy drop \; }
# nft add chain ip FIREWALLIPv4 FORWARDING { type filter hook forward priority 0 \; policy drop \; }
# nft add chain ip FIREWALLIPv4 OUTGOING { type filter hook output priority 0 \; policy accept \; }
# nft add rule ip FIREWALLIPv4 INCOMING iifname "lo" counter accept
# nft add rule ip FIREWALLIPv4 INCOMING ct state related,established counter accept
# nft add rule ip FIREWALLIPv4 INCOMING iifname "eth0" ip saddr 10.1.5.0/24 ct state new tcp dport 22 counter accept comment \"Allow access to SSH-server\"
# nft add rule ip FIREWALLIPv4 INCOMING iifname "eth0" ip saddr 10.1.0.0/13 ct state new icmp type echo-request counter accept comment \"Allow ping\"
# nft add rule ip FIREWALLIPv4 INCOMING iifname "eth0" ip saddr 10.1.0.0/13 ct state new tcp dport {80, 443} counter accept comment \"Allow access to Web-server\"
# nft add table ip6 FIREWALLIPv6
# nft add chain ip6 FIREWALLIPv6 INCOMING { type filter hook input priority 0 \; policy drop \; }
# nft add chain ip6 FIREWALLIPv6 FORWARDING { type filter hook forward priority 0 \; policy drop \; }
# nft add chain ip6 FIREWALLIPv6 OUTGOING { type filter hook output priority 0 \; policy accept \; }

Давайте посмотрим, что у нас в итоге получилось в активной конфигурации nftables.
# nft list ruleset

В нашем случае вывод конфигурации будет выглядеть следующим образом:

Код: Выделить всё

table ip FIREWALLIPv4 {
        chain INCOMING {
                type filter hook input priority 0; policy drop;
                iifname "lo" counter packets 0 bytes 0 accept
                ct state established,related counter packets 122 bytes 9200 accept
                iifname "eth0" ip saddr 10.1.5.0/24 ct state new tcp dport ssh counter packets 0 bytes 0 accept comment "Allow access to SSH-server"
                iifname "eth0" ip saddr 10.1.0.0/13 ct state new icmp type echo-request counter packets 0 bytes 0 accept comment "Allow ping"
                iifname "eth0" ip saddr 10.1.0.0/13 ct state new tcp dport { http, https } counter packets 0 bytes 0 accept comment "Allow access to Web-server"
        }

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

        chain OUTGOING {
                type filter hook output priority 0; policy accept;
        }
}
table ip6 FIREWALLIPv6 {
        chain INCOMING {
                type filter hook input priority 0; policy drop;
        }

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

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

Теперь, чтобы сохранить активную конфигурацию в стартовую, достаточно перенаправить вывод команды в конфигурационный файл службы nftables.service.

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