ошибка конфигурации после обновления nftables

ошибка конфигурации после обновления nftables

Использую 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)

  • ТФТП

    • TFTP использует только UDP

      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опцию (оптимизировать)попытаться сделать это автоматически.

Связанный контент