Рейтинг:1

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

флаг ph

Я использовал nftables в течение последних 2 лет с той же конфигурацией, обновил программу на днях, и теперь она жалуется, что моя конфигурация недействительна, хотя вся документация по-прежнему говорит, что она верна. может быть, кто-то может найти мошеннический символ или что-то в этом роде?

вот мой конфиг:


очистить набор правил

# `inet` применяется как к IPv4, так и к IPv6.
таблица инет фильтр {
    цепочка ввода {
        введите приоритет ввода хука фильтра 0;

        # принимаем любой локальный трафик
        если принять

        # без пинг-флуда:
        ip протокол icmp тип icmp ограничение эхо-запроса скорость более 10/секунду всплеск 4 пакета отбрасываются
        ip6 nexthdr icmpv6 тип icmpv6 ограничение скорости эхо-запроса более 10/секунду всплеск 4 пакета отбрасываются

        # принимаем исходящий от нас трафик
        состояние ct установлено, связанное с принятием

        # сш
        tcp dport 22 принять

        # http/https
        tcp dport 80 принять
        TCP-порт 443 принять

        # tftp/netboot
        udp dport 4011 принять
        udp dport 67 принять
        TCP-порт 69 принять
        udp dport 69 принять

        # листинатор
        TCP-порт 8080 принять
        TCP-порт 4343 принять

        # кто-то
        TCP-порт 139 принять
        TCP-порт 445 принять
        udp dport 137 принять
        udp dport 138 принять

        # мс
        TCP-порт 25565 принять

        # считаем и отбрасываем любой другой трафик
        встречное падение
    }

    выход цепи {
        type приоритет вывода обработчика фильтра 0;
        политика принять;
    }

    цепочка вперед {
        type filter hook forward Priority 0;
        nft добавить правило inet filter forward ct status dnat accept;
        падение политики;
    }
}

и ошибка при запуске:

Запуск nftables...
/etc/nftables.conf:57:6-8: Ошибка: синтаксическая ошибка, неожиданное добавление
        nft добавить правило inet filter forward ct status dnat accept;
            ^^^
nftables.service: основной процесс завершен, код = завершен, статус = 1/FAILURE
nftables.service: ошибка с результатом «код выхода».
Не удалось запустить nftables.
Рейтинг:0
флаг cl
A.B

Это внутри nftables сценарий загружается с помощью команды нфт -ф. нфт слово не имеет смысла внутри и не должно появляться. Но есть 1 1/2 других проблем в том же месте. Итак, давайте посмотрим:

Вокруг линии нфт команда жалуется, что есть:

   цепочка вперед {
       type filter hook forward Priority 0;
       nft добавить правило inet filter forward ct status dnat accept;
       падение политики;
   }
  • нфт быть удалены,

  • уже внутри инет фильтр вперед (цепной блок

    Так добавить правило инет фильтр вперед также должны быть удалены. На самом деле ; является излишним, потому что после него идет новая строка.

           кт статус днат принять
    
  • падение политики; должен быть помещен с определением базовой цепи

    На этот раз с обязательным ; часть синтаксиса. в политика ключевое слово является частью цепь определение, не часть правило определение. Хотя в настоящее время это кажется принятым, отделенным от определения базовой цепочки правилами между ними, на это нельзя полагаться: это может измениться в более позднем выпуске.

    То же замечание относится и к вывод цепь: не разделять политика принять; из его определения базовой цепочки, поэтому вы не будете вставлять правила между ними по ошибке позже.

вперед chain в конце следует заменить на:

    цепочка вперед {
        type filter hook forward Priority 0; падение политики;
        кт статус днат принять
    }

Что было бы правильным синтаксисом, но не очень интересным, так это определить правило не внутри блоков, а полностью вне структур, в конце скрипта вот так:

    цепочка вперед {
        type filter hook forward Priority 0; падение политики;
    }
}
добавить правило inet filter forward ct status dnat accept

