Базовая настройка брандмауэра Debian GNU/Linux 10 Buster с помощью nftables
Источник: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.
Чтобы отказаться от использования режима совместимости и синтаксиса iptables, мы можем использовать родной для nftables инструмент nft. Для этого установим пакет nftables.
# apt-get install nftables
После установки посмотрим на то, какая конфигурация правил nftables используется по умолчанию
# cat /etc/nftables.conf
Как видим, у нас уже описана таблица с именем "filter" семейства inet, предоставляющим возможность использовать правила IPv4/IPv6. В этой таблице созданы три цепочки с хуками netfilter типа input, forward, output. Правила в этих цепочках отсутствуют.
Настраиваем автоматический запуск службы, отвечающей за активацию правил nftables, затем запускаем эту службу:
# systemctl enable nftables
# systemctl start nftables
# systemctl status nftables
Теперь можно переходить к управлению правилами 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\"
Простейший вариант настройки правил 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