Выпуск пакетного фильтра nftables 0.9.7
29 октября 2020 года
Опубликован выпуск пакетного фильтра nftables 0.9.7, развивающегося в качестве замены iptables, ip6table, arptables и ebtables за счёт унификации интерфейсов фильтрации пакетов для IPv4, IPv6, ARP и сетевых мостов. В пакет nftables входят компоненты пакетного фильтра, работающие в пространстве пользователя, в то время как на уровне ядра работу обеспечивает подсистема nf_tables, входящая в состав ядра Linux начиная с выпуска 3.13. Необходимые для работы выпуска nftables 0.9.7 изменения включены в состав ядра Linux 5.10-rc1.
На уровне ядра предоставляется лишь общий интерфейс, не зависящий от конкретного протокола и предоставляющий базовые функции извлечения данных из пакетов, выполнения операций с данными и управления потоком. Непосредственно правила фильтрации и специфичные для протоколов обработчики компилируются в байткод в пространстве пользователя, после чего данный байткод загружается в ядро при помощи интерфейса Netlink и выполняется в ядре в специальной виртуальной машине, напоминающей BPF (Berkeley Packet Filters). Подобный подход позволяет значительно сократить размер кода фильтрации, работающего на уровне ядра и вынести все функции разбора правил и логики работы с протоколами в пространство пользователя.
Основные новшества:
- Поддержка неявных (анонимных) цепочек, которые создаются динамически. При удалении связанного с анонимной цепочкой правила автоматически удаляется и сама цепочка. Например, теперь можно группировать правила без необходимости отдельного определения цепочек: table inet x { chain y { type filter hook input priority 0; tcp dport 22 jump { ip saddr { 127.0.0.0/8, 172.23.0.0/16, 192.168.13.0/24 } accept ip6 saddr ::1/128 accept; } } }
- Поддержка цепочек "ingress" для семейства протоколов inet (охватывает сразу IPv4 и IPv6), позволяющих фильтровать пакеты IPv4 и IPv6 на том же уровне, что ingress-обработчик в цепочке netdev (hook ingress), т.е. на стадии когда драйвер передаёт пакет сетевому стеку ядра. Для использования ingress-цепочек требуется ядро 5.10-rc1, в котором появились необходимые обработчики. Предоставленная возможность позволяет использовать общие set- и map-списки с цепочками prerouting, input, forward, output и postrouting, например: table inet filter { chain ingress { type filter hook ingress device "veth0" priority filter; policy \\accept; } chain input { type filter hook input priority filter; policy accept; } chain forward { type filter hook forward priority filter; policy accept; } }
- Добавлена возможность отклонения пакетов на стадии до проверки маршрутизации - выражение REJECT теперь может использоваться не только в цепочках INPUT, FORWARD и OUTPUT, но и на стадии PREROUTING: table inet x { chain y { type filter hook prerouting priority 0; policy accept; tcp dport 22 reject with tcp reset } }
- Добавлен режим сокращённого выводе в формате JSON, активируемый при указании опции "--terse": nft --terse -j list ruleset
- При выводе в JSON ("-j") обеспечено отображение значений счётчиков для set-списков: nft -j list set
- Добавлена возможность сброса счётчиков командой "reset" вместе с выводом в формате JSON: nft -j reset counters
- Предоставления возможность сопоставления слушающих сокетов по маске (socket wildcard): table inet x { chain y { type filter hook prerouting priority -150; policy accept; socket transparent 1 socket wildcard 0 mark set 0x00000001 } }
- Добавлена возможность извлечения элементов map-списка: nft get element inet filter test "{ 18.51.100.17 . ad:c1:ac:c0:ce:c0 . 3761 : 0x42 }" table inet filter { map test { type ipv4_addr . ether_addr . inet_service : mark flags interval,timeout elements = { 18.51.100.17 . ad:c1:ac:c0:ce:c0 . 3761 : 0x00000042 } } }
- Добавлена поддержка комментариев в set-списках, таблицах и stateful-объектах (квоты, ограничения, счётчики): table ip x { set s { type ipv4_addr; comment "list of unwanted traffic by IP address" elements = { 1.1.1.1, 1.2.3.4 } } }
- Реализована возможность определения пустых set-списков в переменных: define BASE_ALLOWED_INCOMING_TCP_PORTS = {22, 80, 443} define EXTRA_ALLOWED_INCOMING_TCP_PORTS = {} table inet x { chain y { type filter hook input priority 0; policy drop; ct state new tcp dport { $BASE_ALLOWED_INCOMING_TCP_PORTS, $EXTRA_ALLOWED_INCOMING_TCP_PORTS } counter accept } }
- Предоставлена возможность использования переменных в строках, определяющих префикс записей в логе: define foo= "state" define bar = "match" table x { chain y { ct state invalid log prefix "invalid $foo $bar:" } }
- Предоставлена возможность использования переменных определения цепочек и flowtable: define if_main = lo table netdev x { chain y { type filter hook ingress device $if_main priority -500; policy accept; } }
- Разрешено указание отрицательных значений в переменных: define post = -10 define for = "filter - 100" table inet global { chain forward { type filter hook prerouting priority $for policy accept } chain postrouting { type filter hook postrouting priority $post policy accept } }
- Улучшена пометка ошибок в выражениях. Например, при отсутствии цепочки будет подсвечено проблемное имя: # nft add rule x y jump test Error: Could not process rule: No such file or directory add rule x y jump test ^^^^
- Реализована поддержка трансляции адресов (NAT) для SCTP, не учитывающая состояние соединения (stateless).
Источники
правитьЛюбой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.