брандмауэр: правила счетчика nftable

netid=(10 20 30 40)

for i in "${netid[@]}"; do
    out="iptables -I FORWARD -s 192.168.$i.0/24 -d "

    for j in "${netid[@]}"; do
        (( i == j )) && continue
        out+="192.168.$j.0/24,"
    done
    out="${out%,} -j DROP"

    printf '%s\n' "$out"
done

Этот сценарий Bash создает

iptables -I FORWARD -s 192.168.10.0/24 -d 192.168.20.0/24,192.168.30.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.20.0/24 -d 192.168.10.0/24,192.168.30.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.30.0/24 -d 192.168.10.0/24,192.168.20.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.40.0/24 -d 192.168.10.0/24,192.168.20.0/24,192.168.30.0/24 -j DROP

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

Если у вас есть строка в $out, вы можете evalее.

В качестве альтернативы, чтобы избежатьeval:

netid=(10 20 30 40)

for i in "${netid[@]}"; do
    sarg="192.168.$i.0/24"
    darg=""

    for j in "${netid[@]}"; do
        (( i == j )) && continue
        darg+="192.168.$j.0/24,"
    done
    darg="${darg%,}"

    iptables -I FORWARD -s "$sarg" -d "$darg" -j DROP
done

Подстановка переменной ${parameter%word}удалит wordиз самого конца $parameter, поэтому darg="${darg%,}"удалит запятую в конце af $darg.


Обновление после вопроса в комментарии:

Единственное, чтоbash-специфично в вышеизложенном, это использование массива $netid, оператора +=для добавления к строке $dargи ((...)). Мы можем превратить это в shскрипт, подобный этому (здесь, предполагая, что $IFSпо-прежнему имеет значение по умолчанию):

netid="10 20 30 40"

for i in $netid; do
    sarg="192.168.$i.0/24"
    darg=""

    for j in $netid; do
        [ "$i" -eq "$j" ] && continue
        darg="${darg}192.168.$j.0/24,"
    done
    darg="${darg%,}"

    iptables -I FORWARD -s "$sarg" -d "$darg" -j DROP
done

Если у вас есть отдельный список номеров, которые вы хотите подставить для $darg, используйте его во внутреннем цикле вместо $netid. Это должна быть строка чисел, разделенных пробелом -.

1
12.12.2019, 03:23
1 ответ

Нет, объяснение намного проще :операторcounterимеет необязательные аргументы пакеты и байты , которые отображают количество пакетов и байтов, подсчитанных счетчик, когда пакет достиг правила, где он находился. Таким образом, без фильтра перед счетчиком любой пакет (, в том числе по шлейфу ), будет увеличивать значения, поэтому это может произойти очень рано и быстро. Инструмент, выполняющий преобразование, увидел счетчик по умолчанию iptables и решил также перевести его значения для точности.

Так что обычно, когда вы пишете правило, вы не устанавливаете эти значения, вы ставите один простой counter, и они оба получают по умолчанию 0. Когда пакеты проходят через это значение, эти значения увеличиваются. Дополнительно , особенно при использовании в именованном счетчике объекте с состоянием , где его можно даже отобразить -и -сбросить (с помощью чего-то вроде nft reset counters), чтобы сделать некоторые форма учета, эти значения можно установить при записи набора правил :, обычно при восстановлении набора правил, сохраненного непосредственно перед перезагрузкой. Этот можно сбросить только в том случае, если он используется как именованный вариант , а не как «встроенный» анонимный счетчик. Их нельзя использовать для изменения совпадения в правиле, нет другого варианта , кроме их отображения.

Любая ваша проблема с Wi-Fi не может быть вызвана каким-либо оператором счетчика .

Если теперь вы хотите использовать количество пакетов для ограничения использования правил в брандмауэре nftables, существует несколько различных методов в зависимости от потребностей:

  • другой объект с состояниемquota(снова, который можно использовать анонимно, но можно сбросить, только если он используется с именем). Затем вы можете, например, правило никогда не совпадать или начать совпадать в зависимости от его количества.

  • есть операторlimitдля подсчета ставок . Например, если вы опасаетесь, что правило журнала может затопить файлы журнала, вы можете использовать это, чтобы ограничить количество выполняемых журналов. Он также может ограничить скорость некоторым ресурсом (, обычно используемым с другими фильтрами с conntrack ).

  • с достаточно новой nftables (0.9.2? )и ядро ​​(4.18? ), есть ct countвыражение conntrack для подсчета количества установленных соединений с использованием conntrack, обычно для ограничения одновременного доступа к какому-либо ресурсу (ssh, веб-сервер...)

2
27.01.2020, 23:40

Теги

Похожие вопросы