Участник:Petr-akhlamov/Firewall new start

Материал из ALT Linux Wiki
Примечание: Обратите внимание, что это не официальная документация, а попытка начинающего админа объяснить материал начинающим админам.

Сетевой экран nftables

nftables — это современная утилита командной строки (команда nft), используемая для управления встроенным брандмауэром netfilter, доступным в ядре Linux, начиная с версии 3.13. nftables приходит на смену устаревшему iptables и предоставляет единый интерфейс для фильтрации трафика IPv4, IPv6, ARP и bridge.

Брандмауэр — это приложение, на котором происходит фильтрация сетевого трафика на основе заданных администратором правил.

Схемы

Логика работы брандмауэра
Уровни вложенности

Синтаксис nftables

# nft команда семейство таблица цепочка критерии действие
# nft add rule inet filter input tcp dport 22 accept
  • add rule - команда
  • inet - семейство адресов
  • filter - таблица
  • input - цепочка
  • tcp dport 22 - критерий (выражение)
  • accept - действие (вердикт/statement)

Семейства адресов

nftables содержит шесть семейств адресов:

  • ip — используется для фильтрации трафика IPv4.
  • ip6 — используется для фильтрации трафика IPv6.
  • inet — используется для фильтрации трафика одновременно IPv4 и IPv6.
  • arp — используется для фильтрации трафика ARP.
  • bridge — используется для фильтрации трафика на уровне bridge.
  • netdev — используется для фильтрации трафика на уровне сетевого интерфейса (ingress hook).

Скорее всего, вам потребуются только два из них: inet и ip. Семейство inet позволяет упростить администрирование двойного стека IPv4/IPv6. Остальные семейства используются в сложных конфигурациях и выходят за рамки данной статьи.

Команды

Полный вид Сокращенный вид Описание
add table создать таблицу
add chain создать цепочку
add rule добавить правило в конец указанной цепочки
insert rule вставить правило в начало указанной цепочки (или перед указанной позицией)
delete rule удалить правило с указанным handle
delete chain удалить цепочку
delete table удалить таблицу
list ruleset вывести список всех действующих правил со всех таблиц и цепочек
list table вывести список всех правил в указанной таблице
list chain вывести список всех правил в указанной цепочке
flush chain удалить все правила из указанной цепочки, сохранив саму цепочку
flush ruleset удалить все правила, таблицы и цепочки
flush table удалить все правила и цепочки из указанной таблицы
add set создать именованный набор
add element добавить элемент в набор
-f file прочитать команды из файла
-i интерактивный режим
-n числовой вывод (не преобразовывать IP в имена и порты в названия сервисов)
-a показать handle для всех объектов (для последующего удаления)
--help -h вывести справочную информацию по синтаксису nftables

Цепочки

В отличие от iptables, в nftables нет предопределённых цепочек (INPUT, OUTPUT, FORWARD и т.д.). Вместо этого вы создаёте базовые цепочки с произвольным именем и привязываете их к соответствующему хуку Netfilter. Это позволяет гибко настраивать конфигурацию без замедления работы Netfilter ненужными встроенными цепочками.

Базовая цепочка создаётся с указанием типа, хука и приоритета:

# nft 'add chain inet filter input { type filter hook input priority 0; policy drop; }'

Существует 5 видов хуков:

  • ingress — видит пакеты сразу после того, как они переданы от драйвера сетевой карты, до prerouting (только для семейства netdev и inet).
  • prerouting — предназначена для первичной обработки входящих пакетов, адресованных как непосредственно серверу, так и другим узлам сети.
  • input — для входящих пакетов, отправленных непосредственно этому серверу.
  • forward — для проходящих пакетов, не адресованных этому компьютеру, предназначены для передачи следующему узлу, в случае, если сервер выполняет роль маршрутизатора.
  • output — для пакетов, отправленных с этого сервера.
  • postrouting — здесь оказываются пакеты, предназначенные для передачи на другие узлы сети.

Типы базовых цепочек:

  • filter — используется для фильтрации пакетов (поддерживается семействами arp, bridge, ip, ip6, inet).
  • route — используется для перенаправления пакетов, если изменяется заголовок IP или метка пакета (поддерживается семействами ip, ip6, inet).
  • nat — используется для преобразования сетевых адресов (поддерживается семействами ip, ip6, inet).

Приоритет определяет порядок обработки цепочек, привязанных к одному хуку. Например, цепочки с приоритетами -12, -1, 0, 10 будут обрабатываться именно в таком порядке.

Критерии (выражения)

Полный вид Описание
ip saddr адрес источника пакета IPv4
ip daddr адрес получателя пакета IPv4
ip6 saddr адрес источника пакета IPv6
ip6 daddr адрес получателя пакета IPv6
tcp dport порт получателя пакета TCP
tcp sport порт отправителя пакета TCP
udp dport порт получателя пакета UDP
udp sport порт отправителя пакета UDP
icmp type тип ICMP-пакета
icmpv6 type тип ICMPv6-пакета
ct state состояние соединения (new, established, related, invalid)
iifname имя входящего сетевого интерфейса
oifname имя исходящего сетевого интерфейса
meta mark метка пакета

Правила (действия/вердикты)

