Рейтинг:1

Проблемы с приоритетом цепочки nftables (nft)

флаг fr

нфт вызывает у меня бесконечные головные боли, независимо от того, как я настраиваю политику, я все равно не могу заставить ее работать.

Концепция, которую я имею в виду:

  • Одна «базовая» цепочка, в которой живут общие правила (например, разрешить ssh и т.д.)
  • Одно или несколько специфичных для приложения правил, в которых действуют специфичные для демона правила (например, цепочка http-серверов).

Я пробовал много разных перестановок правил, но я никогда не мог получить поток трафика «базовый» + демон, я всегда блокировал одно или другое! ;-(

Вот моя текущая (упрощенная) конфигурация (в нынешнем виде она позволяет ssh но не позволяет http)

/etc/nftables.conf:

#!/usr/sbin/nft -f                                                                                                                                                                                                                                              
очистить набор правил                                                                                                                       
таблица инет фильтр {   
     счетчик input_ssh {}     
        установить my_admin_ipv4 {                                                                                                        
                введите ipv4_addr                                                                                                      
                интервал флагов                                                                                                      
                прилавок                                                                                                             
                элементы = {                                                                                                        
                        10.0.0.0/8,                                                                                                 
                        172.16.0.0/12,                                                                                              
                        192.168.0.0/16                                                                                                                                                                                      
                }                                                                                                                   
        }         
       цепочка ввода {
                тип filter фильтр приоритета ввода хука;
                iifname lo accept comment "Разрешить петлевой трафик";
                состояние ct установлено, связанно принять комментарий «Разрешить установленные/связанные соединения»;
                ct state недопустимый комментарий отбрасывания «Запретить недопустимые соединения»;

                # SSH
                tcp dport ssh ip saddr @my_admin_ipv4 имя счетчика input_ssh принять комментарий «Разрешить IPv4 SSH от администратора»;
    падение политики;
        }
        цепочка вперед {
                type filter hook forward Priority 0;
                падение политики;
        }
        выход цепи {
                type приоритет вывода обработчика фильтра 0;
        }
 включить "/etc/nft/*.conf"
}

/etc/nft/http.conf:

счетчик input_http {} 
   цепочка http {
    тип фильтра хука входного приоритета фильтра - 1;
      # HTTP #
      tcp dport {80,443} имя счетчика input_nginx принять комментарий «Разрешить HTTP»;
    политика принять; 
    }
Рейтинг:1
флаг cl
A.B

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

  • каждое правило принятия должно помечать пакет

    Правила, выполняющие явный прием, должны помечать пакет непосредственно перед его принятием. Любое возникновение:

    ... принимать
    

    следует заменить на:

    ... набор метаметок 0xf00 принять
    

    Значение не имеет значения, если оно не равно 0, если нет другой роли для отметки.

  • каждая цепочка должна принимать помеченный пакет, так как это безопасное поведение

    используя это правило в начале цепочки:

    метаметка != 0 принять
    

Это общая идея. Адаптации и исключения все еще могут быть сделаны, если это имеет больше смысла.

Вот пересмотренный набор правил в соответствии с этим подходом. Оценка принимается после ct ... неверный дроп правило, которое является важным правилом, которое не следует обходить (и на самом деле его можно было сделать в более ранней цепочке раз и навсегда, поскольку это правило удаления). Если ниже input является последней цепочкой в ​​хуке filter/input, на самом деле нет необходимости помечать принятые пакеты, но это не помешает.

/etc/nftables.conf::

очистить набор правил 
таблица инет фильтр {   
    счетчик input_ssh {}     
    установить my_admin_ipv4 {                                                                                                        
        введите ipv4_addr                                                                                                      
        интервал флагов                                                                                                      
        прилавок                                                                                                             
        элементы = {                                                                                                        
            10.0.0.0/8,                                                                                                 
            172.16.0.0/12,                                                                                              
            192.168.0.0/16                                                                                                                                                                                      
        }                                                                                                                   
    }         
    цепочка ввода {
        тип filter фильтр приоритета ввода хука; падение политики;
        iifname lo набор метаметок 0x1 принять комментарий «Разрешить петлевой трафик»;
        состояние ct установлено, набор связанных метаметок 0x1 принять комментарий «Разрешить установленные/связанные соединения»;
        ct state недопустимый комментарий отбрасывания «Запретить недопустимые соединения»;
        метаметка != 0 принять

        # SSH
        tcp dport ssh ip saddr @my_admin_ipv4 имя счетчика input_ssh метаметка set 0x1 принять комментарий «Разрешить IPv4 SSH от администратора»;
    }
    цепочка вперед {
        type filter hook forward Priority 0; падение политики;                      
    }
    выход цепи {
        type приоритет вывода обработчика фильтра 0; политика принять;
    }
    включить "/etc/nft/*.conf"
}

/etc/nft/http.conf (заменены counter_nginx с counter_http). метаметка != 0 принять правило, вероятно, здесь не нужно, так как другой цепочки может и не быть раньше, но это тоже не помешает.

    счетчик input_http {} 
    цепочка http {
        тип фильтра хука входного приоритета фильтра - 1; политика принять;
         метаметка != 0 принять
         # HTTP #
         tcp dport {80,443} имя счетчика input_http набор метаметок 0x2 принять комментарий «Разрешить HTTP»;
    }

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

Little Code avatar
флаг fr
Это выглядит интересно, я проверю и дам вам знать.Но один вопрос, я вижу, вы изменили «политику отбрасывания» на «политику принятия» в основном входном фильтре? Конечно, это означает, что все непревзойденное принимается?
A.B avatar
флаг cl
A.B
Опечатка с вырезанием/вставкой (и упрощение первоначального ответа с использованием специальной цепочки «вердикт»). Я поставлю обратно капельку.
Little Code avatar
флаг fr
Ясно, значит, вы говорите, что может быть третья цепочка, в которой нет ничего, кроме `policy drop` и `meta mark != 0 accept`? Я думаю, это, возможно, делает его чище в некотором роде. Я просто загружаю конфиг сейчас, дам вам знать, как это происходит.
Little Code avatar
флаг fr
Хм, похоже, мне не нравится (обновил оригинальный Q новым синтаксисом). SSH работает, но не в Интернете.
Little Code avatar
флаг fr
Интересно, что отсутствующий `set` не был подобран `nft -c -f /etc/nftables.conf`? Но теперь это работает!
A.B avatar
флаг cl
A.B
метаметка — это выражение (эквивалент совпадения iptables), а набор метаметок — оператор (эквивалент цели iptables, за исключением того, что он не является терминалом для правила). Оба действительны.

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

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