Тем не мение набор правил списка nft затем отобразит его обратно, как и раньше, в инет фильтр вперед цепной блок.


Примечания:

  • пока можно использовать ip-протокол icmp, это не нормально использовать ip6 nexthdr ipv6-icmp

    причина в том, что в отличие от IPv4, где протокол в заголовке IPv4 всегда является протоколом уровня 4, протокол IPv6 следующий заголовок не всегда является заголовком уровня 4 (icmp, udp, tcp...): вместо этого может быть Заголовок расширения появляется между заголовком IPv6 и заголовком уровня 4 (последний). В этом случае правило не будет совпадать.

    ОС уже определила, к какому протоколу уровня 4 принадлежит этот пакет, поэтому информация доступна в виде метаинформации, а не информации о содержимом пакета: мета l4proto ipv6-icmp.

    Это тоже задокументировано на странице руководства:

    Это выражение относится к полям заголовка ipv6. Осторожность при использовании ip6 некстхдр, значение относится только к следующему заголовку, т.е. ip6 некстхдр tcp будет соответствовать только в том случае, если пакет ipv6 не содержит заголовки расширения. Пакеты, которые фрагментированы или, например, содержать заголовки расширения маршрутизации не будут сопоставляться. Пожалуйста, используйте мета l4proto если вы хотите сопоставить реальный транспортный заголовок и игнорировать любые вместо этого дополнительные заголовки расширения.

    Но на самом деле, поскольку в той же строке есть тип icmpv6... строка, это уже фильтрует протокол уровня 4, чтобы он соответствовал ICMPv6, и в то же время использование ICMPv6 неявно устанавливает протокол уровня 3 для соответствия IPv6: вообще ничего не нужно, чтобы сделать это правильно.

    Точно так же предыдущая строка может обойтись без ip-протокол icmp по тем же причинам (но его текущее поведение все еще в порядке).

    Линия:

            ip6 nexthdr icmpv6 тип icmpv6 ограничение скорости эхо-запроса более 10/секунду всплеск 4 пакета отбрасываются
    

    необходимо заменить просто на:

            icmpv6 тип ограничения скорости эхо-запроса более 10 пакетов в секунду 4 пакета отбрасываются
    

    (без необходимости предварять мета nfproto ipv6 мета l4proto icmpv6 )

  • TFTP

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

      TCP-порт 69 никогда не используется, поэтому для его разрешения не требуется правило.

    • TFTP и межсетевой экран с отслеживанием состояния

      TFTP это протокол столь же сложный, как FTP для брандмауэров. После первоначального запроса сама передача данных больше нигде не использует UDP-порт 69. Адекватное использование Помощник по подключению к TFTP с дополнительными правилами (которые должны автоматически загружать nf_conntrack_tftp модуль ядра), вероятно, должен быть необходим, если только не используется устаревшая настройка sysctl. net.netfilter.nf_conntrack_helper был включен обратно.

      Это действительно стало бы не по теме, чтобы обсудить это здесь. Смотрите начало (только) моего ответа на CentOS 8 в качестве маршрутизатора NAT с nft и firewalld — как заставить его проходить TFTP? иметь пример набора правил TFTP, который можно скопировать для замены Пример FTP в вики nftables.

  • идентичные правила с разными значениями портов могут быть факторизованы с помощью анонимные наборы. nftables версия >= 1.0.2 даже имеет (оптимизировать) вариант чтобы попытаться сделать это автоматически.

PetNoire avatar
флаг ph
так почему он работал отлично за день до публикации. также ничего себе, самый подробный ответ, который я когда-либо получал здесь, я нажал стрелку вверх, если этот сайт позволит мне что-то сделать
A.B avatar
флаг cl
A.B
@PetNoire Не могу сказать, что было раньше, но сказал, что нужно сделать. Если вы считаете, что это решило вашу проблему, вы все равно можете отметить этот ответ как принятый ответ, чтобы поблагодарить меня.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.