Фильтрация пакетов основана на правилах. Каждое правило состоит из нуля или более выражений (критериев) и одного или более действий (statements). Если пакет соответствует всем выражениям, то к нему применяются указанные действия. В отличие от iptables, одно правило nftables может выполнять несколько действий.

  • accept — разрешить дальнейшее прохождение пакета по системе;
  • drop — отбросить пакет без уведомления отправителя;
  • reject — отбросить пакет с уведомлением отправителя (отправкой ICMP-сообщения об ошибке);
  • log — зафиксировать информацию о пакете в файле системного журнала;
  • return — прекращение движения пакета по текущей цепочке и возврат в предыдущую цепочку;
  • jump — перейти к указанной цепочке правил и продолжить выполнение с точки вызова после её завершения;
  • goto — перейти к указанной цепочке правил без возврата;
  • counter — увеличить счётчик пакетов и байт;
  • redirect — перенаправляет пакет на указанный порт в пределах этого же узла, применяется для реализации «прозрачного» прокси;
  • dnat — подменяет адрес получателя в заголовке IP-пакета, основное применение — предоставление доступа к сервисам снаружи, находящимся внутри сети;
  • snat — служит для преобразования сетевых адресов, применимо, когда за сервером находятся машины, которым необходимо предоставить доступ в Интернет, при этом от провайдера имеется статический IP-адрес;
  • masquerade — то же, что и snat, но главное отличие в том, что может использоваться, когда провайдер предоставляет динамический адрес.

Наборы (sets)

nftables предоставляет встроенную инфраструктуру наборов (sets), которая позволяет использовать любые поддерживаемые селекторы для построения наборов. Это позволяет значительно сократить количество правил.

Анонимные наборы

Анонимные наборы привязаны к правилу и удаляются вместе с ним. Они не могут быть изменены после создания.

# nft add rule ip filter output tcp dport { 22, 23 } counter

Именованные наборы

Именованные наборы создаются отдельно и могут быть изменены в любое время.

# nft add set ip filter blackhole { type ipv4_addr; comment "drop all packets from these hosts"; }

# nft add element ip filter blackhole { 192.168.3.4 }

# nft add rule ip filter input ip saddr @blackhole drop

Команды

Общие

  • Вывод всех активных правил:
# nft list ruleset

Или с отображением handle для всех объектов:

# nft -a list ruleset

Удаление

Удалить все правила

# nft flush ruleset

Удалить все правила в конкретной цепочке

# nft flush chain inet filter input

# nft flush chain inet filter output

# nft flush chain inet filter forward

Удалить конкретное правило

Вариант 1

Если Вам нужно удалить конкретное правило из nftables, то сперва следует посмотреть, какие правила уже активны, с отображением handle:

# nft -a list chain inet filter input

Пример вывода:

table inet filter {
    chain input {
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 80 accept # handle 3
        tcp dport 443 accept # handle 4
    }
}

А потом уже удалить конкретное правило по его handle:

# nft delete rule inet filter input handle 3
  • delete rule - удалить правило
  • inet filter input - семейство, таблица, цепочка
  • handle 3 - номер handle правила
Вариант 2

Так же можно сделать так:

# nft -a list ruleset

Выведется таблица со всеми правилами и их handle. Удалить правило можно следующим способом:

# nft delete rule inet filter input handle 3

Сохранение

Постоянное

Чтобы сохранить насовсем все выполненные настройки, выполните следующую команду:

# nft list ruleset > /etc/nftables.conf

Это способ сохранить текущую конфигурацию правил nftables в файл. Данное действие необходимо, чтобы правила не терялись после перезагрузки системы.

Временное

В данном способе, правила записываются в файл и при необходимости подгружаются в nftables.

Как сохранять правила

Если Вам нужно сохранить правило, воспользуйтесь командой:

# nft list ruleset > /etc/nftables.rules
Как восстанавливать правила

Если Вам нужно восстановить правила, то примените команду:

# nft -f /etc/nftables.rules
Внимание! При этом используемые правила удалятся.


Добавление

Запретить принимать трафик (a)

# nft add chain inet filter input { type filter hook input priority 0; policy drop; }
Примечание: Здесь вместо input может быть любая цепочка.

Запретить принимать трафик с конкретного IP (b)

# nft add rule inet filter input ip saddr 172.10.10.1 drop
  • add rule - добавить новое правило
  • ip saddr - адрес-источник
  • drop - действие

Открыть порт (c)

Открыть входящий порт
# nft add rule inet filter input tcp dport 80 accept
  • add rule - добавить новое правило
  • tcp dport - порт назначения
  • accept - действие
Открыть исходящий порт
# nft add rule inet filter output tcp dport 22 accept
  • add rule - добавить новое правило
  • tcp dport - порт назначения
  • accept - действие

Отмена

Разрешить принимать трафик (a)

# nft add chain inet filter input { type filter hook input priority 0; policy accept; }
Примечание: Здесь вместо input может быть любая цепочка.

Разрешить принимать трафик с конкретного IP (b)

# nft add rule inet filter input ip saddr 172.10.10.1 accept
  • add rule - добавить новое правило
  • ip saddr - адрес-источник
  • accept - действие

Закрыть порт (c)

Закрыть входящий порт
# nft add rule inet filter input tcp dport 135 drop
  • add rule - добавить новое правило
  • tcp dport - порт назначения
  • drop - действие
Закрыть исходящий порт

Если Вы хотите заблокировать возможность подключаться по SSH с Вашего сервера к другому хосту или серверу, введите следующую команду:

# nft add rule inet filter output tcp dport 22 drop
  • add rule - добавить новое правило
  • tcp dport - порт назначения
  • drop - действие
Блокировка ICMP (ping)

Если Вам нужно заблокировать запрос ICMP (ping) от и к Вашему серверу, введите следующие команды:

# nft add rule inet filter output icmp type echo-request drop
  • add rule - добавить новое правило
  • icmp type - тип ICMP, а именно ping
  • drop - действие

Чтобы заблокировать входящий ping-запрос, введите следующие команды в терминале:

# nft insert rule inet filter input icmp type echo-request drop

Источники