Использую nftables последние 2 года с одной и той же конфигурацией, на днях обновил программу, и теперь она жалуется, что моя конфигурация недействительна, хотя вся документация по-прежнему утверждает, что она правильная. Может быть, кто-то сможет обнаружить неверный символ или что-то в этом роде?
вот мой конфиг:
flush ruleset
# `inet` applies to both IPv4 and IPv6.
table inet filter {
chain input {
type filter hook input priority 0;
# accept any localhost traffic
iif lo accept
# no 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
# accept traffic originated from us
ct state established,related accept
# ssh
tcp dport 22 accept
# http/https
tcp dport 80 accept
tcp dport 443 accept
# tftp/netboot
udp dport 4011 accept
udp dport 67 accept
tcp dport 69 accept
udp dport 69 accept
# listinator
tcp dport 8080 accept
tcp dport 4343 accept
# smb
tcp dport 139 accept
tcp dport 445 accept
udp dport 137 accept
udp dport 138 accept
# mc
tcp dport 25565 accept
# count and drop any other traffic
counter drop
}
chain output {
type filter hook output priority 0;
policy accept;
}
chain forward {
type filter hook forward priority 0;
nft add rule inet filter forward ct status dnat accept;
policy drop;
}
}
и ошибка при запуске:
Starting nftables...
/etc/nftables.conf:57:6-8: Error: syntax error, unexpected add
nft add rule inet filter forward ct status dnat accept;
^^^
nftables.service: Main process exited, code=exited, status=1/FAILURE
nftables.service: Failed with result 'exit-code'.
Failed to start nftables.
решение1
Это внутриnftables сценарийзагружено командой nft -f
. nft
Слово не имеет смысла внутри и не должно появляться. Но есть 1 1/2 других проблем в том же месте. Давайте посмотрим:
Около строки, nft
на которую жалуется команда, есть:
chain forward { type filter hook forward priority 0; nft add rule inet filter forward ct status dnat accept; policy drop; }
nft
быть удаленным,уже внутри
inet filter forward
(цепного) блокаТак что
add rule inet filter forward
тоже надо убрать. На самом деле;
лишнее, потому что после него новая строка.ct status dnat accept
policy drop;
необходимо поместить в определение базовой цепиНа этот раз с его обязательной
;
частью синтаксиса.policy
Ключевое слово является частьюцепьопределение, не является частьюправилоопределение. Хотя это, по-видимому, в настоящее время принято отдельно от определения базовой цепочки правилами между, на это не стоит полагаться: это может измениться в более позднем выпуске.То же замечание применимо и к
output
цепочке: не отделяйтеpolicy accept;
ее от определения базовой цепочки, чтобы позже по ошибке не вставить между ними правила.
В конечном итоге цепочку forward
следует заменить на:
chain forward {
type filter hook forward priority 0; policy drop;
ct status dnat accept
}
Правильным синтаксисом, хотя и не очень интересным, было бы определение правила не внутри блоков, а полностью за пределами структур, в конце скрипта, например, так:
chain forward {
type filter hook forward priority 0; policy drop;
}
}
add rule inet filter forward ct status dnat accept
В любом случае nft list ruleset
он будет отображаться как и прежде в inet filter forward
цепочке блоков.
Примечания:
хотя это нормально использовать
ip protocol icmp
, это не нормально использоватьip6 nexthdr ipv6-icmp
причина в том, что в отличие от IPv4, где протокол в заголовке IPv4 всегда является протоколом уровня 4, IPv6следующий заголовокне всегда заголовок уровня 4 (icmp, udp, tcp...): вместо этого он может бытьЗаголовок расширенияпоявляющийся между заголовком IPv6 и заголовком уровня 4 (окончательным). В этом случае правило не сработает.
Операционная система уже определила, к какому протоколу 4-го уровня относится этот пакет, поэтому информация доступна в виде метаданных, а не информации о содержимом пакета:
meta l4proto ipv6-icmp
.Это тожедокументировано на странице руководства:
Это выражение относится к полям заголовка ipv6. Будьте осторожны при использовании
ip6 nexthdr
, значение относится только к следующему заголовку, т. е.ip6 nexthdr tcp
будет соответствовать только в том случае, если пакет ipv6 не содержит никаких заголовков расширения. Пакеты, которые фрагментированы или, например, содержат заголовки расширения маршрутизации, не будут соответствовать. Используйте ,meta l4proto
если вы хотите сопоставить реальный заголовок транспорта и игнорировать любые дополнительные заголовки расширения.Но на самом деле, поскольку эта же строка включает
icmpv6 type ...
строку, это уже фильтрует протокол уровня 4 для соответствия ICMPv6, и в то же времяиспользование ICMPv6 неявно устанавливает протокол уровня 3 для соответствия IPv6: для того, чтобы все исправить, вообще ничего не нужно.Аналогично предыдущая строка может обойтись без этого
ip protocol icmp
по тем же причинам (но ее текущее поведение все еще нормально).Линия:
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
необходимо заменить просто на:
icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
(без необходимости добавлять префикс
meta nfproto ipv6 meta l4proto icmpv6
)ТФТП
-
TCP-порт 69 никогда не используется, поэтому не требует правила, разрешающего его использование.
TFTP и межсетевой экран с отслеживанием состояния
ТФТПпротокол, такой же сложный, как FTP для брандмауэров. После первоначального запроса сама передача данных больше нигде не использует порт UDP 69. Адекватное использованиеПомощник TFTP conntrackс дополнительными правилами (которые должны автоматически загружать
nf_conntrack_tftp
модуль ядра), вероятно, должны быть необходимы, если только устаревшая настройка sysctl неnet.netfilter.nf_conntrack_helper
была снова включена.Это действительно стало бы не по теме, если бы я это здесь затрагивал. Смотрите начало (только) моего ответа наCentOS 8 как NAT-маршрутизатор с nft и firewalld — как заставить его передавать TFTP?иметь пример набора правил TFTP, который можно скопировать для заменыПример FTP в вики nftables.
-
идентичные правила с разными значениями портов можно факторизовать с помощьюанонимные наборы.nftables версия >= 1.0.2 даже имеет
-o
опцию (оптимизировать)попытаться сделать это автоматически.